mirror of
				https://gitea.com/actions/setup-python.git
				synced 2025-10-31 09:08:07 +07:00 
			
		
		
		
	Merge pull request #35 from actions/konradpabjan/ncc
Remove node modules and configure ncc
This commit is contained in:
		
						commit
						6e5196c493
					
				
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,7 +1,10 @@ | |||||||
| # Explicitly not ignoring node_modules so that they are included in package downloaded by runner | # Ignore node_modules, ncc is used to compile nodejs modules into a single file in the releases branch | ||||||
| !node_modules/ | node_modules/ | ||||||
| __tests__/runner/* | __tests__/runner/* | ||||||
| 
 | 
 | ||||||
|  | # Ignore js files that are transpiled from ts files in src/ | ||||||
|  | lib/ | ||||||
|  | 
 | ||||||
| # Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore | # Rest of the file pulled from https://github.com/github/gitignore/blob/master/Node.gitignore | ||||||
| # Logs | # Logs | ||||||
| logs | logs | ||||||
|  | |||||||
| @ -10,4 +10,7 @@ inputs: | |||||||
|     default: 'x64' |     default: 'x64' | ||||||
| runs: | runs: | ||||||
|   using: 'node12' |   using: 'node12' | ||||||
|   main: 'lib/setup-python.js' |   main: 'dist/index.js' | ||||||
|  | branding: | ||||||
|  |   icon: 'code' | ||||||
|  |   color: 'yellow' | ||||||
							
								
								
									
										5520
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5520
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,159 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { |  | ||||||
|     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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } |  | ||||||
|         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 }); |  | ||||||
| const os = __importStar(require("os")); |  | ||||||
| const path = __importStar(require("path")); |  | ||||||
| const semver = __importStar(require("semver")); |  | ||||||
| let cacheDirectory = process.env['RUNNER_TOOLSDIRECTORY'] || ''; |  | ||||||
| if (!cacheDirectory) { |  | ||||||
|     let baseLocation; |  | ||||||
|     if (process.platform === 'win32') { |  | ||||||
|         // On windows use the USERPROFILE env variable
 |  | ||||||
|         baseLocation = process.env['USERPROFILE'] || 'C:\\'; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         if (process.platform === 'darwin') { |  | ||||||
|             baseLocation = '/Users'; |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             baseLocation = '/home'; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     cacheDirectory = path.join(baseLocation, 'actions', 'cache'); |  | ||||||
| } |  | ||||||
| const core = __importStar(require("@actions/core")); |  | ||||||
| const tc = __importStar(require("@actions/tool-cache")); |  | ||||||
| const IS_WINDOWS = process.platform === 'win32'; |  | ||||||
| // Python has "scripts" or "bin" directories where command-line tools that come with packages are installed.
 |  | ||||||
| // This is where pip is, along with anything that pip installs.
 |  | ||||||
| // There is a seperate directory for `pip install --user`.
 |  | ||||||
| //
 |  | ||||||
| // For reference, these directories are as follows:
 |  | ||||||
| //   macOS / Linux:
 |  | ||||||
| //      <sys.prefix>/bin (by default /usr/local/bin, but not on hosted agents -- see the `else`)
 |  | ||||||
| //      (--user) ~/.local/bin
 |  | ||||||
| //   Windows:
 |  | ||||||
| //      <Python installation dir>\Scripts
 |  | ||||||
| //      (--user) %APPDATA%\Python\PythonXY\Scripts
 |  | ||||||
| // See https://docs.python.org/3/library/sysconfig.html
 |  | ||||||
| function binDir(installDir) { |  | ||||||
|     if (IS_WINDOWS) { |  | ||||||
|         return path.join(installDir, 'Scripts'); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         return path.join(installDir, 'bin'); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| // Note on the tool cache layout for PyPy:
 |  | ||||||
| // PyPy has its own versioning scheme that doesn't follow the Python versioning scheme.
 |  | ||||||
| // A particular version of PyPy may contain one or more versions of the Python interpreter.
 |  | ||||||
| // For example, PyPy 7.0 contains Python 2.7, 3.5, and 3.6-alpha.
 |  | ||||||
| // We only care about the Python version, so we don't use the PyPy version for the tool cache.
 |  | ||||||
| function usePyPy(majorVersion, architecture) { |  | ||||||
|     const findPyPy = tc.find.bind(undefined, 'PyPy', majorVersion.toString()); |  | ||||||
|     let installDir = findPyPy(architecture); |  | ||||||
|     if (!installDir && IS_WINDOWS) { |  | ||||||
|         // PyPy only precompiles binaries for x86, but the architecture parameter defaults to x64.
 |  | ||||||
|         // On Hosted VS2017, we only install an x86 version.
 |  | ||||||
|         // Fall back to x86.
 |  | ||||||
|         installDir = findPyPy('x86'); |  | ||||||
|     } |  | ||||||
|     if (!installDir) { |  | ||||||
|         // PyPy not installed in $(Agent.ToolsDirectory)
 |  | ||||||
|         throw new Error(`PyPy ${majorVersion} not found`); |  | ||||||
|     } |  | ||||||
|     // For PyPy, Windows uses 'bin', not 'Scripts'.
 |  | ||||||
|     const _binDir = path.join(installDir, 'bin'); |  | ||||||
|     // On Linux and macOS, the Python interpreter is in 'bin'.
 |  | ||||||
|     // On Windows, it is in the installation root.
 |  | ||||||
|     const pythonLocation = IS_WINDOWS ? installDir : _binDir; |  | ||||||
|     core.exportVariable('pythonLocation', pythonLocation); |  | ||||||
|     core.addPath(installDir); |  | ||||||
|     core.addPath(_binDir); |  | ||||||
| } |  | ||||||
| function useCpythonVersion(version, architecture) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const desugaredVersionSpec = desugarDevVersion(version); |  | ||||||
|         const semanticVersionSpec = pythonVersionToSemantic(desugaredVersionSpec); |  | ||||||
|         core.debug(`Semantic version spec of ${version} is ${semanticVersionSpec}`); |  | ||||||
|         const installDir = tc.find('Python', semanticVersionSpec, architecture); |  | ||||||
|         if (!installDir) { |  | ||||||
|             // Fail and list available versions
 |  | ||||||
|             const x86Versions = tc |  | ||||||
|                 .findAllVersions('Python', 'x86') |  | ||||||
|                 .map(s => `${s} (x86)`) |  | ||||||
|                 .join(os.EOL); |  | ||||||
|             const x64Versions = tc |  | ||||||
|                 .findAllVersions('Python', 'x64') |  | ||||||
|                 .map(s => `${s} (x64)`) |  | ||||||
|                 .join(os.EOL); |  | ||||||
|             throw new Error([ |  | ||||||
|                 `Version ${version} with arch ${architecture} not found`, |  | ||||||
|                 'Available versions:', |  | ||||||
|                 x86Versions, |  | ||||||
|                 x64Versions |  | ||||||
|             ].join(os.EOL)); |  | ||||||
|         } |  | ||||||
|         core.exportVariable('pythonLocation', installDir); |  | ||||||
|         core.addPath(installDir); |  | ||||||
|         core.addPath(binDir(installDir)); |  | ||||||
|         if (IS_WINDOWS) { |  | ||||||
|             // Add --user directory
 |  | ||||||
|             // `installDir` from tool cache should look like $AGENT_TOOLSDIRECTORY/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.
 |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| /** Convert versions like `3.8-dev` to a version like `>= 3.8.0-a0`. */ |  | ||||||
| function desugarDevVersion(versionSpec) { |  | ||||||
|     if (versionSpec.endsWith('-dev')) { |  | ||||||
|         const versionRoot = versionSpec.slice(0, -'-dev'.length); |  | ||||||
|         return `>= ${versionRoot}.0-a0`; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         return versionSpec; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Python's prelease versions look like `3.7.0b2`. |  | ||||||
|  * This is the one part of Python versioning that does not look like semantic versioning, which specifies `3.7.0-b2`. |  | ||||||
|  * If the version spec contains prerelease versions, we need to convert them to the semantic version equivalent. |  | ||||||
|  */ |  | ||||||
| function pythonVersionToSemantic(versionSpec) { |  | ||||||
|     const prereleaseVersion = /(\d+\.\d+\.\d+)((?:a|b|rc)\d*)/g; |  | ||||||
|     return versionSpec.replace(prereleaseVersion, '$1-$2'); |  | ||||||
| } |  | ||||||
| exports.pythonVersionToSemantic = pythonVersionToSemantic; |  | ||||||
| function findPythonVersion(version, architecture) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         switch (version.toUpperCase()) { |  | ||||||
|             case 'PYPY2': |  | ||||||
|                 return usePyPy(2, architecture); |  | ||||||
|             case 'PYPY3': |  | ||||||
|                 return usePyPy(3, architecture); |  | ||||||
|             default: |  | ||||||
|                 return yield useCpythonVersion(version, architecture); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.findPythonVersion = findPythonVersion; |  | ||||||
| @ -1,37 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { |  | ||||||
|     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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } |  | ||||||
|         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 }); |  | ||||||
| const core = __importStar(require("@actions/core")); |  | ||||||
| const finder = __importStar(require("./find-python")); |  | ||||||
| const path = __importStar(require("path")); |  | ||||||
| function run() { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         try { |  | ||||||
|             let version = core.getInput('python-version'); |  | ||||||
|             if (version) { |  | ||||||
|                 const arch = core.getInput('architecture', { required: true }); |  | ||||||
|                 yield finder.findPythonVersion(version, arch); |  | ||||||
|             } |  | ||||||
|             const matchersPath = path.join(__dirname, '..', '.github'); |  | ||||||
|             console.log(`##[add-matcher]${path.join(matchersPath, 'python.json')}`); |  | ||||||
|         } |  | ||||||
|         catch (err) { |  | ||||||
|             core.setFailed(err.message); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| run(); |  | ||||||
							
								
								
									
										15
									
								
								node_modules/.bin/semver
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/semver
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,15 +0,0 @@ | |||||||
| #!/bin/sh |  | ||||||
| basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |  | ||||||
| 
 |  | ||||||
| case `uname` in |  | ||||||
|     *CYGWIN*) basedir=`cygpath -w "$basedir"`;; |  | ||||||
| esac |  | ||||||
| 
 |  | ||||||
| if [ -x "$basedir/node" ]; then |  | ||||||
|   "$basedir/node"  "$basedir/../semver/bin/semver.js" "$@" |  | ||||||
|   ret=$? |  | ||||||
| else  |  | ||||||
|   node  "$basedir/../semver/bin/semver.js" "$@" |  | ||||||
|   ret=$? |  | ||||||
| fi |  | ||||||
| exit $ret |  | ||||||
							
								
								
									
										7
									
								
								node_modules/.bin/semver.cmd
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								node_modules/.bin/semver.cmd
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,7 +0,0 @@ | |||||||
| @IF EXIST "%~dp0\node.exe" ( |  | ||||||
|   "%~dp0\node.exe"  "%~dp0\..\semver\bin\semver.js" %* |  | ||||||
| ) ELSE ( |  | ||||||
|   @SETLOCAL |  | ||||||
|   @SET PATHEXT=%PATHEXT:;.JS;=;% |  | ||||||
|   node  "%~dp0\..\semver\bin\semver.js" %* |  | ||||||
| ) |  | ||||||
							
								
								
									
										15
									
								
								node_modules/.bin/uuid
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/uuid
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,15 +0,0 @@ | |||||||
| #!/bin/sh |  | ||||||
| basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |  | ||||||
| 
 |  | ||||||
| case `uname` in |  | ||||||
|     *CYGWIN*) basedir=`cygpath -w "$basedir"`;; |  | ||||||
| esac |  | ||||||
| 
 |  | ||||||
| if [ -x "$basedir/node" ]; then |  | ||||||
|   "$basedir/node"  "$basedir/../uuid/bin/uuid" "$@" |  | ||||||
|   ret=$? |  | ||||||
| else  |  | ||||||
|   node  "$basedir/../uuid/bin/uuid" "$@" |  | ||||||
|   ret=$? |  | ||||||
| fi |  | ||||||
| exit $ret |  | ||||||
							
								
								
									
										7
									
								
								node_modules/.bin/uuid.cmd
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								node_modules/.bin/uuid.cmd
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,7 +0,0 @@ | |||||||
| @IF EXIST "%~dp0\node.exe" ( |  | ||||||
|   "%~dp0\node.exe"  "%~dp0\..\uuid\bin\uuid" %* |  | ||||||
| ) ELSE ( |  | ||||||
|   @SETLOCAL |  | ||||||
|   @SET PATHEXT=%PATHEXT:;.JS;=;% |  | ||||||
|   node  "%~dp0\..\uuid\bin\uuid" %* |  | ||||||
| ) |  | ||||||
							
								
								
									
										81
									
								
								node_modules/@actions/core/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										81
									
								
								node_modules/@actions/core/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,81 +0,0 @@ | |||||||
| # `@actions/core` |  | ||||||
| 
 |  | ||||||
| > Core functions for setting results, logging, registering secrets and exporting variables across actions |  | ||||||
| 
 |  | ||||||
| ## Usage |  | ||||||
| 
 |  | ||||||
| #### Inputs/Outputs |  | ||||||
| 
 |  | ||||||
| You can use this library to get inputs or set outputs: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const core = require('@actions/core'); |  | ||||||
| 
 |  | ||||||
| const myInput = core.getInput('inputName', { required: true }); |  | ||||||
| 
 |  | ||||||
| // Do stuff |  | ||||||
| 
 |  | ||||||
| core.setOutput('outputKey', 'outputVal'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Exporting variables/secrets |  | ||||||
| 
 |  | ||||||
| You can also export variables and secrets for future steps. Variables get set in the environment automatically, while secrets must be scoped into the environment from a workflow using `{{ secret.FOO }}`. Secrets will also be masked from the logs: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const core = require('@actions/core'); |  | ||||||
| 
 |  | ||||||
| // Do stuff |  | ||||||
| 
 |  | ||||||
| core.exportVariable('envVar', 'Val'); |  | ||||||
| core.exportSecret('secretVar', variableWithSecretValue); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### PATH Manipulation |  | ||||||
| 
 |  | ||||||
| You can explicitly add items to the path for all remaining steps in a workflow: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const core = require('@actions/core'); |  | ||||||
| 
 |  | ||||||
| core.addPath('pathToTool'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Exit codes |  | ||||||
| 
 |  | ||||||
| You should use this library to set the failing exit code for your action: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const core = require('@actions/core'); |  | ||||||
| 
 |  | ||||||
| try { |  | ||||||
|   // Do stuff |  | ||||||
| } |  | ||||||
| catch (err) { |  | ||||||
|   // setFailed logs the message and sets a failing exit code |  | ||||||
|   core.setFailed(`Action failed with error ${err}`); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Logging |  | ||||||
| 
 |  | ||||||
| Finally, this library provides some utilities for logging: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const core = require('@actions/core'); |  | ||||||
| 
 |  | ||||||
| const myInput = core.getInput('input'); |  | ||||||
| try { |  | ||||||
|   core.debug('Inside try block'); |  | ||||||
|    |  | ||||||
|   if (!myInput) { |  | ||||||
|     core.warning('myInput wasnt set'); |  | ||||||
|   } |  | ||||||
|    |  | ||||||
|   // Do stuff |  | ||||||
| } |  | ||||||
| catch (err) { |  | ||||||
|   core.error('Error ${err}, action may still succeed though'); |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
							
								
								
									
										16
									
								
								node_modules/@actions/core/lib/command.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								node_modules/@actions/core/lib/command.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,16 +0,0 @@ | |||||||
| interface CommandProperties { |  | ||||||
|     [key: string]: string; |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Commands |  | ||||||
|  * |  | ||||||
|  * Command Format: |  | ||||||
|  *   ##[name key=value;key=value]message |  | ||||||
|  * |  | ||||||
|  * Examples: |  | ||||||
|  *   ##[warning]This is the user warning message |  | ||||||
|  *   ##[set-secret name=mypassword]definatelyNotAPassword! |  | ||||||
|  */ |  | ||||||
| export declare function issueCommand(command: string, properties: CommandProperties, message: string): void; |  | ||||||
| export declare function issue(name: string, message: string): void; |  | ||||||
| export {}; |  | ||||||
							
								
								
									
										66
									
								
								node_modules/@actions/core/lib/command.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								node_modules/@actions/core/lib/command.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,66 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| const os = require("os"); |  | ||||||
| /** |  | ||||||
|  * Commands |  | ||||||
|  * |  | ||||||
|  * Command Format: |  | ||||||
|  *   ##[name key=value;key=value]message |  | ||||||
|  * |  | ||||||
|  * Examples: |  | ||||||
|  *   ##[warning]This is the user warning message |  | ||||||
|  *   ##[set-secret name=mypassword]definatelyNotAPassword! |  | ||||||
|  */ |  | ||||||
| function issueCommand(command, properties, message) { |  | ||||||
|     const cmd = new Command(command, properties, message); |  | ||||||
|     process.stdout.write(cmd.toString() + os.EOL); |  | ||||||
| } |  | ||||||
| exports.issueCommand = issueCommand; |  | ||||||
| function issue(name, message) { |  | ||||||
|     issueCommand(name, {}, message); |  | ||||||
| } |  | ||||||
| exports.issue = issue; |  | ||||||
| const CMD_PREFIX = '##['; |  | ||||||
| class Command { |  | ||||||
|     constructor(command, properties, message) { |  | ||||||
|         if (!command) { |  | ||||||
|             command = 'missing.command'; |  | ||||||
|         } |  | ||||||
|         this.command = command; |  | ||||||
|         this.properties = properties; |  | ||||||
|         this.message = message; |  | ||||||
|     } |  | ||||||
|     toString() { |  | ||||||
|         let cmdStr = CMD_PREFIX + this.command; |  | ||||||
|         if (this.properties && Object.keys(this.properties).length > 0) { |  | ||||||
|             cmdStr += ' '; |  | ||||||
|             for (const key in this.properties) { |  | ||||||
|                 if (this.properties.hasOwnProperty(key)) { |  | ||||||
|                     const val = this.properties[key]; |  | ||||||
|                     if (val) { |  | ||||||
|                         // safely append the val - avoid blowing up when attempting to
 |  | ||||||
|                         // call .replace() if message is not a string for some reason
 |  | ||||||
|                         cmdStr += `${key}=${escape(`${val || ''}`)};`; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         cmdStr += ']'; |  | ||||||
|         // safely append the message - avoid blowing up when attempting to
 |  | ||||||
|         // call .replace() if message is not a string for some reason
 |  | ||||||
|         const message = `${this.message || ''}`; |  | ||||||
|         cmdStr += escapeData(message); |  | ||||||
|         return cmdStr; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| function escapeData(s) { |  | ||||||
|     return s.replace(/\r/g, '%0D').replace(/\n/g, '%0A'); |  | ||||||
| } |  | ||||||
| function escape(s) { |  | ||||||
|     return s |  | ||||||
|         .replace(/\r/g, '%0D') |  | ||||||
|         .replace(/\n/g, '%0A') |  | ||||||
|         .replace(/]/g, '%5D') |  | ||||||
|         .replace(/;/g, '%3B'); |  | ||||||
| } |  | ||||||
| //# sourceMappingURL=command.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/core/lib/command.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/core/lib/command.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| {"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":";;AAAA,yBAAwB;AAQxB;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAC1B,OAAe,EACf,UAA6B,EAC7B,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;AAC/C,CAAC;AAPD,oCAOC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,OAAe;IACjD,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACjC,CAAC;AAFD,sBAEC;AAED,MAAM,UAAU,GAAG,KAAK,CAAA;AAExB,MAAM,OAAO;IAKX,YAAY,OAAe,EAAE,UAA6B,EAAE,OAAe;QACzE,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,iBAAiB,CAAA;SAC5B;QAED,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,QAAQ;QACN,IAAI,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC,OAAO,CAAA;QAEtC,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9D,MAAM,IAAI,GAAG,CAAA;YACb,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;oBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;oBAChC,IAAI,GAAG,EAAE;wBACP,8DAA8D;wBAC9D,6DAA6D;wBAC7D,MAAM,IAAI,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,CAAA;qBAC9C;iBACF;aACF;SACF;QAED,MAAM,IAAI,GAAG,CAAA;QAEb,kEAAkE;QAClE,6DAA6D;QAC7D,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,CAAA;QACvC,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;QAE7B,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC;SACL,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC"} |  | ||||||
							
								
								
									
										73
									
								
								node_modules/@actions/core/lib/core.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										73
									
								
								node_modules/@actions/core/lib/core.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,73 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Interface for getInput options |  | ||||||
|  */ |  | ||||||
| export interface InputOptions { |  | ||||||
|     /** Optional. Whether the input is required. If required and not present, will throw. Defaults to false */ |  | ||||||
|     required?: boolean; |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * The code to exit an action |  | ||||||
|  */ |  | ||||||
| export declare enum ExitCode { |  | ||||||
|     /** |  | ||||||
|      * A code indicating that the action was successful |  | ||||||
|      */ |  | ||||||
|     Success = 0, |  | ||||||
|     /** |  | ||||||
|      * A code indicating that the action was a failure |  | ||||||
|      */ |  | ||||||
|     Failure = 1 |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * sets env variable for this action and future actions in the job |  | ||||||
|  * @param name the name of the variable to set |  | ||||||
|  * @param val the value of the variable |  | ||||||
|  */ |  | ||||||
| export declare function exportVariable(name: string, val: string): void; |  | ||||||
| /** |  | ||||||
|  * exports the variable and registers a secret which will get masked from logs |  | ||||||
|  * @param name the name of the variable to set |  | ||||||
|  * @param val value of the secret |  | ||||||
|  */ |  | ||||||
| export declare function exportSecret(name: string, val: string): void; |  | ||||||
| /** |  | ||||||
|  * Prepends inputPath to the PATH (for this action and future actions) |  | ||||||
|  * @param inputPath |  | ||||||
|  */ |  | ||||||
| export declare function addPath(inputPath: string): void; |  | ||||||
| /** |  | ||||||
|  * Gets the value of an input.  The value is also trimmed. |  | ||||||
|  * |  | ||||||
|  * @param     name     name of the input to get |  | ||||||
|  * @param     options  optional. See InputOptions. |  | ||||||
|  * @returns   string |  | ||||||
|  */ |  | ||||||
| export declare function getInput(name: string, options?: InputOptions): string; |  | ||||||
| /** |  | ||||||
|  * Sets the value of an output. |  | ||||||
|  * |  | ||||||
|  * @param     name     name of the output to set |  | ||||||
|  * @param     value    value to store |  | ||||||
|  */ |  | ||||||
| export declare function setOutput(name: string, value: string): void; |  | ||||||
| /** |  | ||||||
|  * Sets the action status to failed. |  | ||||||
|  * When the action exits it will be with an exit code of 1 |  | ||||||
|  * @param message add error issue message |  | ||||||
|  */ |  | ||||||
| export declare function setFailed(message: string): void; |  | ||||||
| /** |  | ||||||
|  * Writes debug message to user log |  | ||||||
|  * @param message debug message |  | ||||||
|  */ |  | ||||||
| export declare function debug(message: string): void; |  | ||||||
| /** |  | ||||||
|  * Adds an error issue |  | ||||||
|  * @param message error issue message |  | ||||||
|  */ |  | ||||||
| export declare function error(message: string): void; |  | ||||||
| /** |  | ||||||
|  * Adds an warning issue |  | ||||||
|  * @param message warning issue message |  | ||||||
|  */ |  | ||||||
| export declare function warning(message: string): void; |  | ||||||
							
								
								
									
										116
									
								
								node_modules/@actions/core/lib/core.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										116
									
								
								node_modules/@actions/core/lib/core.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,116 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| const command_1 = require("./command"); |  | ||||||
| const path = require("path"); |  | ||||||
| /** |  | ||||||
|  * The code to exit an action |  | ||||||
|  */ |  | ||||||
| var ExitCode; |  | ||||||
| (function (ExitCode) { |  | ||||||
|     /** |  | ||||||
|      * A code indicating that the action was successful |  | ||||||
|      */ |  | ||||||
|     ExitCode[ExitCode["Success"] = 0] = "Success"; |  | ||||||
|     /** |  | ||||||
|      * A code indicating that the action was a failure |  | ||||||
|      */ |  | ||||||
|     ExitCode[ExitCode["Failure"] = 1] = "Failure"; |  | ||||||
| })(ExitCode = exports.ExitCode || (exports.ExitCode = {})); |  | ||||||
| //-----------------------------------------------------------------------
 |  | ||||||
| // Variables
 |  | ||||||
| //-----------------------------------------------------------------------
 |  | ||||||
| /** |  | ||||||
|  * sets env variable for this action and future actions in the job |  | ||||||
|  * @param name the name of the variable to set |  | ||||||
|  * @param val the value of the variable |  | ||||||
|  */ |  | ||||||
| function exportVariable(name, val) { |  | ||||||
|     process.env[name] = val; |  | ||||||
|     command_1.issueCommand('set-env', { name }, val); |  | ||||||
| } |  | ||||||
| exports.exportVariable = exportVariable; |  | ||||||
| /** |  | ||||||
|  * exports the variable and registers a secret which will get masked from logs |  | ||||||
|  * @param name the name of the variable to set |  | ||||||
|  * @param val value of the secret |  | ||||||
|  */ |  | ||||||
| function exportSecret(name, val) { |  | ||||||
|     exportVariable(name, val); |  | ||||||
|     command_1.issueCommand('set-secret', {}, val); |  | ||||||
| } |  | ||||||
| exports.exportSecret = exportSecret; |  | ||||||
| /** |  | ||||||
|  * Prepends inputPath to the PATH (for this action and future actions) |  | ||||||
|  * @param inputPath |  | ||||||
|  */ |  | ||||||
| function addPath(inputPath) { |  | ||||||
|     command_1.issueCommand('add-path', {}, inputPath); |  | ||||||
|     process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; |  | ||||||
| } |  | ||||||
| exports.addPath = addPath; |  | ||||||
| /** |  | ||||||
|  * Gets the value of an input.  The value is also trimmed. |  | ||||||
|  * |  | ||||||
|  * @param     name     name of the input to get |  | ||||||
|  * @param     options  optional. See InputOptions. |  | ||||||
|  * @returns   string |  | ||||||
|  */ |  | ||||||
| function getInput(name, options) { |  | ||||||
|     const val = process.env[`INPUT_${name.replace(' ', '_').toUpperCase()}`] || ''; |  | ||||||
|     if (options && options.required && !val) { |  | ||||||
|         throw new Error(`Input required and not supplied: ${name}`); |  | ||||||
|     } |  | ||||||
|     return val.trim(); |  | ||||||
| } |  | ||||||
| exports.getInput = getInput; |  | ||||||
| /** |  | ||||||
|  * Sets the value of an output. |  | ||||||
|  * |  | ||||||
|  * @param     name     name of the output to set |  | ||||||
|  * @param     value    value to store |  | ||||||
|  */ |  | ||||||
| function setOutput(name, value) { |  | ||||||
|     command_1.issueCommand('set-output', { name }, value); |  | ||||||
| } |  | ||||||
| exports.setOutput = setOutput; |  | ||||||
| //-----------------------------------------------------------------------
 |  | ||||||
| // Results
 |  | ||||||
| //-----------------------------------------------------------------------
 |  | ||||||
| /** |  | ||||||
|  * Sets the action status to failed. |  | ||||||
|  * When the action exits it will be with an exit code of 1 |  | ||||||
|  * @param message add error issue message |  | ||||||
|  */ |  | ||||||
| function setFailed(message) { |  | ||||||
|     process.exitCode = ExitCode.Failure; |  | ||||||
|     error(message); |  | ||||||
| } |  | ||||||
| exports.setFailed = setFailed; |  | ||||||
| //-----------------------------------------------------------------------
 |  | ||||||
| // Logging Commands
 |  | ||||||
| //-----------------------------------------------------------------------
 |  | ||||||
| /** |  | ||||||
|  * Writes debug message to user log |  | ||||||
|  * @param message debug message |  | ||||||
|  */ |  | ||||||
| function debug(message) { |  | ||||||
|     command_1.issueCommand('debug', {}, message); |  | ||||||
| } |  | ||||||
| exports.debug = debug; |  | ||||||
| /** |  | ||||||
|  * Adds an error issue |  | ||||||
|  * @param message error issue message |  | ||||||
|  */ |  | ||||||
| function error(message) { |  | ||||||
|     command_1.issue('error', message); |  | ||||||
| } |  | ||||||
| exports.error = error; |  | ||||||
| /** |  | ||||||
|  * Adds an warning issue |  | ||||||
|  * @param message warning issue message |  | ||||||
|  */ |  | ||||||
| function warning(message) { |  | ||||||
|     command_1.issue('warning', message); |  | ||||||
| } |  | ||||||
| exports.warning = warning; |  | ||||||
| //# sourceMappingURL=core.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/core/lib/core.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/core/lib/core.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":";;AAAA,uCAA6C;AAE7C,6BAA4B;AAU5B;;GAEG;AACH,IAAY,QAUX;AAVD,WAAY,QAAQ;IAClB;;OAEG;IACH,6CAAW,CAAA;IAEX;;OAEG;IACH,6CAAW,CAAA;AACb,CAAC,EAVW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAUnB;AAED,yEAAyE;AACzE,YAAY;AACZ,yEAAyE;AAEzE;;;;GAIG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,GAAW;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAA;IACvB,sBAAY,CAAC,SAAS,EAAE,EAAC,IAAI,EAAC,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC;AAHD,wCAGC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,IAAY,EAAE,GAAW;IACpD,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACzB,sBAAY,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;AACrC,CAAC;AAHD,oCAGC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,SAAiB;IACvC,sBAAY,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;AAC7E,CAAC;AAHD,0BAGC;AAED;;;;;;GAMG;AACH,SAAgB,QAAQ,CAAC,IAAY,EAAE,OAAsB;IAC3D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAA;IACpE,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAA;KAC5D;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;AACnB,CAAC;AARD,4BAQC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,sBAAY,CAAC,YAAY,EAAE,EAAC,IAAI,EAAC,EAAE,KAAK,CAAC,CAAA;AAC3C,CAAC;AAFD,8BAEC;AAED,yEAAyE;AACzE,UAAU;AACV,yEAAyE;AAEzE;;;;GAIG;AACH,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAA;IACnC,KAAK,CAAC,OAAO,CAAC,CAAA;AAChB,CAAC;AAHD,8BAGC;AAED,yEAAyE;AACzE,mBAAmB;AACnB,yEAAyE;AAEzE;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,sBAAY,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACpC,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,OAAe;IACnC,eAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACzB,CAAC;AAFD,sBAEC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,OAAe;IACrC,eAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAC3B,CAAC;AAFD,0BAEC"} |  | ||||||
							
								
								
									
										64
									
								
								node_modules/@actions/core/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								node_modules/@actions/core/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,64 +0,0 @@ | |||||||
| { |  | ||||||
|   "_from": "@actions/core@^1.0.0", |  | ||||||
|   "_id": "@actions/core@1.0.0", |  | ||||||
|   "_inBundle": false, |  | ||||||
|   "_integrity": "sha512-aMIlkx96XH4E/2YZtEOeyrYQfhlas9jIRkfGPqMwXD095Rdkzo4lB6ZmbxPQSzD+e1M+Xsm98ZhuSMYGv/AlqA==", |  | ||||||
|   "_location": "/@actions/core", |  | ||||||
|   "_phantomChildren": {}, |  | ||||||
|   "_requested": { |  | ||||||
|     "type": "range", |  | ||||||
|     "registry": true, |  | ||||||
|     "raw": "@actions/core@^1.0.0", |  | ||||||
|     "name": "@actions/core", |  | ||||||
|     "escapedName": "@actions%2fcore", |  | ||||||
|     "scope": "@actions", |  | ||||||
|     "rawSpec": "^1.0.0", |  | ||||||
|     "saveSpec": null, |  | ||||||
|     "fetchSpec": "^1.0.0" |  | ||||||
|   }, |  | ||||||
|   "_requiredBy": [ |  | ||||||
|     "/", |  | ||||||
|     "/@actions/tool-cache" |  | ||||||
|   ], |  | ||||||
|   "_resolved": "https://registry.npmjs.org/@actions/core/-/core-1.0.0.tgz", |  | ||||||
|   "_shasum": "4a090a2e958cc300b9ea802331034d5faf42d239", |  | ||||||
|   "_spec": "@actions/core@^1.0.0", |  | ||||||
|   "_where": "C:\\Users\\damccorm\\Documents\\setup-python", |  | ||||||
|   "bugs": { |  | ||||||
|     "url": "https://github.com/actions/toolkit/issues" |  | ||||||
|   }, |  | ||||||
|   "bundleDependencies": false, |  | ||||||
|   "deprecated": false, |  | ||||||
|   "description": "Actions core lib", |  | ||||||
|   "devDependencies": { |  | ||||||
|     "@types/node": "^12.0.2" |  | ||||||
|   }, |  | ||||||
|   "directories": { |  | ||||||
|     "lib": "lib", |  | ||||||
|     "test": "__tests__" |  | ||||||
|   }, |  | ||||||
|   "files": [ |  | ||||||
|     "lib" |  | ||||||
|   ], |  | ||||||
|   "gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55", |  | ||||||
|   "homepage": "https://github.com/actions/toolkit/tree/master/packages/core", |  | ||||||
|   "keywords": [ |  | ||||||
|     "core", |  | ||||||
|     "actions" |  | ||||||
|   ], |  | ||||||
|   "license": "MIT", |  | ||||||
|   "main": "lib/core.js", |  | ||||||
|   "name": "@actions/core", |  | ||||||
|   "publishConfig": { |  | ||||||
|     "access": "public" |  | ||||||
|   }, |  | ||||||
|   "repository": { |  | ||||||
|     "type": "git", |  | ||||||
|     "url": "git+https://github.com/actions/toolkit.git" |  | ||||||
|   }, |  | ||||||
|   "scripts": { |  | ||||||
|     "test": "echo \"Error: run tests from root\" && exit 1", |  | ||||||
|     "tsc": "tsc" |  | ||||||
|   }, |  | ||||||
|   "version": "1.0.0" |  | ||||||
| } |  | ||||||
							
								
								
									
										60
									
								
								node_modules/@actions/exec/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								node_modules/@actions/exec/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,60 +0,0 @@ | |||||||
| # `@actions/exec` |  | ||||||
| 
 |  | ||||||
| ## Usage |  | ||||||
| 
 |  | ||||||
| #### Basic |  | ||||||
| 
 |  | ||||||
| You can use this package to execute your tools on the command line in a cross platform way: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const exec = require('@actions/exec'); |  | ||||||
| 
 |  | ||||||
| await exec.exec('node index.js'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Args |  | ||||||
| 
 |  | ||||||
| You can also pass in arg arrays: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const exec = require('@actions/exec'); |  | ||||||
| 
 |  | ||||||
| await exec.exec('node', ['index.js', 'foo=bar']); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Output/options |  | ||||||
| 
 |  | ||||||
| Capture output or specify [other options](https://github.com/actions/toolkit/blob/d9347d4ab99fd507c0b9104b2cf79fb44fcc827d/packages/exec/src/interfaces.ts#L5): |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const exec = require('@actions/exec'); |  | ||||||
| 
 |  | ||||||
| const myOutput = ''; |  | ||||||
| const myError = ''; |  | ||||||
| 
 |  | ||||||
| const options = {}; |  | ||||||
| options.listeners = { |  | ||||||
|   stdout: (data: Buffer) => { |  | ||||||
|     myOutput += data.toString(); |  | ||||||
|   }, |  | ||||||
|   stderr: (data: Buffer) => { |  | ||||||
|     myError += data.toString(); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| options.cwd = './lib'; |  | ||||||
| 
 |  | ||||||
| await exec.exec('node', ['index.js', 'foo=bar'], options); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Exec tools not in the PATH |  | ||||||
| 
 |  | ||||||
| You can use it in conjunction with the `which` function from `@actions/io` to execute tools that are not in the PATH: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const exec = require('@actions/exec'); |  | ||||||
| const io = require('@actions/io'); |  | ||||||
| 
 |  | ||||||
| const pythonPath: string = await io.which('python', true) |  | ||||||
| 
 |  | ||||||
| await exec.exec(`"${pythonPath}"`, ['main.py']); |  | ||||||
| ``` |  | ||||||
							
								
								
									
										12
									
								
								node_modules/@actions/exec/lib/exec.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								node_modules/@actions/exec/lib/exec.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,12 +0,0 @@ | |||||||
| import * as im from './interfaces'; |  | ||||||
| /** |  | ||||||
|  * Exec a command. |  | ||||||
|  * Output will be streamed to the live console. |  | ||||||
|  * Returns promise with return code |  | ||||||
|  * |  | ||||||
|  * @param     commandLine        command to execute (can include additional args). Must be correctly escaped. |  | ||||||
|  * @param     args               optional arguments for tool. Escaping is handled by the lib. |  | ||||||
|  * @param     options            optional exec options.  See ExecOptions |  | ||||||
|  * @returns   Promise<number>    exit code |  | ||||||
|  */ |  | ||||||
| export declare function exec(commandLine: string, args?: string[], options?: im.ExecOptions): Promise<number>; |  | ||||||
							
								
								
									
										36
									
								
								node_modules/@actions/exec/lib/exec.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								node_modules/@actions/exec/lib/exec.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,36 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { |  | ||||||
|     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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } |  | ||||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| const tr = require("./toolrunner"); |  | ||||||
| /** |  | ||||||
|  * Exec a command. |  | ||||||
|  * Output will be streamed to the live console. |  | ||||||
|  * Returns promise with return code |  | ||||||
|  * |  | ||||||
|  * @param     commandLine        command to execute (can include additional args). Must be correctly escaped. |  | ||||||
|  * @param     args               optional arguments for tool. Escaping is handled by the lib. |  | ||||||
|  * @param     options            optional exec options.  See ExecOptions |  | ||||||
|  * @returns   Promise<number>    exit code |  | ||||||
|  */ |  | ||||||
| function exec(commandLine, args, options) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const commandArgs = tr.argStringToArray(commandLine); |  | ||||||
|         if (commandArgs.length === 0) { |  | ||||||
|             throw new Error(`Parameter 'commandLine' cannot be null or empty.`); |  | ||||||
|         } |  | ||||||
|         // Path to tool to execute should be first arg
 |  | ||||||
|         const toolPath = commandArgs[0]; |  | ||||||
|         args = commandArgs.slice(1).concat(args || []); |  | ||||||
|         const runner = new tr.ToolRunner(toolPath, args, options); |  | ||||||
|         return runner.exec(); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.exec = exec; |  | ||||||
| //# sourceMappingURL=exec.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/exec/lib/exec.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/exec/lib/exec.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| {"version":3,"file":"exec.js","sourceRoot":"","sources":["../src/exec.ts"],"names":[],"mappings":";;;;;;;;;;AACA,mCAAkC;AAElC;;;;;;;;;GASG;AACH,SAAsB,IAAI,CACxB,WAAmB,EACnB,IAAe,EACf,OAAwB;;QAExB,MAAM,WAAW,GAAG,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;QACpD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;SACpE;QACD,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC/B,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAkB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACxE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;IACtB,CAAC;CAAA;AAdD,oBAcC"} |  | ||||||
							
								
								
									
										35
									
								
								node_modules/@actions/exec/lib/interfaces.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								node_modules/@actions/exec/lib/interfaces.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,35 +0,0 @@ | |||||||
| /// <reference types="node" />
 |  | ||||||
| import * as stream from 'stream'; |  | ||||||
| /** |  | ||||||
|  * Interface for exec options |  | ||||||
|  */ |  | ||||||
| export interface ExecOptions { |  | ||||||
|     /** optional working directory.  defaults to current */ |  | ||||||
|     cwd?: string; |  | ||||||
|     /** optional envvar dictionary.  defaults to current process's env */ |  | ||||||
|     env?: { |  | ||||||
|         [key: string]: string; |  | ||||||
|     }; |  | ||||||
|     /** optional.  defaults to false */ |  | ||||||
|     silent?: boolean; |  | ||||||
|     /** optional out stream to use. Defaults to process.stdout */ |  | ||||||
|     outStream?: stream.Writable; |  | ||||||
|     /** optional err stream to use. Defaults to process.stderr */ |  | ||||||
|     errStream?: stream.Writable; |  | ||||||
|     /** optional. whether to skip quoting/escaping arguments if needed.  defaults to false. */ |  | ||||||
|     windowsVerbatimArguments?: boolean; |  | ||||||
|     /** optional.  whether to fail if output to stderr.  defaults to false */ |  | ||||||
|     failOnStdErr?: boolean; |  | ||||||
|     /** optional.  defaults to failing on non zero.  ignore will not fail leaving it up to the caller */ |  | ||||||
|     ignoreReturnCode?: boolean; |  | ||||||
|     /** optional. How long in ms to wait for STDIO streams to close after the exit event of the process before terminating. defaults to 10000 */ |  | ||||||
|     delay?: number; |  | ||||||
|     /** optional. Listeners for output. Callback functions that will be called on these events */ |  | ||||||
|     listeners?: { |  | ||||||
|         stdout?: (data: Buffer) => void; |  | ||||||
|         stderr?: (data: Buffer) => void; |  | ||||||
|         stdline?: (data: string) => void; |  | ||||||
|         errline?: (data: string) => void; |  | ||||||
|         debug?: (data: string) => void; |  | ||||||
|     }; |  | ||||||
| } |  | ||||||
							
								
								
									
										3
									
								
								node_modules/@actions/exec/lib/interfaces.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								node_modules/@actions/exec/lib/interfaces.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| //# sourceMappingURL=interfaces.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/exec/lib/interfaces.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/exec/lib/interfaces.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":""} |  | ||||||
							
								
								
									
										37
									
								
								node_modules/@actions/exec/lib/toolrunner.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								node_modules/@actions/exec/lib/toolrunner.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,37 +0,0 @@ | |||||||
| /// <reference types="node" />
 |  | ||||||
| import * as events from 'events'; |  | ||||||
| import * as im from './interfaces'; |  | ||||||
| export declare class ToolRunner extends events.EventEmitter { |  | ||||||
|     constructor(toolPath: string, args?: string[], options?: im.ExecOptions); |  | ||||||
|     private toolPath; |  | ||||||
|     private args; |  | ||||||
|     private options; |  | ||||||
|     private _debug; |  | ||||||
|     private _getCommandString; |  | ||||||
|     private _processLineBuffer; |  | ||||||
|     private _getSpawnFileName; |  | ||||||
|     private _getSpawnArgs; |  | ||||||
|     private _endsWith; |  | ||||||
|     private _isCmdFile; |  | ||||||
|     private _windowsQuoteCmdArg; |  | ||||||
|     private _uvQuoteCmdArg; |  | ||||||
|     private _cloneExecOptions; |  | ||||||
|     private _getSpawnOptions; |  | ||||||
|     /** |  | ||||||
|      * Exec a tool. |  | ||||||
|      * Output will be streamed to the live console. |  | ||||||
|      * Returns promise with return code |  | ||||||
|      * |  | ||||||
|      * @param     tool     path to tool to exec |  | ||||||
|      * @param     options  optional exec options.  See ExecOptions |  | ||||||
|      * @returns   number |  | ||||||
|      */ |  | ||||||
|     exec(): Promise<number>; |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Convert an arg string to an array of args. Handles escaping |  | ||||||
|  * |  | ||||||
|  * @param    argString   string of arguments |  | ||||||
|  * @returns  string[]    array of arguments |  | ||||||
|  */ |  | ||||||
| export declare function argStringToArray(argString: string): string[]; |  | ||||||
							
								
								
									
										573
									
								
								node_modules/@actions/exec/lib/toolrunner.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										573
									
								
								node_modules/@actions/exec/lib/toolrunner.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,573 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { |  | ||||||
|     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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } |  | ||||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| const os = require("os"); |  | ||||||
| const events = require("events"); |  | ||||||
| const child = require("child_process"); |  | ||||||
| /* eslint-disable @typescript-eslint/unbound-method */ |  | ||||||
| const IS_WINDOWS = process.platform === 'win32'; |  | ||||||
| /* |  | ||||||
|  * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. |  | ||||||
|  */ |  | ||||||
| class ToolRunner extends events.EventEmitter { |  | ||||||
|     constructor(toolPath, args, options) { |  | ||||||
|         super(); |  | ||||||
|         if (!toolPath) { |  | ||||||
|             throw new Error("Parameter 'toolPath' cannot be null or empty."); |  | ||||||
|         } |  | ||||||
|         this.toolPath = toolPath; |  | ||||||
|         this.args = args || []; |  | ||||||
|         this.options = options || {}; |  | ||||||
|     } |  | ||||||
|     _debug(message) { |  | ||||||
|         if (this.options.listeners && this.options.listeners.debug) { |  | ||||||
|             this.options.listeners.debug(message); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     _getCommandString(options, noPrefix) { |  | ||||||
|         const toolPath = this._getSpawnFileName(); |  | ||||||
|         const args = this._getSpawnArgs(options); |  | ||||||
|         let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool
 |  | ||||||
|         if (IS_WINDOWS) { |  | ||||||
|             // Windows + cmd file
 |  | ||||||
|             if (this._isCmdFile()) { |  | ||||||
|                 cmd += toolPath; |  | ||||||
|                 for (const a of args) { |  | ||||||
|                     cmd += ` ${a}`; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             // Windows + verbatim
 |  | ||||||
|             else if (options.windowsVerbatimArguments) { |  | ||||||
|                 cmd += `"${toolPath}"`; |  | ||||||
|                 for (const a of args) { |  | ||||||
|                     cmd += ` ${a}`; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             // Windows (regular)
 |  | ||||||
|             else { |  | ||||||
|                 cmd += this._windowsQuoteCmdArg(toolPath); |  | ||||||
|                 for (const a of args) { |  | ||||||
|                     cmd += ` ${this._windowsQuoteCmdArg(a)}`; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             // OSX/Linux - this can likely be improved with some form of quoting.
 |  | ||||||
|             // creating processes on Unix is fundamentally different than Windows.
 |  | ||||||
|             // on Unix, execvp() takes an arg array.
 |  | ||||||
|             cmd += toolPath; |  | ||||||
|             for (const a of args) { |  | ||||||
|                 cmd += ` ${a}`; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return cmd; |  | ||||||
|     } |  | ||||||
|     _processLineBuffer(data, strBuffer, onLine) { |  | ||||||
|         try { |  | ||||||
|             let s = strBuffer + data.toString(); |  | ||||||
|             let n = s.indexOf(os.EOL); |  | ||||||
|             while (n > -1) { |  | ||||||
|                 const line = s.substring(0, n); |  | ||||||
|                 onLine(line); |  | ||||||
|                 // the rest of the string ...
 |  | ||||||
|                 s = s.substring(n + os.EOL.length); |  | ||||||
|                 n = s.indexOf(os.EOL); |  | ||||||
|             } |  | ||||||
|             strBuffer = s; |  | ||||||
|         } |  | ||||||
|         catch (err) { |  | ||||||
|             // streaming lines to console is best effort.  Don't fail a build.
 |  | ||||||
|             this._debug(`error processing line. Failed with error ${err}`); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     _getSpawnFileName() { |  | ||||||
|         if (IS_WINDOWS) { |  | ||||||
|             if (this._isCmdFile()) { |  | ||||||
|                 return process.env['COMSPEC'] || 'cmd.exe'; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return this.toolPath; |  | ||||||
|     } |  | ||||||
|     _getSpawnArgs(options) { |  | ||||||
|         if (IS_WINDOWS) { |  | ||||||
|             if (this._isCmdFile()) { |  | ||||||
|                 let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; |  | ||||||
|                 for (const a of this.args) { |  | ||||||
|                     argline += ' '; |  | ||||||
|                     argline += options.windowsVerbatimArguments |  | ||||||
|                         ? a |  | ||||||
|                         : this._windowsQuoteCmdArg(a); |  | ||||||
|                 } |  | ||||||
|                 argline += '"'; |  | ||||||
|                 return [argline]; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return this.args; |  | ||||||
|     } |  | ||||||
|     _endsWith(str, end) { |  | ||||||
|         return str.endsWith(end); |  | ||||||
|     } |  | ||||||
|     _isCmdFile() { |  | ||||||
|         const upperToolPath = this.toolPath.toUpperCase(); |  | ||||||
|         return (this._endsWith(upperToolPath, '.CMD') || |  | ||||||
|             this._endsWith(upperToolPath, '.BAT')); |  | ||||||
|     } |  | ||||||
|     _windowsQuoteCmdArg(arg) { |  | ||||||
|         // for .exe, apply the normal quoting rules that libuv applies
 |  | ||||||
|         if (!this._isCmdFile()) { |  | ||||||
|             return this._uvQuoteCmdArg(arg); |  | ||||||
|         } |  | ||||||
|         // otherwise apply quoting rules specific to the cmd.exe command line parser.
 |  | ||||||
|         // the libuv rules are generic and are not designed specifically for cmd.exe
 |  | ||||||
|         // command line parser.
 |  | ||||||
|         //
 |  | ||||||
|         // for a detailed description of the cmd.exe command line parser, refer to
 |  | ||||||
|         // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912
 |  | ||||||
|         // need quotes for empty arg
 |  | ||||||
|         if (!arg) { |  | ||||||
|             return '""'; |  | ||||||
|         } |  | ||||||
|         // determine whether the arg needs to be quoted
 |  | ||||||
|         const cmdSpecialChars = [ |  | ||||||
|             ' ', |  | ||||||
|             '\t', |  | ||||||
|             '&', |  | ||||||
|             '(', |  | ||||||
|             ')', |  | ||||||
|             '[', |  | ||||||
|             ']', |  | ||||||
|             '{', |  | ||||||
|             '}', |  | ||||||
|             '^', |  | ||||||
|             '=', |  | ||||||
|             ';', |  | ||||||
|             '!', |  | ||||||
|             "'", |  | ||||||
|             '+', |  | ||||||
|             ',', |  | ||||||
|             '`', |  | ||||||
|             '~', |  | ||||||
|             '|', |  | ||||||
|             '<', |  | ||||||
|             '>', |  | ||||||
|             '"' |  | ||||||
|         ]; |  | ||||||
|         let needsQuotes = false; |  | ||||||
|         for (const char of arg) { |  | ||||||
|             if (cmdSpecialChars.some(x => x === char)) { |  | ||||||
|                 needsQuotes = true; |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // short-circuit if quotes not needed
 |  | ||||||
|         if (!needsQuotes) { |  | ||||||
|             return arg; |  | ||||||
|         } |  | ||||||
|         // the following quoting rules are very similar to the rules that by libuv applies.
 |  | ||||||
|         //
 |  | ||||||
|         // 1) wrap the string in quotes
 |  | ||||||
|         //
 |  | ||||||
|         // 2) double-up quotes - i.e. " => ""
 |  | ||||||
|         //
 |  | ||||||
|         //    this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately
 |  | ||||||
|         //    doesn't work well with a cmd.exe command line.
 |  | ||||||
|         //
 |  | ||||||
|         //    note, replacing " with "" also works well if the arg is passed to a downstream .NET console app.
 |  | ||||||
|         //    for example, the command line:
 |  | ||||||
|         //          foo.exe "myarg:""my val"""
 |  | ||||||
|         //    is parsed by a .NET console app into an arg array:
 |  | ||||||
|         //          [ "myarg:\"my val\"" ]
 |  | ||||||
|         //    which is the same end result when applying libuv quoting rules. although the actual
 |  | ||||||
|         //    command line from libuv quoting rules would look like:
 |  | ||||||
|         //          foo.exe "myarg:\"my val\""
 |  | ||||||
|         //
 |  | ||||||
|         // 3) double-up slashes that preceed a quote,
 |  | ||||||
|         //    e.g.  hello \world    => "hello \world"
 |  | ||||||
|         //          hello\"world    => "hello\\""world"
 |  | ||||||
|         //          hello\\"world   => "hello\\\\""world"
 |  | ||||||
|         //          hello world\    => "hello world\\"
 |  | ||||||
|         //
 |  | ||||||
|         //    technically this is not required for a cmd.exe command line, or the batch argument parser.
 |  | ||||||
|         //    the reasons for including this as a .cmd quoting rule are:
 |  | ||||||
|         //
 |  | ||||||
|         //    a) this is optimized for the scenario where the argument is passed from the .cmd file to an
 |  | ||||||
|         //       external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule.
 |  | ||||||
|         //
 |  | ||||||
|         //    b) it's what we've been doing previously (by deferring to node default behavior) and we
 |  | ||||||
|         //       haven't heard any complaints about that aspect.
 |  | ||||||
|         //
 |  | ||||||
|         // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be
 |  | ||||||
|         // escaped when used on the command line directly - even though within a .cmd file % can be escaped
 |  | ||||||
|         // by using %%.
 |  | ||||||
|         //
 |  | ||||||
|         // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts
 |  | ||||||
|         // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing.
 |  | ||||||
|         //
 |  | ||||||
|         // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would
 |  | ||||||
|         // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the
 |  | ||||||
|         // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args
 |  | ||||||
|         // to an external program.
 |  | ||||||
|         //
 |  | ||||||
|         // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file.
 |  | ||||||
|         // % can be escaped within a .cmd file.
 |  | ||||||
|         let reverse = '"'; |  | ||||||
|         let quoteHit = true; |  | ||||||
|         for (let i = arg.length; i > 0; i--) { |  | ||||||
|             // walk the string in reverse
 |  | ||||||
|             reverse += arg[i - 1]; |  | ||||||
|             if (quoteHit && arg[i - 1] === '\\') { |  | ||||||
|                 reverse += '\\'; // double the slash
 |  | ||||||
|             } |  | ||||||
|             else if (arg[i - 1] === '"') { |  | ||||||
|                 quoteHit = true; |  | ||||||
|                 reverse += '"'; // double the quote
 |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 quoteHit = false; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         reverse += '"'; |  | ||||||
|         return reverse |  | ||||||
|             .split('') |  | ||||||
|             .reverse() |  | ||||||
|             .join(''); |  | ||||||
|     } |  | ||||||
|     _uvQuoteCmdArg(arg) { |  | ||||||
|         // Tool runner wraps child_process.spawn() and needs to apply the same quoting as
 |  | ||||||
|         // Node in certain cases where the undocumented spawn option windowsVerbatimArguments
 |  | ||||||
|         // is used.
 |  | ||||||
|         //
 |  | ||||||
|         // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV,
 |  | ||||||
|         // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details),
 |  | ||||||
|         // pasting copyright notice from Node within this function:
 |  | ||||||
|         //
 |  | ||||||
|         //      Copyright Joyent, Inc. and other Node contributors. All rights reserved.
 |  | ||||||
|         //
 |  | ||||||
|         //      Permission is hereby granted, free of charge, to any person obtaining a copy
 |  | ||||||
|         //      of this software and associated documentation files (the "Software"), to
 |  | ||||||
|         //      deal in the Software without restriction, including without limitation the
 |  | ||||||
|         //      rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 |  | ||||||
|         //      sell copies of the Software, and to permit persons to whom the Software is
 |  | ||||||
|         //      furnished to do so, subject to the following conditions:
 |  | ||||||
|         //
 |  | ||||||
|         //      The above copyright notice and this permission notice shall be included in
 |  | ||||||
|         //      all copies or substantial portions of the Software.
 |  | ||||||
|         //
 |  | ||||||
|         //      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 |  | ||||||
|         //      IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 |  | ||||||
|         //      FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 |  | ||||||
|         //      AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 |  | ||||||
|         //      LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 |  | ||||||
|         //      FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 |  | ||||||
|         //      IN THE SOFTWARE.
 |  | ||||||
|         if (!arg) { |  | ||||||
|             // Need double quotation for empty argument
 |  | ||||||
|             return '""'; |  | ||||||
|         } |  | ||||||
|         if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { |  | ||||||
|             // No quotation needed
 |  | ||||||
|             return arg; |  | ||||||
|         } |  | ||||||
|         if (!arg.includes('"') && !arg.includes('\\')) { |  | ||||||
|             // No embedded double quotes or backslashes, so I can just wrap
 |  | ||||||
|             // quote marks around the whole thing.
 |  | ||||||
|             return `"${arg}"`; |  | ||||||
|         } |  | ||||||
|         // Expected input/output:
 |  | ||||||
|         //   input : hello"world
 |  | ||||||
|         //   output: "hello\"world"
 |  | ||||||
|         //   input : hello""world
 |  | ||||||
|         //   output: "hello\"\"world"
 |  | ||||||
|         //   input : hello\world
 |  | ||||||
|         //   output: hello\world
 |  | ||||||
|         //   input : hello\\world
 |  | ||||||
|         //   output: hello\\world
 |  | ||||||
|         //   input : hello\"world
 |  | ||||||
|         //   output: "hello\\\"world"
 |  | ||||||
|         //   input : hello\\"world
 |  | ||||||
|         //   output: "hello\\\\\"world"
 |  | ||||||
|         //   input : hello world\
 |  | ||||||
|         //   output: "hello world\\" - note the comment in libuv actually reads "hello world\"
 |  | ||||||
|         //                             but it appears the comment is wrong, it should be "hello world\\"
 |  | ||||||
|         let reverse = '"'; |  | ||||||
|         let quoteHit = true; |  | ||||||
|         for (let i = arg.length; i > 0; i--) { |  | ||||||
|             // walk the string in reverse
 |  | ||||||
|             reverse += arg[i - 1]; |  | ||||||
|             if (quoteHit && arg[i - 1] === '\\') { |  | ||||||
|                 reverse += '\\'; |  | ||||||
|             } |  | ||||||
|             else if (arg[i - 1] === '"') { |  | ||||||
|                 quoteHit = true; |  | ||||||
|                 reverse += '\\'; |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 quoteHit = false; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         reverse += '"'; |  | ||||||
|         return reverse |  | ||||||
|             .split('') |  | ||||||
|             .reverse() |  | ||||||
|             .join(''); |  | ||||||
|     } |  | ||||||
|     _cloneExecOptions(options) { |  | ||||||
|         options = options || {}; |  | ||||||
|         const result = { |  | ||||||
|             cwd: options.cwd || process.cwd(), |  | ||||||
|             env: options.env || process.env, |  | ||||||
|             silent: options.silent || false, |  | ||||||
|             windowsVerbatimArguments: options.windowsVerbatimArguments || false, |  | ||||||
|             failOnStdErr: options.failOnStdErr || false, |  | ||||||
|             ignoreReturnCode: options.ignoreReturnCode || false, |  | ||||||
|             delay: options.delay || 10000 |  | ||||||
|         }; |  | ||||||
|         result.outStream = options.outStream || process.stdout; |  | ||||||
|         result.errStream = options.errStream || process.stderr; |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|     _getSpawnOptions(options, toolPath) { |  | ||||||
|         options = options || {}; |  | ||||||
|         const result = {}; |  | ||||||
|         result.cwd = options.cwd; |  | ||||||
|         result.env = options.env; |  | ||||||
|         result['windowsVerbatimArguments'] = |  | ||||||
|             options.windowsVerbatimArguments || this._isCmdFile(); |  | ||||||
|         if (options.windowsVerbatimArguments) { |  | ||||||
|             result.argv0 = `"${toolPath}"`; |  | ||||||
|         } |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|     /** |  | ||||||
|      * Exec a tool. |  | ||||||
|      * Output will be streamed to the live console. |  | ||||||
|      * Returns promise with return code |  | ||||||
|      * |  | ||||||
|      * @param     tool     path to tool to exec |  | ||||||
|      * @param     options  optional exec options.  See ExecOptions |  | ||||||
|      * @returns   number |  | ||||||
|      */ |  | ||||||
|     exec() { |  | ||||||
|         return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|             return new Promise((resolve, reject) => { |  | ||||||
|                 this._debug(`exec tool: ${this.toolPath}`); |  | ||||||
|                 this._debug('arguments:'); |  | ||||||
|                 for (const arg of this.args) { |  | ||||||
|                     this._debug(`   ${arg}`); |  | ||||||
|                 } |  | ||||||
|                 const optionsNonNull = this._cloneExecOptions(this.options); |  | ||||||
|                 if (!optionsNonNull.silent && optionsNonNull.outStream) { |  | ||||||
|                     optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); |  | ||||||
|                 } |  | ||||||
|                 const state = new ExecState(optionsNonNull, this.toolPath); |  | ||||||
|                 state.on('debug', (message) => { |  | ||||||
|                     this._debug(message); |  | ||||||
|                 }); |  | ||||||
|                 const fileName = this._getSpawnFileName(); |  | ||||||
|                 const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); |  | ||||||
|                 const stdbuffer = ''; |  | ||||||
|                 if (cp.stdout) { |  | ||||||
|                     cp.stdout.on('data', (data) => { |  | ||||||
|                         if (this.options.listeners && this.options.listeners.stdout) { |  | ||||||
|                             this.options.listeners.stdout(data); |  | ||||||
|                         } |  | ||||||
|                         if (!optionsNonNull.silent && optionsNonNull.outStream) { |  | ||||||
|                             optionsNonNull.outStream.write(data); |  | ||||||
|                         } |  | ||||||
|                         this._processLineBuffer(data, stdbuffer, (line) => { |  | ||||||
|                             if (this.options.listeners && this.options.listeners.stdline) { |  | ||||||
|                                 this.options.listeners.stdline(line); |  | ||||||
|                             } |  | ||||||
|                         }); |  | ||||||
|                     }); |  | ||||||
|                 } |  | ||||||
|                 const errbuffer = ''; |  | ||||||
|                 if (cp.stderr) { |  | ||||||
|                     cp.stderr.on('data', (data) => { |  | ||||||
|                         state.processStderr = true; |  | ||||||
|                         if (this.options.listeners && this.options.listeners.stderr) { |  | ||||||
|                             this.options.listeners.stderr(data); |  | ||||||
|                         } |  | ||||||
|                         if (!optionsNonNull.silent && |  | ||||||
|                             optionsNonNull.errStream && |  | ||||||
|                             optionsNonNull.outStream) { |  | ||||||
|                             const s = optionsNonNull.failOnStdErr |  | ||||||
|                                 ? optionsNonNull.errStream |  | ||||||
|                                 : optionsNonNull.outStream; |  | ||||||
|                             s.write(data); |  | ||||||
|                         } |  | ||||||
|                         this._processLineBuffer(data, errbuffer, (line) => { |  | ||||||
|                             if (this.options.listeners && this.options.listeners.errline) { |  | ||||||
|                                 this.options.listeners.errline(line); |  | ||||||
|                             } |  | ||||||
|                         }); |  | ||||||
|                     }); |  | ||||||
|                 } |  | ||||||
|                 cp.on('error', (err) => { |  | ||||||
|                     state.processError = err.message; |  | ||||||
|                     state.processExited = true; |  | ||||||
|                     state.processClosed = true; |  | ||||||
|                     state.CheckComplete(); |  | ||||||
|                 }); |  | ||||||
|                 cp.on('exit', (code) => { |  | ||||||
|                     state.processExitCode = code; |  | ||||||
|                     state.processExited = true; |  | ||||||
|                     this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); |  | ||||||
|                     state.CheckComplete(); |  | ||||||
|                 }); |  | ||||||
|                 cp.on('close', (code) => { |  | ||||||
|                     state.processExitCode = code; |  | ||||||
|                     state.processExited = true; |  | ||||||
|                     state.processClosed = true; |  | ||||||
|                     this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); |  | ||||||
|                     state.CheckComplete(); |  | ||||||
|                 }); |  | ||||||
|                 state.on('done', (error, exitCode) => { |  | ||||||
|                     if (stdbuffer.length > 0) { |  | ||||||
|                         this.emit('stdline', stdbuffer); |  | ||||||
|                     } |  | ||||||
|                     if (errbuffer.length > 0) { |  | ||||||
|                         this.emit('errline', errbuffer); |  | ||||||
|                     } |  | ||||||
|                     cp.removeAllListeners(); |  | ||||||
|                     if (error) { |  | ||||||
|                         reject(error); |  | ||||||
|                     } |  | ||||||
|                     else { |  | ||||||
|                         resolve(exitCode); |  | ||||||
|                     } |  | ||||||
|                 }); |  | ||||||
|             }); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| exports.ToolRunner = ToolRunner; |  | ||||||
| /** |  | ||||||
|  * Convert an arg string to an array of args. Handles escaping |  | ||||||
|  * |  | ||||||
|  * @param    argString   string of arguments |  | ||||||
|  * @returns  string[]    array of arguments |  | ||||||
|  */ |  | ||||||
| function argStringToArray(argString) { |  | ||||||
|     const args = []; |  | ||||||
|     let inQuotes = false; |  | ||||||
|     let escaped = false; |  | ||||||
|     let arg = ''; |  | ||||||
|     function append(c) { |  | ||||||
|         // we only escape double quotes.
 |  | ||||||
|         if (escaped && c !== '"') { |  | ||||||
|             arg += '\\'; |  | ||||||
|         } |  | ||||||
|         arg += c; |  | ||||||
|         escaped = false; |  | ||||||
|     } |  | ||||||
|     for (let i = 0; i < argString.length; i++) { |  | ||||||
|         const c = argString.charAt(i); |  | ||||||
|         if (c === '"') { |  | ||||||
|             if (!escaped) { |  | ||||||
|                 inQuotes = !inQuotes; |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 append(c); |  | ||||||
|             } |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         if (c === '\\' && escaped) { |  | ||||||
|             append(c); |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         if (c === '\\' && inQuotes) { |  | ||||||
|             escaped = true; |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         if (c === ' ' && !inQuotes) { |  | ||||||
|             if (arg.length > 0) { |  | ||||||
|                 args.push(arg); |  | ||||||
|                 arg = ''; |  | ||||||
|             } |  | ||||||
|             continue; |  | ||||||
|         } |  | ||||||
|         append(c); |  | ||||||
|     } |  | ||||||
|     if (arg.length > 0) { |  | ||||||
|         args.push(arg.trim()); |  | ||||||
|     } |  | ||||||
|     return args; |  | ||||||
| } |  | ||||||
| exports.argStringToArray = argStringToArray; |  | ||||||
| class ExecState extends events.EventEmitter { |  | ||||||
|     constructor(options, toolPath) { |  | ||||||
|         super(); |  | ||||||
|         this.processClosed = false; // tracks whether the process has exited and stdio is closed
 |  | ||||||
|         this.processError = ''; |  | ||||||
|         this.processExitCode = 0; |  | ||||||
|         this.processExited = false; // tracks whether the process has exited
 |  | ||||||
|         this.processStderr = false; // tracks whether stderr was written to
 |  | ||||||
|         this.delay = 10000; // 10 seconds
 |  | ||||||
|         this.done = false; |  | ||||||
|         this.timeout = null; |  | ||||||
|         if (!toolPath) { |  | ||||||
|             throw new Error('toolPath must not be empty'); |  | ||||||
|         } |  | ||||||
|         this.options = options; |  | ||||||
|         this.toolPath = toolPath; |  | ||||||
|         if (options.delay) { |  | ||||||
|             this.delay = options.delay; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     CheckComplete() { |  | ||||||
|         if (this.done) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (this.processClosed) { |  | ||||||
|             this._setResult(); |  | ||||||
|         } |  | ||||||
|         else if (this.processExited) { |  | ||||||
|             this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     _debug(message) { |  | ||||||
|         this.emit('debug', message); |  | ||||||
|     } |  | ||||||
|     _setResult() { |  | ||||||
|         // determine whether there is an error
 |  | ||||||
|         let error; |  | ||||||
|         if (this.processExited) { |  | ||||||
|             if (this.processError) { |  | ||||||
|                 error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); |  | ||||||
|             } |  | ||||||
|             else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { |  | ||||||
|                 error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); |  | ||||||
|             } |  | ||||||
|             else if (this.processStderr && this.options.failOnStdErr) { |  | ||||||
|                 error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // clear the timeout
 |  | ||||||
|         if (this.timeout) { |  | ||||||
|             clearTimeout(this.timeout); |  | ||||||
|             this.timeout = null; |  | ||||||
|         } |  | ||||||
|         this.done = true; |  | ||||||
|         this.emit('done', error, this.processExitCode); |  | ||||||
|     } |  | ||||||
|     static HandleTimeout(state) { |  | ||||||
|         if (state.done) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         if (!state.processClosed && state.processExited) { |  | ||||||
|             const message = `The STDIO streams did not close within ${state.delay / |  | ||||||
|                 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;
 |  | ||||||
|             state._debug(message); |  | ||||||
|         } |  | ||||||
|         state._setResult(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| //# sourceMappingURL=toolrunner.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/exec/lib/toolrunner.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/exec/lib/toolrunner.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										63
									
								
								node_modules/@actions/exec/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								node_modules/@actions/exec/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,63 +0,0 @@ | |||||||
| { |  | ||||||
|   "_from": "@actions/exec@^1.0.0", |  | ||||||
|   "_id": "@actions/exec@1.0.0", |  | ||||||
|   "_inBundle": false, |  | ||||||
|   "_integrity": "sha512-nquH0+XKng+Ll7rZfCojN7NWSbnGh+ltwUJhzfbLkmOJgxocGX2/yXcZLMyT9fa7+tByEow/NSTrBExNlEj9fw==", |  | ||||||
|   "_location": "/@actions/exec", |  | ||||||
|   "_phantomChildren": {}, |  | ||||||
|   "_requested": { |  | ||||||
|     "type": "range", |  | ||||||
|     "registry": true, |  | ||||||
|     "raw": "@actions/exec@^1.0.0", |  | ||||||
|     "name": "@actions/exec", |  | ||||||
|     "escapedName": "@actions%2fexec", |  | ||||||
|     "scope": "@actions", |  | ||||||
|     "rawSpec": "^1.0.0", |  | ||||||
|     "saveSpec": null, |  | ||||||
|     "fetchSpec": "^1.0.0" |  | ||||||
|   }, |  | ||||||
|   "_requiredBy": [ |  | ||||||
|     "/@actions/tool-cache" |  | ||||||
|   ], |  | ||||||
|   "_resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.0.tgz", |  | ||||||
|   "_shasum": "70c8b698c9baa02965c07da5f0b185ca56f0a955", |  | ||||||
|   "_spec": "@actions/exec@^1.0.0", |  | ||||||
|   "_where": "C:\\Users\\damccorm\\Documents\\setup-python\\node_modules\\@actions\\tool-cache", |  | ||||||
|   "bugs": { |  | ||||||
|     "url": "https://github.com/actions/toolkit/issues" |  | ||||||
|   }, |  | ||||||
|   "bundleDependencies": false, |  | ||||||
|   "deprecated": false, |  | ||||||
|   "description": "Actions exec lib", |  | ||||||
|   "devDependencies": { |  | ||||||
|     "@actions/io": "^1.0.0" |  | ||||||
|   }, |  | ||||||
|   "directories": { |  | ||||||
|     "lib": "lib", |  | ||||||
|     "test": "__tests__" |  | ||||||
|   }, |  | ||||||
|   "files": [ |  | ||||||
|     "lib" |  | ||||||
|   ], |  | ||||||
|   "gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55", |  | ||||||
|   "homepage": "https://github.com/actions/toolkit/tree/master/packages/exec", |  | ||||||
|   "keywords": [ |  | ||||||
|     "exec", |  | ||||||
|     "actions" |  | ||||||
|   ], |  | ||||||
|   "license": "MIT", |  | ||||||
|   "main": "lib/exec.js", |  | ||||||
|   "name": "@actions/exec", |  | ||||||
|   "publishConfig": { |  | ||||||
|     "access": "public" |  | ||||||
|   }, |  | ||||||
|   "repository": { |  | ||||||
|     "type": "git", |  | ||||||
|     "url": "git+https://github.com/actions/toolkit.git" |  | ||||||
|   }, |  | ||||||
|   "scripts": { |  | ||||||
|     "test": "echo \"Error: run tests from root\" && exit 1", |  | ||||||
|     "tsc": "tsc" |  | ||||||
|   }, |  | ||||||
|   "version": "1.0.0" |  | ||||||
| } |  | ||||||
							
								
								
									
										53
									
								
								node_modules/@actions/io/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								node_modules/@actions/io/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,53 +0,0 @@ | |||||||
| # `@actions/io` |  | ||||||
| 
 |  | ||||||
| > Core functions for cli filesystem scenarios |  | ||||||
| 
 |  | ||||||
| ## Usage |  | ||||||
| 
 |  | ||||||
| #### mkdir -p |  | ||||||
| 
 |  | ||||||
| Recursively make a directory. Follows rules specified in [man mkdir](https://linux.die.net/man/1/mkdir) with the `-p` option specified: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const io = require('@actions/io'); |  | ||||||
| 
 |  | ||||||
| await io.mkdirP('path/to/make'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### cp/mv |  | ||||||
| 
 |  | ||||||
| Copy or move files or folders. Follows rules specified in [man cp](https://linux.die.net/man/1/cp) and [man mv](https://linux.die.net/man/1/mv): |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const io = require('@actions/io'); |  | ||||||
| 
 |  | ||||||
| // Recursive must be true for directories |  | ||||||
| const options = { recursive: true, force: false } |  | ||||||
| 
 |  | ||||||
| await io.cp('path/to/directory', 'path/to/dest', options); |  | ||||||
| await io.mv('path/to/file', 'path/to/dest'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### rm -rf |  | ||||||
| 
 |  | ||||||
| Remove a file or folder recursively. Follows rules specified in [man rm](https://linux.die.net/man/1/rm) with the `-r` and `-f` rules specified. |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const io = require('@actions/io'); |  | ||||||
| 
 |  | ||||||
| await io.rmRF('path/to/directory'); |  | ||||||
| await io.rmRF('path/to/file'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### which |  | ||||||
| 
 |  | ||||||
| Get the path to a tool and resolves via paths. Follows the rules specified in [man which](https://linux.die.net/man/1/which). |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const exec = require('@actions/exec'); |  | ||||||
| const io = require('@actions/io'); |  | ||||||
| 
 |  | ||||||
| const pythonPath: string = await io.which('python', true) |  | ||||||
| 
 |  | ||||||
| await exec.exec(`"${pythonPath}"`, ['main.py']); |  | ||||||
| ``` |  | ||||||
							
								
								
									
										29
									
								
								node_modules/@actions/io/lib/io-util.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								node_modules/@actions/io/lib/io-util.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,29 +0,0 @@ | |||||||
| /// <reference types="node" />
 |  | ||||||
| import * as fs from 'fs'; |  | ||||||
| export declare const chmod: typeof fs.promises.chmod, copyFile: typeof fs.promises.copyFile, lstat: typeof fs.promises.lstat, mkdir: typeof fs.promises.mkdir, readdir: typeof fs.promises.readdir, readlink: typeof fs.promises.readlink, rename: typeof fs.promises.rename, rmdir: typeof fs.promises.rmdir, stat: typeof fs.promises.stat, symlink: typeof fs.promises.symlink, unlink: typeof fs.promises.unlink; |  | ||||||
| export declare const IS_WINDOWS: boolean; |  | ||||||
| export declare function exists(fsPath: string): Promise<boolean>; |  | ||||||
| export declare function isDirectory(fsPath: string, useStat?: boolean): Promise<boolean>; |  | ||||||
| /** |  | ||||||
|  * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: |  | ||||||
|  * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). |  | ||||||
|  */ |  | ||||||
| export declare function isRooted(p: string): boolean; |  | ||||||
| /** |  | ||||||
|  * Recursively create a directory at `fsPath`. |  | ||||||
|  * |  | ||||||
|  * This implementation is optimistic, meaning it attempts to create the full |  | ||||||
|  * path first, and backs up the path stack from there. |  | ||||||
|  * |  | ||||||
|  * @param fsPath The path to create |  | ||||||
|  * @param maxDepth The maximum recursion depth |  | ||||||
|  * @param depth The current recursion depth |  | ||||||
|  */ |  | ||||||
| export declare function mkdirP(fsPath: string, maxDepth?: number, depth?: number): Promise<void>; |  | ||||||
| /** |  | ||||||
|  * Best effort attempt to determine whether a file exists and is executable. |  | ||||||
|  * @param filePath    file path to check |  | ||||||
|  * @param extensions  additional file extensions to try |  | ||||||
|  * @return if file exists and is executable, returns the file path. otherwise empty string. |  | ||||||
|  */ |  | ||||||
| export declare function tryGetExecutablePath(filePath: string, extensions: string[]): Promise<string>; |  | ||||||
							
								
								
									
										194
									
								
								node_modules/@actions/io/lib/io-util.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										194
									
								
								node_modules/@actions/io/lib/io-util.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,194 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { |  | ||||||
|     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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } |  | ||||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| var _a; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| const assert_1 = require("assert"); |  | ||||||
| const fs = require("fs"); |  | ||||||
| const path = require("path"); |  | ||||||
| _a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; |  | ||||||
| exports.IS_WINDOWS = process.platform === 'win32'; |  | ||||||
| function exists(fsPath) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         try { |  | ||||||
|             yield exports.stat(fsPath); |  | ||||||
|         } |  | ||||||
|         catch (err) { |  | ||||||
|             if (err.code === 'ENOENT') { |  | ||||||
|                 return false; |  | ||||||
|             } |  | ||||||
|             throw err; |  | ||||||
|         } |  | ||||||
|         return true; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.exists = exists; |  | ||||||
| function isDirectory(fsPath, useStat = false) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); |  | ||||||
|         return stats.isDirectory(); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.isDirectory = isDirectory; |  | ||||||
| /** |  | ||||||
|  * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: |  | ||||||
|  * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). |  | ||||||
|  */ |  | ||||||
| function isRooted(p) { |  | ||||||
|     p = normalizeSeparators(p); |  | ||||||
|     if (!p) { |  | ||||||
|         throw new Error('isRooted() parameter "p" cannot be empty'); |  | ||||||
|     } |  | ||||||
|     if (exports.IS_WINDOWS) { |  | ||||||
|         return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello
 |  | ||||||
|         ); // e.g. C: or C:\hello
 |  | ||||||
|     } |  | ||||||
|     return p.startsWith('/'); |  | ||||||
| } |  | ||||||
| exports.isRooted = isRooted; |  | ||||||
| /** |  | ||||||
|  * Recursively create a directory at `fsPath`. |  | ||||||
|  * |  | ||||||
|  * This implementation is optimistic, meaning it attempts to create the full |  | ||||||
|  * path first, and backs up the path stack from there. |  | ||||||
|  * |  | ||||||
|  * @param fsPath The path to create |  | ||||||
|  * @param maxDepth The maximum recursion depth |  | ||||||
|  * @param depth The current recursion depth |  | ||||||
|  */ |  | ||||||
| function mkdirP(fsPath, maxDepth = 1000, depth = 1) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         assert_1.ok(fsPath, 'a path argument must be provided'); |  | ||||||
|         fsPath = path.resolve(fsPath); |  | ||||||
|         if (depth >= maxDepth) |  | ||||||
|             return exports.mkdir(fsPath); |  | ||||||
|         try { |  | ||||||
|             yield exports.mkdir(fsPath); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         catch (err) { |  | ||||||
|             switch (err.code) { |  | ||||||
|                 case 'ENOENT': { |  | ||||||
|                     yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1); |  | ||||||
|                     yield exports.mkdir(fsPath); |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 default: { |  | ||||||
|                     let stats; |  | ||||||
|                     try { |  | ||||||
|                         stats = yield exports.stat(fsPath); |  | ||||||
|                     } |  | ||||||
|                     catch (err2) { |  | ||||||
|                         throw err; |  | ||||||
|                     } |  | ||||||
|                     if (!stats.isDirectory()) |  | ||||||
|                         throw err; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.mkdirP = mkdirP; |  | ||||||
| /** |  | ||||||
|  * Best effort attempt to determine whether a file exists and is executable. |  | ||||||
|  * @param filePath    file path to check |  | ||||||
|  * @param extensions  additional file extensions to try |  | ||||||
|  * @return if file exists and is executable, returns the file path. otherwise empty string. |  | ||||||
|  */ |  | ||||||
| function tryGetExecutablePath(filePath, extensions) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         let stats = undefined; |  | ||||||
|         try { |  | ||||||
|             // test file exists
 |  | ||||||
|             stats = yield exports.stat(filePath); |  | ||||||
|         } |  | ||||||
|         catch (err) { |  | ||||||
|             if (err.code !== 'ENOENT') { |  | ||||||
|                 // eslint-disable-next-line no-console
 |  | ||||||
|                 console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         if (stats && stats.isFile()) { |  | ||||||
|             if (exports.IS_WINDOWS) { |  | ||||||
|                 // on Windows, test for valid extension
 |  | ||||||
|                 const upperExt = path.extname(filePath).toUpperCase(); |  | ||||||
|                 if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { |  | ||||||
|                     return filePath; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 if (isUnixExecutable(stats)) { |  | ||||||
|                     return filePath; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // try each extension
 |  | ||||||
|         const originalFilePath = filePath; |  | ||||||
|         for (const extension of extensions) { |  | ||||||
|             filePath = originalFilePath + extension; |  | ||||||
|             stats = undefined; |  | ||||||
|             try { |  | ||||||
|                 stats = yield exports.stat(filePath); |  | ||||||
|             } |  | ||||||
|             catch (err) { |  | ||||||
|                 if (err.code !== 'ENOENT') { |  | ||||||
|                     // eslint-disable-next-line no-console
 |  | ||||||
|                     console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             if (stats && stats.isFile()) { |  | ||||||
|                 if (exports.IS_WINDOWS) { |  | ||||||
|                     // preserve the case of the actual file (since an extension was appended)
 |  | ||||||
|                     try { |  | ||||||
|                         const directory = path.dirname(filePath); |  | ||||||
|                         const upperName = path.basename(filePath).toUpperCase(); |  | ||||||
|                         for (const actualName of yield exports.readdir(directory)) { |  | ||||||
|                             if (upperName === actualName.toUpperCase()) { |  | ||||||
|                                 filePath = path.join(directory, actualName); |  | ||||||
|                                 break; |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     catch (err) { |  | ||||||
|                         // eslint-disable-next-line no-console
 |  | ||||||
|                         console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); |  | ||||||
|                     } |  | ||||||
|                     return filePath; |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     if (isUnixExecutable(stats)) { |  | ||||||
|                         return filePath; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return ''; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.tryGetExecutablePath = tryGetExecutablePath; |  | ||||||
| function normalizeSeparators(p) { |  | ||||||
|     p = p || ''; |  | ||||||
|     if (exports.IS_WINDOWS) { |  | ||||||
|         // convert slashes on Windows
 |  | ||||||
|         p = p.replace(/\//g, '\\'); |  | ||||||
|         // remove redundant slashes
 |  | ||||||
|         return p.replace(/\\\\+/g, '\\'); |  | ||||||
|     } |  | ||||||
|     // remove redundant slashes
 |  | ||||||
|     return p.replace(/\/\/+/g, '/'); |  | ||||||
| } |  | ||||||
| // on Mac/Linux, test the execute bit
 |  | ||||||
| //     R   W  X  R  W X R W X
 |  | ||||||
| //   256 128 64 32 16 8 4 2 1
 |  | ||||||
| function isUnixExecutable(stats) { |  | ||||||
|     return ((stats.mode & 1) > 0 || |  | ||||||
|         ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || |  | ||||||
|         ((stats.mode & 64) > 0 && stats.uid === process.getuid())); |  | ||||||
| } |  | ||||||
| //# sourceMappingURL=io-util.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/io/lib/io-util.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/io/lib/io-util.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| {"version":3,"file":"io-util.js","sourceRoot":"","sources":["../src/io-util.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mCAAyB;AACzB,yBAAwB;AACxB,6BAA4B;AAEf,gBAYE,qTAAA;AAEF,QAAA,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAA;AAEtD,SAAsB,MAAM,CAAC,MAAc;;QACzC,IAAI;YACF,MAAM,YAAI,CAAC,MAAM,CAAC,CAAA;SACnB;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACzB,OAAO,KAAK,CAAA;aACb;YAED,MAAM,GAAG,CAAA;SACV;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CAAA;AAZD,wBAYC;AAED,SAAsB,WAAW,CAC/B,MAAc,EACd,UAAmB,KAAK;;QAExB,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,YAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;QAChE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;IAC5B,CAAC;CAAA;AAND,kCAMC;AAED;;;GAGG;AACH,SAAgB,QAAQ,CAAC,CAAS;IAChC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,CAAC,CAAC,EAAE;QACN,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;KAC5D;IAED,IAAI,kBAAU,EAAE;QACd,OAAO,CACL,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,8BAA8B;SACxE,CAAA,CAAC,sBAAsB;KACzB;IAED,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAbD,4BAaC;AAED;;;;;;;;;GASG;AACH,SAAsB,MAAM,CAC1B,MAAc,EACd,WAAmB,IAAI,EACvB,QAAgB,CAAC;;QAEjB,WAAE,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAA;QAE9C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAE7B,IAAI,KAAK,IAAI,QAAQ;YAAE,OAAO,aAAK,CAAC,MAAM,CAAC,CAAA;QAE3C,IAAI;YACF,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;YACnB,OAAM;SACP;QAAC,OAAO,GAAG,EAAE;YACZ,QAAQ,GAAG,CAAC,IAAI,EAAE;gBAChB,KAAK,QAAQ,CAAC,CAAC;oBACb,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;oBACvD,MAAM,aAAK,CAAC,MAAM,CAAC,CAAA;oBACnB,OAAM;iBACP;gBACD,OAAO,CAAC,CAAC;oBACP,IAAI,KAAe,CAAA;oBAEnB,IAAI;wBACF,KAAK,GAAG,MAAM,YAAI,CAAC,MAAM,CAAC,CAAA;qBAC3B;oBAAC,OAAO,IAAI,EAAE;wBACb,MAAM,GAAG,CAAA;qBACV;oBAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBAAE,MAAM,GAAG,CAAA;iBACpC;aACF;SACF;IACH,CAAC;CAAA;AAlCD,wBAkCC;AAED;;;;;GAKG;AACH,SAAsB,oBAAoB,CACxC,QAAgB,EAChB,UAAoB;;QAEpB,IAAI,KAAK,GAAyB,SAAS,CAAA;QAC3C,IAAI;YACF,mBAAmB;YACnB,KAAK,GAAG,MAAM,YAAI,CAAC,QAAQ,CAAC,CAAA;SAC7B;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACzB,sCAAsC;gBACtC,OAAO,CAAC,GAAG,CACT,uEAAuE,QAAQ,MAAM,GAAG,EAAE,CAC3F,CAAA;aACF;SACF;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;YAC3B,IAAI,kBAAU,EAAE;gBACd,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;gBACrD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,EAAE;oBACpE,OAAO,QAAQ,CAAA;iBAChB;aACF;iBAAM;gBACL,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;oBAC3B,OAAO,QAAQ,CAAA;iBAChB;aACF;SACF;QAED,qBAAqB;QACrB,MAAM,gBAAgB,GAAG,QAAQ,CAAA;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,QAAQ,GAAG,gBAAgB,GAAG,SAAS,CAAA;YAEvC,KAAK,GAAG,SAAS,CAAA;YACjB,IAAI;gBACF,KAAK,GAAG,MAAM,YAAI,CAAC,QAAQ,CAAC,CAAA;aAC7B;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,sCAAsC;oBACtC,OAAO,CAAC,GAAG,CACT,uEAAuE,QAAQ,MAAM,GAAG,EAAE,CAC3F,CAAA;iBACF;aACF;YAED,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;gBAC3B,IAAI,kBAAU,EAAE;oBACd,yEAAyE;oBACzE,IAAI;wBACF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;wBACxC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;wBACvD,KAAK,MAAM,UAAU,IAAI,MAAM,eAAO,CAAC,SAAS,CAAC,EAAE;4BACjD,IAAI,SAAS,KAAK,UAAU,CAAC,WAAW,EAAE,EAAE;gCAC1C,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;gCAC3C,MAAK;6BACN;yBACF;qBACF;oBAAC,OAAO,GAAG,EAAE;wBACZ,sCAAsC;wBACtC,OAAO,CAAC,GAAG,CACT,yEAAyE,QAAQ,MAAM,GAAG,EAAE,CAC7F,CAAA;qBACF;oBAED,OAAO,QAAQ,CAAA;iBAChB;qBAAM;oBACL,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;wBAC3B,OAAO,QAAQ,CAAA;qBAChB;iBACF;aACF;SACF;QAED,OAAO,EAAE,CAAA;IACX,CAAC;CAAA;AA5ED,oDA4EC;AAED,SAAS,mBAAmB,CAAC,CAAS;IACpC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IACX,IAAI,kBAAU,EAAE;QACd,6BAA6B;QAC7B,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAE1B,2BAA2B;QAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;KACjC;IAED,2BAA2B;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;AACjC,CAAC;AAED,qCAAqC;AACrC,6BAA6B;AAC7B,6BAA6B;AAC7B,SAAS,gBAAgB,CAAC,KAAe;IACvC,OAAO,CACL,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACxD,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAC1D,CAAA;AACH,CAAC"} |  | ||||||
							
								
								
									
										56
									
								
								node_modules/@actions/io/lib/io.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										56
									
								
								node_modules/@actions/io/lib/io.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,56 +0,0 @@ | |||||||
| /** |  | ||||||
|  * Interface for cp/mv options |  | ||||||
|  */ |  | ||||||
| export interface CopyOptions { |  | ||||||
|     /** Optional. Whether to recursively copy all subdirectories. Defaults to false */ |  | ||||||
|     recursive?: boolean; |  | ||||||
|     /** Optional. Whether to overwrite existing files in the destination. Defaults to true */ |  | ||||||
|     force?: boolean; |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Interface for cp/mv options |  | ||||||
|  */ |  | ||||||
| export interface MoveOptions { |  | ||||||
|     /** Optional. Whether to overwrite existing files in the destination. Defaults to true */ |  | ||||||
|     force?: boolean; |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Copies a file or folder. |  | ||||||
|  * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
 |  | ||||||
|  * |  | ||||||
|  * @param     source    source path |  | ||||||
|  * @param     dest      destination path |  | ||||||
|  * @param     options   optional. See CopyOptions. |  | ||||||
|  */ |  | ||||||
| export declare function cp(source: string, dest: string, options?: CopyOptions): Promise<void>; |  | ||||||
| /** |  | ||||||
|  * Moves a path. |  | ||||||
|  * |  | ||||||
|  * @param     source    source path |  | ||||||
|  * @param     dest      destination path |  | ||||||
|  * @param     options   optional. See MoveOptions. |  | ||||||
|  */ |  | ||||||
| export declare function mv(source: string, dest: string, options?: MoveOptions): Promise<void>; |  | ||||||
| /** |  | ||||||
|  * Remove a path recursively with force |  | ||||||
|  * |  | ||||||
|  * @param inputPath path to remove |  | ||||||
|  */ |  | ||||||
| export declare function rmRF(inputPath: string): Promise<void>; |  | ||||||
| /** |  | ||||||
|  * Make a directory.  Creates the full path with folders in between |  | ||||||
|  * Will throw if it fails |  | ||||||
|  * |  | ||||||
|  * @param   fsPath        path to create |  | ||||||
|  * @returns Promise<void> |  | ||||||
|  */ |  | ||||||
| export declare function mkdirP(fsPath: string): Promise<void>; |  | ||||||
| /** |  | ||||||
|  * Returns path of a tool had the tool actually been invoked.  Resolves via paths. |  | ||||||
|  * If you check and the tool does not exist, it will throw. |  | ||||||
|  * |  | ||||||
|  * @param     tool              name of the tool |  | ||||||
|  * @param     check             whether to check if tool exists |  | ||||||
|  * @returns   Promise<string>   path to tool |  | ||||||
|  */ |  | ||||||
| export declare function which(tool: string, check?: boolean): Promise<string>; |  | ||||||
							
								
								
									
										289
									
								
								node_modules/@actions/io/lib/io.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										289
									
								
								node_modules/@actions/io/lib/io.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,289 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { |  | ||||||
|     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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } |  | ||||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| const childProcess = require("child_process"); |  | ||||||
| const path = require("path"); |  | ||||||
| const util_1 = require("util"); |  | ||||||
| const ioUtil = require("./io-util"); |  | ||||||
| const exec = util_1.promisify(childProcess.exec); |  | ||||||
| /** |  | ||||||
|  * Copies a file or folder. |  | ||||||
|  * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
 |  | ||||||
|  * |  | ||||||
|  * @param     source    source path |  | ||||||
|  * @param     dest      destination path |  | ||||||
|  * @param     options   optional. See CopyOptions. |  | ||||||
|  */ |  | ||||||
| function cp(source, dest, options = {}) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const { force, recursive } = readCopyOptions(options); |  | ||||||
|         const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; |  | ||||||
|         // Dest is an existing file, but not forcing
 |  | ||||||
|         if (destStat && destStat.isFile() && !force) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         // If dest is an existing directory, should copy inside.
 |  | ||||||
|         const newDest = destStat && destStat.isDirectory() |  | ||||||
|             ? path.join(dest, path.basename(source)) |  | ||||||
|             : dest; |  | ||||||
|         if (!(yield ioUtil.exists(source))) { |  | ||||||
|             throw new Error(`no such file or directory: ${source}`); |  | ||||||
|         } |  | ||||||
|         const sourceStat = yield ioUtil.stat(source); |  | ||||||
|         if (sourceStat.isDirectory()) { |  | ||||||
|             if (!recursive) { |  | ||||||
|                 throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 yield cpDirRecursive(source, newDest, 0, force); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             if (path.relative(source, newDest) === '') { |  | ||||||
|                 // a file cannot be copied to itself
 |  | ||||||
|                 throw new Error(`'${newDest}' and '${source}' are the same file`); |  | ||||||
|             } |  | ||||||
|             yield copyFile(source, newDest, force); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.cp = cp; |  | ||||||
| /** |  | ||||||
|  * Moves a path. |  | ||||||
|  * |  | ||||||
|  * @param     source    source path |  | ||||||
|  * @param     dest      destination path |  | ||||||
|  * @param     options   optional. See MoveOptions. |  | ||||||
|  */ |  | ||||||
| function mv(source, dest, options = {}) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         if (yield ioUtil.exists(dest)) { |  | ||||||
|             let destExists = true; |  | ||||||
|             if (yield ioUtil.isDirectory(dest)) { |  | ||||||
|                 // If dest is directory copy src into dest
 |  | ||||||
|                 dest = path.join(dest, path.basename(source)); |  | ||||||
|                 destExists = yield ioUtil.exists(dest); |  | ||||||
|             } |  | ||||||
|             if (destExists) { |  | ||||||
|                 if (options.force == null || options.force) { |  | ||||||
|                     yield rmRF(dest); |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     throw new Error('Destination already exists'); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         yield mkdirP(path.dirname(dest)); |  | ||||||
|         yield ioUtil.rename(source, dest); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.mv = mv; |  | ||||||
| /** |  | ||||||
|  * Remove a path recursively with force |  | ||||||
|  * |  | ||||||
|  * @param inputPath path to remove |  | ||||||
|  */ |  | ||||||
| function rmRF(inputPath) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         if (ioUtil.IS_WINDOWS) { |  | ||||||
|             // Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another
 |  | ||||||
|             // program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.
 |  | ||||||
|             try { |  | ||||||
|                 if (yield ioUtil.isDirectory(inputPath, true)) { |  | ||||||
|                     yield exec(`rd /s /q "${inputPath}"`); |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     yield exec(`del /f /a "${inputPath}"`); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             catch (err) { |  | ||||||
|                 // if you try to delete a file that doesn't exist, desired result is achieved
 |  | ||||||
|                 // other errors are valid
 |  | ||||||
|                 if (err.code !== 'ENOENT') |  | ||||||
|                     throw err; |  | ||||||
|             } |  | ||||||
|             // Shelling out fails to remove a symlink folder with missing source, this unlink catches that
 |  | ||||||
|             try { |  | ||||||
|                 yield ioUtil.unlink(inputPath); |  | ||||||
|             } |  | ||||||
|             catch (err) { |  | ||||||
|                 // if you try to delete a file that doesn't exist, desired result is achieved
 |  | ||||||
|                 // other errors are valid
 |  | ||||||
|                 if (err.code !== 'ENOENT') |  | ||||||
|                     throw err; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             let isDir = false; |  | ||||||
|             try { |  | ||||||
|                 isDir = yield ioUtil.isDirectory(inputPath); |  | ||||||
|             } |  | ||||||
|             catch (err) { |  | ||||||
|                 // if you try to delete a file that doesn't exist, desired result is achieved
 |  | ||||||
|                 // other errors are valid
 |  | ||||||
|                 if (err.code !== 'ENOENT') |  | ||||||
|                     throw err; |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             if (isDir) { |  | ||||||
|                 yield exec(`rm -rf "${inputPath}"`); |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 yield ioUtil.unlink(inputPath); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.rmRF = rmRF; |  | ||||||
| /** |  | ||||||
|  * Make a directory.  Creates the full path with folders in between |  | ||||||
|  * Will throw if it fails |  | ||||||
|  * |  | ||||||
|  * @param   fsPath        path to create |  | ||||||
|  * @returns Promise<void> |  | ||||||
|  */ |  | ||||||
| function mkdirP(fsPath) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         yield ioUtil.mkdirP(fsPath); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.mkdirP = mkdirP; |  | ||||||
| /** |  | ||||||
|  * Returns path of a tool had the tool actually been invoked.  Resolves via paths. |  | ||||||
|  * If you check and the tool does not exist, it will throw. |  | ||||||
|  * |  | ||||||
|  * @param     tool              name of the tool |  | ||||||
|  * @param     check             whether to check if tool exists |  | ||||||
|  * @returns   Promise<string>   path to tool |  | ||||||
|  */ |  | ||||||
| function which(tool, check) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         if (!tool) { |  | ||||||
|             throw new Error("parameter 'tool' is required"); |  | ||||||
|         } |  | ||||||
|         // recursive when check=true
 |  | ||||||
|         if (check) { |  | ||||||
|             const result = yield which(tool, false); |  | ||||||
|             if (!result) { |  | ||||||
|                 if (ioUtil.IS_WINDOWS) { |  | ||||||
|                     throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         try { |  | ||||||
|             // build the list of extensions to try
 |  | ||||||
|             const extensions = []; |  | ||||||
|             if (ioUtil.IS_WINDOWS && process.env.PATHEXT) { |  | ||||||
|                 for (const extension of process.env.PATHEXT.split(path.delimiter)) { |  | ||||||
|                     if (extension) { |  | ||||||
|                         extensions.push(extension); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             // if it's rooted, return it if exists. otherwise return empty.
 |  | ||||||
|             if (ioUtil.isRooted(tool)) { |  | ||||||
|                 const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); |  | ||||||
|                 if (filePath) { |  | ||||||
|                     return filePath; |  | ||||||
|                 } |  | ||||||
|                 return ''; |  | ||||||
|             } |  | ||||||
|             // if any path separators, return empty
 |  | ||||||
|             if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) { |  | ||||||
|                 return ''; |  | ||||||
|             } |  | ||||||
|             // build the list of directories
 |  | ||||||
|             //
 |  | ||||||
|             // Note, technically "where" checks the current directory on Windows. From a task lib perspective,
 |  | ||||||
|             // it feels like we should not do this. Checking the current directory seems like more of a use
 |  | ||||||
|             // case of a shell, and the which() function exposed by the task lib should strive for consistency
 |  | ||||||
|             // across platforms.
 |  | ||||||
|             const directories = []; |  | ||||||
|             if (process.env.PATH) { |  | ||||||
|                 for (const p of process.env.PATH.split(path.delimiter)) { |  | ||||||
|                     if (p) { |  | ||||||
|                         directories.push(p); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             // return the first match
 |  | ||||||
|             for (const directory of directories) { |  | ||||||
|                 const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions); |  | ||||||
|                 if (filePath) { |  | ||||||
|                     return filePath; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             return ''; |  | ||||||
|         } |  | ||||||
|         catch (err) { |  | ||||||
|             throw new Error(`which failed with message ${err.message}`); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.which = which; |  | ||||||
| function readCopyOptions(options) { |  | ||||||
|     const force = options.force == null ? true : options.force; |  | ||||||
|     const recursive = Boolean(options.recursive); |  | ||||||
|     return { force, recursive }; |  | ||||||
| } |  | ||||||
| function cpDirRecursive(sourceDir, destDir, currentDepth, force) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         // Ensure there is not a run away recursive copy
 |  | ||||||
|         if (currentDepth >= 255) |  | ||||||
|             return; |  | ||||||
|         currentDepth++; |  | ||||||
|         yield mkdirP(destDir); |  | ||||||
|         const files = yield ioUtil.readdir(sourceDir); |  | ||||||
|         for (const fileName of files) { |  | ||||||
|             const srcFile = `${sourceDir}/${fileName}`; |  | ||||||
|             const destFile = `${destDir}/${fileName}`; |  | ||||||
|             const srcFileStat = yield ioUtil.lstat(srcFile); |  | ||||||
|             if (srcFileStat.isDirectory()) { |  | ||||||
|                 // Recurse
 |  | ||||||
|                 yield cpDirRecursive(srcFile, destFile, currentDepth, force); |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 yield copyFile(srcFile, destFile, force); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         // Change the mode for the newly created directory
 |  | ||||||
|         yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| // Buffered file copy
 |  | ||||||
| function copyFile(srcFile, destFile, force) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { |  | ||||||
|             // unlink/re-link it
 |  | ||||||
|             try { |  | ||||||
|                 yield ioUtil.lstat(destFile); |  | ||||||
|                 yield ioUtil.unlink(destFile); |  | ||||||
|             } |  | ||||||
|             catch (e) { |  | ||||||
|                 // Try to override file permission
 |  | ||||||
|                 if (e.code === 'EPERM') { |  | ||||||
|                     yield ioUtil.chmod(destFile, '0666'); |  | ||||||
|                     yield ioUtil.unlink(destFile); |  | ||||||
|                 } |  | ||||||
|                 // other errors = it doesn't exist, no work to do
 |  | ||||||
|             } |  | ||||||
|             // Copy over symlink
 |  | ||||||
|             const symlinkFull = yield ioUtil.readlink(srcFile); |  | ||||||
|             yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null); |  | ||||||
|         } |  | ||||||
|         else if (!(yield ioUtil.exists(destFile)) || force) { |  | ||||||
|             yield ioUtil.copyFile(srcFile, destFile); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| //# sourceMappingURL=io.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/io/lib/io.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/io/lib/io.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										61
									
								
								node_modules/@actions/io/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										61
									
								
								node_modules/@actions/io/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,61 +0,0 @@ | |||||||
| { |  | ||||||
|   "_from": "@actions/io@^1.0.0", |  | ||||||
|   "_id": "@actions/io@1.0.0", |  | ||||||
|   "_inBundle": false, |  | ||||||
|   "_integrity": "sha512-ezrJSRdqtXtdx1WXlfYL85+40F7gB39jCK9P0jZVODW3W6xUYmu6ZOEc/UmmElUwhRyDRm1R4yNZu1Joq2kuQg==", |  | ||||||
|   "_location": "/@actions/io", |  | ||||||
|   "_phantomChildren": {}, |  | ||||||
|   "_requested": { |  | ||||||
|     "type": "range", |  | ||||||
|     "registry": true, |  | ||||||
|     "raw": "@actions/io@^1.0.0", |  | ||||||
|     "name": "@actions/io", |  | ||||||
|     "escapedName": "@actions%2fio", |  | ||||||
|     "scope": "@actions", |  | ||||||
|     "rawSpec": "^1.0.0", |  | ||||||
|     "saveSpec": null, |  | ||||||
|     "fetchSpec": "^1.0.0" |  | ||||||
|   }, |  | ||||||
|   "_requiredBy": [ |  | ||||||
|     "#DEV:/", |  | ||||||
|     "/@actions/tool-cache" |  | ||||||
|   ], |  | ||||||
|   "_resolved": "https://registry.npmjs.org/@actions/io/-/io-1.0.0.tgz", |  | ||||||
|   "_shasum": "379454174660623bb5b3bce0be8b9e2285a62bcb", |  | ||||||
|   "_spec": "@actions/io@^1.0.0", |  | ||||||
|   "_where": "C:\\Users\\damccorm\\Documents\\setup-python\\node_modules\\@actions\\tool-cache", |  | ||||||
|   "bugs": { |  | ||||||
|     "url": "https://github.com/actions/toolkit/issues" |  | ||||||
|   }, |  | ||||||
|   "bundleDependencies": false, |  | ||||||
|   "deprecated": false, |  | ||||||
|   "description": "Actions io lib", |  | ||||||
|   "directories": { |  | ||||||
|     "lib": "lib", |  | ||||||
|     "test": "__tests__" |  | ||||||
|   }, |  | ||||||
|   "files": [ |  | ||||||
|     "lib" |  | ||||||
|   ], |  | ||||||
|   "gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55", |  | ||||||
|   "homepage": "https://github.com/actions/toolkit/tree/master/packages/io", |  | ||||||
|   "keywords": [ |  | ||||||
|     "io", |  | ||||||
|     "actions" |  | ||||||
|   ], |  | ||||||
|   "license": "MIT", |  | ||||||
|   "main": "lib/io.js", |  | ||||||
|   "name": "@actions/io", |  | ||||||
|   "publishConfig": { |  | ||||||
|     "access": "public" |  | ||||||
|   }, |  | ||||||
|   "repository": { |  | ||||||
|     "type": "git", |  | ||||||
|     "url": "git+https://github.com/actions/toolkit.git" |  | ||||||
|   }, |  | ||||||
|   "scripts": { |  | ||||||
|     "test": "echo \"Error: run tests from root\" && exit 1", |  | ||||||
|     "tsc": "tsc" |  | ||||||
|   }, |  | ||||||
|   "version": "1.0.0" |  | ||||||
| } |  | ||||||
							
								
								
									
										82
									
								
								node_modules/@actions/tool-cache/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										82
									
								
								node_modules/@actions/tool-cache/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,82 +0,0 @@ | |||||||
| # `@actions/tool-cache` |  | ||||||
| 
 |  | ||||||
| > Functions necessary for downloading and caching tools. |  | ||||||
| 
 |  | ||||||
| ## Usage |  | ||||||
| 
 |  | ||||||
| #### Download |  | ||||||
| 
 |  | ||||||
| You can use this to download tools (or other files) from a download URL: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const tc = require('@actions/tool-cache'); |  | ||||||
| 
 |  | ||||||
| const node12Path = await tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-linux-x64.tar.gz'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Extract |  | ||||||
| 
 |  | ||||||
| These can then be extracted in platform specific ways: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const tc = require('@actions/tool-cache'); |  | ||||||
| 
 |  | ||||||
| if (process.platform === 'win32') { |  | ||||||
|   tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-win-x64.zip'); |  | ||||||
|   const node12ExtractedFolder = await tc.extractZip(node12Path, 'path/to/extract/to'); |  | ||||||
|    |  | ||||||
|   // Or alternately |  | ||||||
|   tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-win-x64.7z'); |  | ||||||
|   const node12ExtractedFolder = await tc.extract7z(node12Path, 'path/to/extract/to'); |  | ||||||
| } |  | ||||||
| else { |  | ||||||
|   const node12Path = await tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-linux-x64.tar.gz'); |  | ||||||
|   const node12ExtractedFolder = await tc.extractTar(node12Path, 'path/to/extract/to'); |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Cache |  | ||||||
| 
 |  | ||||||
| Finally, you can cache these directories in our tool-cache. This is useful if you want to switch back and forth between versions of a tool, or save a tool between runs for private runners (private runners are still in development but are on the roadmap). |  | ||||||
| 
 |  | ||||||
| You'll often want to add it to the path as part of this step: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const tc = require('@actions/tool-cache'); |  | ||||||
| const core = require('@actions/core'); |  | ||||||
| 
 |  | ||||||
| const node12Path = await tc.downloadTool('http://nodejs.org/dist/v12.7.0/node-v12.7.0-linux-x64.tar.gz'); |  | ||||||
| const node12ExtractedFolder = await tc.extractTar(node12Path, 'path/to/extract/to'); |  | ||||||
| 
 |  | ||||||
| const cachedPath = await tc.cacheDir(node12ExtractedFolder, 'node', '12.7.0'); |  | ||||||
| core.addPath(cachedPath); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| You can also cache files for reuse. |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const tc = require('@actions/tool-cache'); |  | ||||||
| 
 |  | ||||||
| tc.cacheFile('path/to/exe', 'destFileName.exe', 'myExeName', '1.1.0'); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| #### Find |  | ||||||
| 
 |  | ||||||
| Finally, you can find directories and files you've previously cached: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const tc = require('@actions/tool-cache'); |  | ||||||
| const core = require('@actions/core'); |  | ||||||
| 
 |  | ||||||
| const nodeDirectory = tc.find('node', '12.x', 'x64'); |  | ||||||
| core.addPath(nodeDirectory); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| You can even find all cached versions of a tool: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| const tc = require('@actions/tool-cache'); |  | ||||||
| 
 |  | ||||||
| const allNodeVersions = tc.findAllVersions('node'); |  | ||||||
| console.log(`Versions of node available: ${allNodeVersions}`); |  | ||||||
| ``` |  | ||||||
							
								
								
									
										78
									
								
								node_modules/@actions/tool-cache/lib/tool-cache.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								node_modules/@actions/tool-cache/lib/tool-cache.d.ts
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,78 +0,0 @@ | |||||||
| export declare class HTTPError extends Error { |  | ||||||
|     readonly httpStatusCode: number | undefined; |  | ||||||
|     constructor(httpStatusCode: number | undefined); |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Download a tool from an url and stream it into a file |  | ||||||
|  * |  | ||||||
|  * @param url       url of tool to download |  | ||||||
|  * @returns         path to downloaded tool |  | ||||||
|  */ |  | ||||||
| export declare function downloadTool(url: string): Promise<string>; |  | ||||||
| /** |  | ||||||
|  * Extract a .7z file |  | ||||||
|  * |  | ||||||
|  * @param file     path to the .7z file |  | ||||||
|  * @param dest     destination directory. Optional. |  | ||||||
|  * @param _7zPath  path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this |  | ||||||
|  * problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will |  | ||||||
|  * gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is |  | ||||||
|  * bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line |  | ||||||
|  * interface, it is smaller than the full command line interface, and it does support long paths. At the |  | ||||||
|  * time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website. |  | ||||||
|  * Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path |  | ||||||
|  * to 7zr.exe can be pass to this function. |  | ||||||
|  * @returns        path to the destination directory |  | ||||||
|  */ |  | ||||||
| export declare function extract7z(file: string, dest?: string, _7zPath?: string): Promise<string>; |  | ||||||
| /** |  | ||||||
|  * Extract a tar |  | ||||||
|  * |  | ||||||
|  * @param file     path to the tar |  | ||||||
|  * @param dest     destination directory. Optional. |  | ||||||
|  * @returns        path to the destination directory |  | ||||||
|  */ |  | ||||||
| export declare function extractTar(file: string, dest?: string): Promise<string>; |  | ||||||
| /** |  | ||||||
|  * Extract a zip |  | ||||||
|  * |  | ||||||
|  * @param file     path to the zip |  | ||||||
|  * @param dest     destination directory. Optional. |  | ||||||
|  * @returns        path to the destination directory |  | ||||||
|  */ |  | ||||||
| export declare function extractZip(file: string, dest?: string): Promise<string>; |  | ||||||
| /** |  | ||||||
|  * Caches a directory and installs it into the tool cacheDir |  | ||||||
|  * |  | ||||||
|  * @param sourceDir    the directory to cache into tools |  | ||||||
|  * @param tool          tool name |  | ||||||
|  * @param version       version of the tool.  semver format |  | ||||||
|  * @param arch          architecture of the tool.  Optional.  Defaults to machine architecture |  | ||||||
|  */ |  | ||||||
| export declare function cacheDir(sourceDir: string, tool: string, version: string, arch?: string): Promise<string>; |  | ||||||
| /** |  | ||||||
|  * Caches a downloaded file (GUID) and installs it |  | ||||||
|  * into the tool cache with a given targetName |  | ||||||
|  * |  | ||||||
|  * @param sourceFile    the file to cache into tools.  Typically a result of downloadTool which is a guid. |  | ||||||
|  * @param targetFile    the name of the file name in the tools directory |  | ||||||
|  * @param tool          tool name |  | ||||||
|  * @param version       version of the tool.  semver format |  | ||||||
|  * @param arch          architecture of the tool.  Optional.  Defaults to machine architecture |  | ||||||
|  */ |  | ||||||
| export declare function cacheFile(sourceFile: string, targetFile: string, tool: string, version: string, arch?: string): Promise<string>; |  | ||||||
| /** |  | ||||||
|  * Finds the path to a tool version in the local installed tool cache |  | ||||||
|  * |  | ||||||
|  * @param toolName      name of the tool |  | ||||||
|  * @param versionSpec   version of the tool |  | ||||||
|  * @param arch          optional arch.  defaults to arch of computer |  | ||||||
|  */ |  | ||||||
| export declare function find(toolName: string, versionSpec: string, arch?: string): string; |  | ||||||
| /** |  | ||||||
|  * Finds the paths to all versions of a tool that are installed in the local tool cache |  | ||||||
|  * |  | ||||||
|  * @param toolName  name of the tool |  | ||||||
|  * @param arch      optional arch.  defaults to arch of computer |  | ||||||
|  */ |  | ||||||
| export declare function findAllVersions(toolName: string, arch?: string): string[]; |  | ||||||
							
								
								
									
										436
									
								
								node_modules/@actions/tool-cache/lib/tool-cache.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										436
									
								
								node_modules/@actions/tool-cache/lib/tool-cache.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,436 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { |  | ||||||
|     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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } |  | ||||||
|         step((generator = generator.apply(thisArg, _arguments || [])).next()); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| const core = require("@actions/core"); |  | ||||||
| const io = require("@actions/io"); |  | ||||||
| const fs = require("fs"); |  | ||||||
| const os = require("os"); |  | ||||||
| const path = require("path"); |  | ||||||
| const httpm = require("typed-rest-client/HttpClient"); |  | ||||||
| const semver = require("semver"); |  | ||||||
| const uuidV4 = require("uuid/v4"); |  | ||||||
| const exec_1 = require("@actions/exec/lib/exec"); |  | ||||||
| const assert_1 = require("assert"); |  | ||||||
| class HTTPError extends Error { |  | ||||||
|     constructor(httpStatusCode) { |  | ||||||
|         super(`Unexpected HTTP response: ${httpStatusCode}`); |  | ||||||
|         this.httpStatusCode = httpStatusCode; |  | ||||||
|         Object.setPrototypeOf(this, new.target.prototype); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| exports.HTTPError = HTTPError; |  | ||||||
| const IS_WINDOWS = process.platform === 'win32'; |  | ||||||
| const userAgent = 'actions/tool-cache'; |  | ||||||
| // On load grab temp directory and cache directory and remove them from env (currently don't want to expose this)
 |  | ||||||
| let tempDirectory = process.env['RUNNER_TEMP'] || ''; |  | ||||||
| let cacheRoot = process.env['RUNNER_TOOL_CACHE'] || ''; |  | ||||||
| // If directories not found, place them in common temp locations
 |  | ||||||
| if (!tempDirectory || !cacheRoot) { |  | ||||||
|     let baseLocation; |  | ||||||
|     if (IS_WINDOWS) { |  | ||||||
|         // On windows use the USERPROFILE env variable
 |  | ||||||
|         baseLocation = process.env['USERPROFILE'] || 'C:\\'; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         if (process.platform === 'darwin') { |  | ||||||
|             baseLocation = '/Users'; |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             baseLocation = '/home'; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     if (!tempDirectory) { |  | ||||||
|         tempDirectory = path.join(baseLocation, 'actions', 'temp'); |  | ||||||
|     } |  | ||||||
|     if (!cacheRoot) { |  | ||||||
|         cacheRoot = path.join(baseLocation, 'actions', 'cache'); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Download a tool from an url and stream it into a file |  | ||||||
|  * |  | ||||||
|  * @param url       url of tool to download |  | ||||||
|  * @returns         path to downloaded tool |  | ||||||
|  */ |  | ||||||
| function downloadTool(url) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         // Wrap in a promise so that we can resolve from within stream callbacks
 |  | ||||||
|         return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { |  | ||||||
|             try { |  | ||||||
|                 const http = new httpm.HttpClient(userAgent, [], { |  | ||||||
|                     allowRetries: true, |  | ||||||
|                     maxRetries: 3 |  | ||||||
|                 }); |  | ||||||
|                 const destPath = path.join(tempDirectory, uuidV4()); |  | ||||||
|                 yield io.mkdirP(tempDirectory); |  | ||||||
|                 core.debug(`Downloading ${url}`); |  | ||||||
|                 core.debug(`Downloading ${destPath}`); |  | ||||||
|                 if (fs.existsSync(destPath)) { |  | ||||||
|                     throw new Error(`Destination file path ${destPath} already exists`); |  | ||||||
|                 } |  | ||||||
|                 const response = yield http.get(url); |  | ||||||
|                 if (response.message.statusCode !== 200) { |  | ||||||
|                     const err = new HTTPError(response.message.statusCode); |  | ||||||
|                     core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); |  | ||||||
|                     throw err; |  | ||||||
|                 } |  | ||||||
|                 const file = fs.createWriteStream(destPath); |  | ||||||
|                 file.on('open', () => __awaiter(this, void 0, void 0, function* () { |  | ||||||
|                     try { |  | ||||||
|                         const stream = response.message.pipe(file); |  | ||||||
|                         stream.on('close', () => { |  | ||||||
|                             core.debug('download complete'); |  | ||||||
|                             resolve(destPath); |  | ||||||
|                         }); |  | ||||||
|                     } |  | ||||||
|                     catch (err) { |  | ||||||
|                         core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`); |  | ||||||
|                         reject(err); |  | ||||||
|                     } |  | ||||||
|                 })); |  | ||||||
|                 file.on('error', err => { |  | ||||||
|                     file.end(); |  | ||||||
|                     reject(err); |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
|             catch (err) { |  | ||||||
|                 reject(err); |  | ||||||
|             } |  | ||||||
|         })); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.downloadTool = downloadTool; |  | ||||||
| /** |  | ||||||
|  * Extract a .7z file |  | ||||||
|  * |  | ||||||
|  * @param file     path to the .7z file |  | ||||||
|  * @param dest     destination directory. Optional. |  | ||||||
|  * @param _7zPath  path to 7zr.exe. Optional, for long path support. Most .7z archives do not have this |  | ||||||
|  * problem. If your .7z archive contains very long paths, you can pass the path to 7zr.exe which will |  | ||||||
|  * gracefully handle long paths. By default 7zdec.exe is used because it is a very small program and is |  | ||||||
|  * bundled with the tool lib. However it does not support long paths. 7zr.exe is the reduced command line |  | ||||||
|  * interface, it is smaller than the full command line interface, and it does support long paths. At the |  | ||||||
|  * time of this writing, it is freely available from the LZMA SDK that is available on the 7zip website. |  | ||||||
|  * Be sure to check the current license agreement. If 7zr.exe is bundled with your action, then the path |  | ||||||
|  * to 7zr.exe can be pass to this function. |  | ||||||
|  * @returns        path to the destination directory |  | ||||||
|  */ |  | ||||||
| function extract7z(file, dest, _7zPath) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         assert_1.ok(IS_WINDOWS, 'extract7z() not supported on current OS'); |  | ||||||
|         assert_1.ok(file, 'parameter "file" is required'); |  | ||||||
|         dest = dest || (yield _createExtractFolder(dest)); |  | ||||||
|         const originalCwd = process.cwd(); |  | ||||||
|         process.chdir(dest); |  | ||||||
|         if (_7zPath) { |  | ||||||
|             try { |  | ||||||
|                 const args = [ |  | ||||||
|                     'x', |  | ||||||
|                     '-bb1', |  | ||||||
|                     '-bd', |  | ||||||
|                     '-sccUTF-8', |  | ||||||
|                     file |  | ||||||
|                 ]; |  | ||||||
|                 const options = { |  | ||||||
|                     silent: true |  | ||||||
|                 }; |  | ||||||
|                 yield exec_1.exec(`"${_7zPath}"`, args, options); |  | ||||||
|             } |  | ||||||
|             finally { |  | ||||||
|                 process.chdir(originalCwd); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             const escapedScript = path |  | ||||||
|                 .join(__dirname, '..', 'scripts', 'Invoke-7zdec.ps1') |  | ||||||
|                 .replace(/'/g, "''") |  | ||||||
|                 .replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines
 |  | ||||||
|             const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); |  | ||||||
|             const escapedTarget = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); |  | ||||||
|             const command = `& '${escapedScript}' -Source '${escapedFile}' -Target '${escapedTarget}'`; |  | ||||||
|             const args = [ |  | ||||||
|                 '-NoLogo', |  | ||||||
|                 '-Sta', |  | ||||||
|                 '-NoProfile', |  | ||||||
|                 '-NonInteractive', |  | ||||||
|                 '-ExecutionPolicy', |  | ||||||
|                 'Unrestricted', |  | ||||||
|                 '-Command', |  | ||||||
|                 command |  | ||||||
|             ]; |  | ||||||
|             const options = { |  | ||||||
|                 silent: true |  | ||||||
|             }; |  | ||||||
|             try { |  | ||||||
|                 const powershellPath = yield io.which('powershell', true); |  | ||||||
|                 yield exec_1.exec(`"${powershellPath}"`, args, options); |  | ||||||
|             } |  | ||||||
|             finally { |  | ||||||
|                 process.chdir(originalCwd); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return dest; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.extract7z = extract7z; |  | ||||||
| /** |  | ||||||
|  * Extract a tar |  | ||||||
|  * |  | ||||||
|  * @param file     path to the tar |  | ||||||
|  * @param dest     destination directory. Optional. |  | ||||||
|  * @returns        path to the destination directory |  | ||||||
|  */ |  | ||||||
| function extractTar(file, dest) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         if (!file) { |  | ||||||
|             throw new Error("parameter 'file' is required"); |  | ||||||
|         } |  | ||||||
|         dest = dest || (yield _createExtractFolder(dest)); |  | ||||||
|         const tarPath = yield io.which('tar', true); |  | ||||||
|         yield exec_1.exec(`"${tarPath}"`, ['xzC', dest, '-f', file]); |  | ||||||
|         return dest; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.extractTar = extractTar; |  | ||||||
| /** |  | ||||||
|  * Extract a zip |  | ||||||
|  * |  | ||||||
|  * @param file     path to the zip |  | ||||||
|  * @param dest     destination directory. Optional. |  | ||||||
|  * @returns        path to the destination directory |  | ||||||
|  */ |  | ||||||
| function extractZip(file, dest) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         if (!file) { |  | ||||||
|             throw new Error("parameter 'file' is required"); |  | ||||||
|         } |  | ||||||
|         dest = dest || (yield _createExtractFolder(dest)); |  | ||||||
|         if (IS_WINDOWS) { |  | ||||||
|             yield extractZipWin(file, dest); |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             yield extractZipNix(file, dest); |  | ||||||
|         } |  | ||||||
|         return dest; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.extractZip = extractZip; |  | ||||||
| function extractZipWin(file, dest) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         // build the powershell command
 |  | ||||||
|         const escapedFile = file.replace(/'/g, "''").replace(/"|\n|\r/g, ''); // double-up single quotes, remove double quotes and newlines
 |  | ||||||
|         const escapedDest = dest.replace(/'/g, "''").replace(/"|\n|\r/g, ''); |  | ||||||
|         const command = `$ErrorActionPreference = 'Stop' ; try { Add-Type -AssemblyName System.IO.Compression.FileSystem } catch { } ; [System.IO.Compression.ZipFile]::ExtractToDirectory('${escapedFile}', '${escapedDest}')`; |  | ||||||
|         // run powershell
 |  | ||||||
|         const powershellPath = yield io.which('powershell'); |  | ||||||
|         const args = [ |  | ||||||
|             '-NoLogo', |  | ||||||
|             '-Sta', |  | ||||||
|             '-NoProfile', |  | ||||||
|             '-NonInteractive', |  | ||||||
|             '-ExecutionPolicy', |  | ||||||
|             'Unrestricted', |  | ||||||
|             '-Command', |  | ||||||
|             command |  | ||||||
|         ]; |  | ||||||
|         yield exec_1.exec(`"${powershellPath}"`, args); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| function extractZipNix(file, dest) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const unzipPath = path.join(__dirname, '..', 'scripts', 'externals', 'unzip'); |  | ||||||
|         yield exec_1.exec(`"${unzipPath}"`, [file], { cwd: dest }); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| /** |  | ||||||
|  * Caches a directory and installs it into the tool cacheDir |  | ||||||
|  * |  | ||||||
|  * @param sourceDir    the directory to cache into tools |  | ||||||
|  * @param tool          tool name |  | ||||||
|  * @param version       version of the tool.  semver format |  | ||||||
|  * @param arch          architecture of the tool.  Optional.  Defaults to machine architecture |  | ||||||
|  */ |  | ||||||
| function cacheDir(sourceDir, tool, version, arch) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         version = semver.clean(version) || version; |  | ||||||
|         arch = arch || os.arch(); |  | ||||||
|         core.debug(`Caching tool ${tool} ${version} ${arch}`); |  | ||||||
|         core.debug(`source dir: ${sourceDir}`); |  | ||||||
|         if (!fs.statSync(sourceDir).isDirectory()) { |  | ||||||
|             throw new Error('sourceDir is not a directory'); |  | ||||||
|         } |  | ||||||
|         // Create the tool dir
 |  | ||||||
|         const destPath = yield _createToolPath(tool, version, arch); |  | ||||||
|         // copy each child item. do not move. move can fail on Windows
 |  | ||||||
|         // due to anti-virus software having an open handle on a file.
 |  | ||||||
|         for (const itemName of fs.readdirSync(sourceDir)) { |  | ||||||
|             const s = path.join(sourceDir, itemName); |  | ||||||
|             yield io.cp(s, destPath, { recursive: true }); |  | ||||||
|         } |  | ||||||
|         // write .complete
 |  | ||||||
|         _completeToolPath(tool, version, arch); |  | ||||||
|         return destPath; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.cacheDir = cacheDir; |  | ||||||
| /** |  | ||||||
|  * Caches a downloaded file (GUID) and installs it |  | ||||||
|  * into the tool cache with a given targetName |  | ||||||
|  * |  | ||||||
|  * @param sourceFile    the file to cache into tools.  Typically a result of downloadTool which is a guid. |  | ||||||
|  * @param targetFile    the name of the file name in the tools directory |  | ||||||
|  * @param tool          tool name |  | ||||||
|  * @param version       version of the tool.  semver format |  | ||||||
|  * @param arch          architecture of the tool.  Optional.  Defaults to machine architecture |  | ||||||
|  */ |  | ||||||
| function cacheFile(sourceFile, targetFile, tool, version, arch) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         version = semver.clean(version) || version; |  | ||||||
|         arch = arch || os.arch(); |  | ||||||
|         core.debug(`Caching tool ${tool} ${version} ${arch}`); |  | ||||||
|         core.debug(`source file: ${sourceFile}`); |  | ||||||
|         if (!fs.statSync(sourceFile).isFile()) { |  | ||||||
|             throw new Error('sourceFile is not a file'); |  | ||||||
|         } |  | ||||||
|         // create the tool dir
 |  | ||||||
|         const destFolder = yield _createToolPath(tool, version, arch); |  | ||||||
|         // copy instead of move. move can fail on Windows due to
 |  | ||||||
|         // anti-virus software having an open handle on a file.
 |  | ||||||
|         const destPath = path.join(destFolder, targetFile); |  | ||||||
|         core.debug(`destination file ${destPath}`); |  | ||||||
|         yield io.cp(sourceFile, destPath); |  | ||||||
|         // write .complete
 |  | ||||||
|         _completeToolPath(tool, version, arch); |  | ||||||
|         return destFolder; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.cacheFile = cacheFile; |  | ||||||
| /** |  | ||||||
|  * Finds the path to a tool version in the local installed tool cache |  | ||||||
|  * |  | ||||||
|  * @param toolName      name of the tool |  | ||||||
|  * @param versionSpec   version of the tool |  | ||||||
|  * @param arch          optional arch.  defaults to arch of computer |  | ||||||
|  */ |  | ||||||
| function find(toolName, versionSpec, arch) { |  | ||||||
|     if (!toolName) { |  | ||||||
|         throw new Error('toolName parameter is required'); |  | ||||||
|     } |  | ||||||
|     if (!versionSpec) { |  | ||||||
|         throw new Error('versionSpec parameter is required'); |  | ||||||
|     } |  | ||||||
|     arch = arch || os.arch(); |  | ||||||
|     // attempt to resolve an explicit version
 |  | ||||||
|     if (!_isExplicitVersion(versionSpec)) { |  | ||||||
|         const localVersions = findAllVersions(toolName, arch); |  | ||||||
|         const match = _evaluateVersions(localVersions, versionSpec); |  | ||||||
|         versionSpec = match; |  | ||||||
|     } |  | ||||||
|     // check for the explicit version in the cache
 |  | ||||||
|     let toolPath = ''; |  | ||||||
|     if (versionSpec) { |  | ||||||
|         versionSpec = semver.clean(versionSpec) || ''; |  | ||||||
|         const cachePath = path.join(cacheRoot, toolName, versionSpec, arch); |  | ||||||
|         core.debug(`checking cache: ${cachePath}`); |  | ||||||
|         if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) { |  | ||||||
|             core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`); |  | ||||||
|             toolPath = cachePath; |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             core.debug('not found'); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     return toolPath; |  | ||||||
| } |  | ||||||
| exports.find = find; |  | ||||||
| /** |  | ||||||
|  * Finds the paths to all versions of a tool that are installed in the local tool cache |  | ||||||
|  * |  | ||||||
|  * @param toolName  name of the tool |  | ||||||
|  * @param arch      optional arch.  defaults to arch of computer |  | ||||||
|  */ |  | ||||||
| function findAllVersions(toolName, arch) { |  | ||||||
|     const versions = []; |  | ||||||
|     arch = arch || os.arch(); |  | ||||||
|     const toolPath = path.join(cacheRoot, toolName); |  | ||||||
|     if (fs.existsSync(toolPath)) { |  | ||||||
|         const children = fs.readdirSync(toolPath); |  | ||||||
|         for (const child of children) { |  | ||||||
|             if (_isExplicitVersion(child)) { |  | ||||||
|                 const fullPath = path.join(toolPath, child, arch || ''); |  | ||||||
|                 if (fs.existsSync(fullPath) && fs.existsSync(`${fullPath}.complete`)) { |  | ||||||
|                     versions.push(child); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     return versions; |  | ||||||
| } |  | ||||||
| exports.findAllVersions = findAllVersions; |  | ||||||
| function _createExtractFolder(dest) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         if (!dest) { |  | ||||||
|             // create a temp dir
 |  | ||||||
|             dest = path.join(tempDirectory, uuidV4()); |  | ||||||
|         } |  | ||||||
|         yield io.mkdirP(dest); |  | ||||||
|         return dest; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| function _createToolPath(tool, version, arch) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || ''); |  | ||||||
|         core.debug(`destination ${folderPath}`); |  | ||||||
|         const markerPath = `${folderPath}.complete`; |  | ||||||
|         yield io.rmRF(folderPath); |  | ||||||
|         yield io.rmRF(markerPath); |  | ||||||
|         yield io.mkdirP(folderPath); |  | ||||||
|         return folderPath; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| function _completeToolPath(tool, version, arch) { |  | ||||||
|     const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || ''); |  | ||||||
|     const markerPath = `${folderPath}.complete`; |  | ||||||
|     fs.writeFileSync(markerPath, ''); |  | ||||||
|     core.debug('finished caching tool'); |  | ||||||
| } |  | ||||||
| function _isExplicitVersion(versionSpec) { |  | ||||||
|     const c = semver.clean(versionSpec) || ''; |  | ||||||
|     core.debug(`isExplicit: ${c}`); |  | ||||||
|     const valid = semver.valid(c) != null; |  | ||||||
|     core.debug(`explicit? ${valid}`); |  | ||||||
|     return valid; |  | ||||||
| } |  | ||||||
| function _evaluateVersions(versions, versionSpec) { |  | ||||||
|     let version = ''; |  | ||||||
|     core.debug(`evaluating ${versions.length} versions`); |  | ||||||
|     versions = versions.sort((a, b) => { |  | ||||||
|         if (semver.gt(a, b)) { |  | ||||||
|             return 1; |  | ||||||
|         } |  | ||||||
|         return -1; |  | ||||||
|     }); |  | ||||||
|     for (let i = versions.length - 1; i >= 0; i--) { |  | ||||||
|         const potential = versions[i]; |  | ||||||
|         const satisfied = semver.satisfies(potential, versionSpec); |  | ||||||
|         if (satisfied) { |  | ||||||
|             version = potential; |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     if (version) { |  | ||||||
|         core.debug(`matched: ${version}`); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         core.debug('match not found'); |  | ||||||
|     } |  | ||||||
|     return version; |  | ||||||
| } |  | ||||||
| //# sourceMappingURL=tool-cache.js.map
 |  | ||||||
							
								
								
									
										1
									
								
								node_modules/@actions/tool-cache/lib/tool-cache.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/@actions/tool-cache/lib/tool-cache.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										75
									
								
								node_modules/@actions/tool-cache/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										75
									
								
								node_modules/@actions/tool-cache/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,75 +0,0 @@ | |||||||
| { |  | ||||||
|   "_from": "@actions/tool-cache@^1.0.0", |  | ||||||
|   "_id": "@actions/tool-cache@1.0.0", |  | ||||||
|   "_inBundle": false, |  | ||||||
|   "_integrity": "sha512-l3zT0IfDfi5Ik5aMpnXqGHGATxN8xa9ls4ue+X/CBXpPhRMRZS4vcuh5Q9T98WAGbkysRCfhpbksTPHIcKnNwQ==", |  | ||||||
|   "_location": "/@actions/tool-cache", |  | ||||||
|   "_phantomChildren": {}, |  | ||||||
|   "_requested": { |  | ||||||
|     "type": "range", |  | ||||||
|     "registry": true, |  | ||||||
|     "raw": "@actions/tool-cache@^1.0.0", |  | ||||||
|     "name": "@actions/tool-cache", |  | ||||||
|     "escapedName": "@actions%2ftool-cache", |  | ||||||
|     "scope": "@actions", |  | ||||||
|     "rawSpec": "^1.0.0", |  | ||||||
|     "saveSpec": null, |  | ||||||
|     "fetchSpec": "^1.0.0" |  | ||||||
|   }, |  | ||||||
|   "_requiredBy": [ |  | ||||||
|     "/" |  | ||||||
|   ], |  | ||||||
|   "_resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-1.0.0.tgz", |  | ||||||
|   "_shasum": "a9ac414bd2e0bf1f5f0302f029193c418d344c09", |  | ||||||
|   "_spec": "@actions/tool-cache@^1.0.0", |  | ||||||
|   "_where": "C:\\Users\\damccorm\\Documents\\setup-python", |  | ||||||
|   "bugs": { |  | ||||||
|     "url": "https://github.com/actions/toolkit/issues" |  | ||||||
|   }, |  | ||||||
|   "bundleDependencies": false, |  | ||||||
|   "dependencies": { |  | ||||||
|     "@actions/core": "^1.0.0", |  | ||||||
|     "@actions/exec": "^1.0.0", |  | ||||||
|     "@actions/io": "^1.0.0", |  | ||||||
|     "semver": "^6.1.0", |  | ||||||
|     "typed-rest-client": "^1.4.0", |  | ||||||
|     "uuid": "^3.3.2" |  | ||||||
|   }, |  | ||||||
|   "deprecated": false, |  | ||||||
|   "description": "Actions tool-cache lib", |  | ||||||
|   "devDependencies": { |  | ||||||
|     "@types/nock": "^10.0.3", |  | ||||||
|     "@types/semver": "^6.0.0", |  | ||||||
|     "@types/uuid": "^3.4.4", |  | ||||||
|     "nock": "^10.0.6" |  | ||||||
|   }, |  | ||||||
|   "directories": { |  | ||||||
|     "lib": "lib", |  | ||||||
|     "test": "__tests__" |  | ||||||
|   }, |  | ||||||
|   "files": [ |  | ||||||
|     "lib", |  | ||||||
|     "scripts" |  | ||||||
|   ], |  | ||||||
|   "gitHead": "a40bce7c8d382aa3dbadaa327acbc696e9390e55", |  | ||||||
|   "homepage": "https://github.com/actions/toolkit/tree/master/packages/exec", |  | ||||||
|   "keywords": [ |  | ||||||
|     "exec", |  | ||||||
|     "actions" |  | ||||||
|   ], |  | ||||||
|   "license": "MIT", |  | ||||||
|   "main": "lib/tool-cache.js", |  | ||||||
|   "name": "@actions/tool-cache", |  | ||||||
|   "publishConfig": { |  | ||||||
|     "access": "public" |  | ||||||
|   }, |  | ||||||
|   "repository": { |  | ||||||
|     "type": "git", |  | ||||||
|     "url": "git+https://github.com/actions/toolkit.git" |  | ||||||
|   }, |  | ||||||
|   "scripts": { |  | ||||||
|     "test": "echo \"Error: run tests from root\" && exit 1", |  | ||||||
|     "tsc": "tsc" |  | ||||||
|   }, |  | ||||||
|   "version": "1.0.0" |  | ||||||
| } |  | ||||||
							
								
								
									
										60
									
								
								node_modules/@actions/tool-cache/scripts/Invoke-7zdec.ps1
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								node_modules/@actions/tool-cache/scripts/Invoke-7zdec.ps1
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,60 +0,0 @@ | |||||||
| [CmdletBinding()] |  | ||||||
| param( |  | ||||||
|     [Parameter(Mandatory = $true)] |  | ||||||
|     [string]$Source, |  | ||||||
| 
 |  | ||||||
|     [Parameter(Mandatory = $true)] |  | ||||||
|     [string]$Target) |  | ||||||
| 
 |  | ||||||
| # This script translates the output from 7zdec into UTF8. Node has limited |  | ||||||
| # built-in support for encodings. |  | ||||||
| # |  | ||||||
| # 7zdec uses the system default code page. The system default code page varies |  | ||||||
| # depending on the locale configuration. On an en-US box, the system default code |  | ||||||
| # page is Windows-1252. |  | ||||||
| # |  | ||||||
| # Note, on a typical en-US box, testing with the 'ç' character is a good way to |  | ||||||
| # determine whether data is passed correctly between processes. This is because |  | ||||||
| # the 'ç' character has a different code point across each of the common encodings |  | ||||||
| # on a typical en-US box, i.e. |  | ||||||
| #   1) the default console-output code page (IBM437) |  | ||||||
| #   2) the system default code page (i.e. CP_ACP) (Windows-1252) |  | ||||||
| #   3) UTF8 |  | ||||||
| 
 |  | ||||||
| $ErrorActionPreference = 'Stop' |  | ||||||
| 
 |  | ||||||
| # Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default. |  | ||||||
| $stdout = [System.Console]::OpenStandardOutput() |  | ||||||
| $utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM |  | ||||||
| $writer = New-Object System.IO.StreamWriter($stdout, $utf8) |  | ||||||
| [System.Console]::SetOut($writer) |  | ||||||
| 
 |  | ||||||
| # All subsequent output must be written using [System.Console]::WriteLine(). In |  | ||||||
| # PowerShell 4, Write-Host and Out-Default do not consider the updated stream writer. |  | ||||||
| 
 |  | ||||||
| Set-Location -LiteralPath $Target |  | ||||||
| 
 |  | ||||||
| # Print the ##command. |  | ||||||
| $_7zdec = Join-Path -Path "$PSScriptRoot" -ChildPath "externals/7zdec.exe" |  | ||||||
| [System.Console]::WriteLine("##[command]$_7zdec x `"$Source`"") |  | ||||||
| 
 |  | ||||||
| # The $OutputEncoding variable instructs PowerShell how to interpret the output |  | ||||||
| # from the external command. |  | ||||||
| $OutputEncoding = [System.Text.Encoding]::Default |  | ||||||
| 
 |  | ||||||
| # Note, the output from 7zdec.exe needs to be iterated over. Otherwise PowerShell.exe |  | ||||||
| # will launch the external command in such a way that it inherits the streams. |  | ||||||
| & $_7zdec x $Source 2>&1 | |  | ||||||
|     ForEach-Object { |  | ||||||
|         if ($_ -is [System.Management.Automation.ErrorRecord]) { |  | ||||||
|             [System.Console]::WriteLine($_.Exception.Message) |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             [System.Console]::WriteLine($_) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| [System.Console]::WriteLine("##[debug]7zdec.exe exit code '$LASTEXITCODE'") |  | ||||||
| [System.Console]::Out.Flush() |  | ||||||
| if ($LASTEXITCODE -ne 0) { |  | ||||||
|     exit $LASTEXITCODE |  | ||||||
| } |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								node_modules/@actions/tool-cache/scripts/externals/7zdec.exe
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								node_modules/@actions/tool-cache/scripts/externals/7zdec.exe
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								node_modules/@actions/tool-cache/scripts/externals/unzip
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								node_modules/@actions/tool-cache/scripts/externals/unzip
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										70
									
								
								node_modules/semver/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										70
									
								
								node_modules/semver/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,70 +0,0 @@ | |||||||
| # changes log |  | ||||||
| 
 |  | ||||||
| ## 6.2.0 |  | ||||||
| 
 |  | ||||||
| * Coerce numbers to strings when passed to semver.coerce() |  | ||||||
| * Add `rtl` option to coerce from right to left |  | ||||||
| 
 |  | ||||||
| ## 6.1.3 |  | ||||||
| 
 |  | ||||||
| * Handle X-ranges properly in includePrerelease mode |  | ||||||
| 
 |  | ||||||
| ## 6.1.2 |  | ||||||
| 
 |  | ||||||
| * Do not throw when testing invalid version strings |  | ||||||
| 
 |  | ||||||
| ## 6.1.1 |  | ||||||
| 
 |  | ||||||
| * Add options support for semver.coerce() |  | ||||||
| * Handle undefined version passed to Range.test |  | ||||||
| 
 |  | ||||||
| ## 6.1.0 |  | ||||||
| 
 |  | ||||||
| * Add semver.compareBuild function |  | ||||||
| * Support `*` in semver.intersects |  | ||||||
| 
 |  | ||||||
| ## 6.0 |  | ||||||
| 
 |  | ||||||
| * Fix `intersects` logic. |  | ||||||
| 
 |  | ||||||
|     This is technically a bug fix, but since it is also a change to behavior |  | ||||||
|     that may require users updating their code, it is marked as a major |  | ||||||
|     version increment. |  | ||||||
| 
 |  | ||||||
| ## 5.7 |  | ||||||
| 
 |  | ||||||
| * Add `minVersion` method |  | ||||||
| 
 |  | ||||||
| ## 5.6 |  | ||||||
| 
 |  | ||||||
| * Move boolean `loose` param to an options object, with |  | ||||||
|   backwards-compatibility protection. |  | ||||||
| * Add ability to opt out of special prerelease version handling with |  | ||||||
|   the `includePrerelease` option flag. |  | ||||||
| 
 |  | ||||||
| ## 5.5 |  | ||||||
| 
 |  | ||||||
| * Add version coercion capabilities |  | ||||||
| 
 |  | ||||||
| ## 5.4 |  | ||||||
| 
 |  | ||||||
| * Add intersection checking |  | ||||||
| 
 |  | ||||||
| ## 5.3 |  | ||||||
| 
 |  | ||||||
| * Add `minSatisfying` method |  | ||||||
| 
 |  | ||||||
| ## 5.2 |  | ||||||
| 
 |  | ||||||
| * Add `prerelease(v)` that returns prerelease components |  | ||||||
| 
 |  | ||||||
| ## 5.1 |  | ||||||
| 
 |  | ||||||
| * Add Backus-Naur for ranges |  | ||||||
| * Remove excessively cute inspection methods |  | ||||||
| 
 |  | ||||||
| ## 5.0 |  | ||||||
| 
 |  | ||||||
| * Remove AMD/Browserified build artifacts |  | ||||||
| * Fix ltr and gtr when using the `*` range |  | ||||||
| * Fix for range `*` with a prerelease identifier |  | ||||||
							
								
								
									
										15
									
								
								node_modules/semver/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								node_modules/semver/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,15 +0,0 @@ | |||||||
| The ISC License |  | ||||||
| 
 |  | ||||||
| Copyright (c) Isaac Z. Schlueter and Contributors |  | ||||||
| 
 |  | ||||||
| Permission to use, copy, modify, and/or distribute this software for any |  | ||||||
| purpose with or without fee is hereby granted, provided that the above |  | ||||||
| copyright notice and this permission notice appear in all copies. |  | ||||||
| 
 |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |  | ||||||
| WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |  | ||||||
| MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |  | ||||||
| ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |  | ||||||
| WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |  | ||||||
| ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR |  | ||||||
| IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |  | ||||||
							
								
								
									
										443
									
								
								node_modules/semver/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										443
									
								
								node_modules/semver/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,443 +0,0 @@ | |||||||
| semver(1) -- The semantic versioner for npm |  | ||||||
| =========================================== |  | ||||||
| 
 |  | ||||||
| ## Install |  | ||||||
| 
 |  | ||||||
| ```bash |  | ||||||
| npm install semver |  | ||||||
| ```` |  | ||||||
| 
 |  | ||||||
| ## Usage |  | ||||||
| 
 |  | ||||||
| As a node module: |  | ||||||
| 
 |  | ||||||
| ```js |  | ||||||
| const semver = require('semver') |  | ||||||
| 
 |  | ||||||
| semver.valid('1.2.3') // '1.2.3' |  | ||||||
| semver.valid('a.b.c') // null |  | ||||||
| semver.clean('  =v1.2.3   ') // '1.2.3' |  | ||||||
| semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true |  | ||||||
| semver.gt('1.2.3', '9.8.7') // false |  | ||||||
| semver.lt('1.2.3', '9.8.7') // true |  | ||||||
| semver.minVersion('>=1.0.0') // '1.0.0' |  | ||||||
| semver.valid(semver.coerce('v2')) // '2.0.0' |  | ||||||
| semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| As a command-line utility: |  | ||||||
| 
 |  | ||||||
| ``` |  | ||||||
| $ semver -h |  | ||||||
| 
 |  | ||||||
| A JavaScript implementation of the https://semver.org/ specification |  | ||||||
| Copyright Isaac Z. Schlueter |  | ||||||
| 
 |  | ||||||
| Usage: semver [options] <version> [<version> [...]] |  | ||||||
| Prints valid versions sorted by SemVer precedence |  | ||||||
| 
 |  | ||||||
| Options: |  | ||||||
| -r --range <range> |  | ||||||
|         Print versions that match the specified range. |  | ||||||
| 
 |  | ||||||
| -i --increment [<level>] |  | ||||||
|         Increment a version by the specified level.  Level can |  | ||||||
|         be one of: major, minor, patch, premajor, preminor, |  | ||||||
|         prepatch, or prerelease.  Default level is 'patch'. |  | ||||||
|         Only one version may be specified. |  | ||||||
| 
 |  | ||||||
| --preid <identifier> |  | ||||||
|         Identifier to be used to prefix premajor, preminor, |  | ||||||
|         prepatch or prerelease version increments. |  | ||||||
| 
 |  | ||||||
| -l --loose |  | ||||||
|         Interpret versions and ranges loosely |  | ||||||
| 
 |  | ||||||
| -p --include-prerelease |  | ||||||
|         Always include prerelease versions in range matching |  | ||||||
| 
 |  | ||||||
| -c --coerce |  | ||||||
|         Coerce a string into SemVer if possible |  | ||||||
|         (does not imply --loose) |  | ||||||
| 
 |  | ||||||
| --rtl |  | ||||||
|         Coerce version strings right to left |  | ||||||
| 
 |  | ||||||
| --ltr |  | ||||||
|         Coerce version strings left to right (default) |  | ||||||
| 
 |  | ||||||
| Program exits successfully if any valid version satisfies |  | ||||||
| all supplied ranges, and prints all satisfying versions. |  | ||||||
| 
 |  | ||||||
| If no satisfying versions are found, then exits failure. |  | ||||||
| 
 |  | ||||||
| Versions are printed in ascending order, so supplying |  | ||||||
| multiple versions to the utility will just sort them. |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ## Versions |  | ||||||
| 
 |  | ||||||
| A "version" is described by the `v2.0.0` specification found at |  | ||||||
| <https://semver.org/>. |  | ||||||
| 
 |  | ||||||
| A leading `"="` or `"v"` character is stripped off and ignored. |  | ||||||
| 
 |  | ||||||
| ## Ranges |  | ||||||
| 
 |  | ||||||
| A `version range` is a set of `comparators` which specify versions |  | ||||||
| that satisfy the range. |  | ||||||
| 
 |  | ||||||
| A `comparator` is composed of an `operator` and a `version`.  The set |  | ||||||
| of primitive `operators` is: |  | ||||||
| 
 |  | ||||||
| * `<` Less than |  | ||||||
| * `<=` Less than or equal to |  | ||||||
| * `>` Greater than |  | ||||||
| * `>=` Greater than or equal to |  | ||||||
| * `=` Equal.  If no operator is specified, then equality is assumed, |  | ||||||
|   so this operator is optional, but MAY be included. |  | ||||||
| 
 |  | ||||||
| For example, the comparator `>=1.2.7` would match the versions |  | ||||||
| `1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` |  | ||||||
| or `1.1.0`. |  | ||||||
| 
 |  | ||||||
| Comparators can be joined by whitespace to form a `comparator set`, |  | ||||||
| which is satisfied by the **intersection** of all of the comparators |  | ||||||
| it includes. |  | ||||||
| 
 |  | ||||||
| A range is composed of one or more comparator sets, joined by `||`.  A |  | ||||||
| version matches a range if and only if every comparator in at least |  | ||||||
| one of the `||`-separated comparator sets is satisfied by the version. |  | ||||||
| 
 |  | ||||||
| For example, the range `>=1.2.7 <1.3.0` would match the versions |  | ||||||
| `1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, |  | ||||||
| or `1.1.0`. |  | ||||||
| 
 |  | ||||||
| The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, |  | ||||||
| `1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. |  | ||||||
| 
 |  | ||||||
| ### Prerelease Tags |  | ||||||
| 
 |  | ||||||
| If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then |  | ||||||
| it will only be allowed to satisfy comparator sets if at least one |  | ||||||
| comparator with the same `[major, minor, patch]` tuple also has a |  | ||||||
| prerelease tag. |  | ||||||
| 
 |  | ||||||
| For example, the range `>1.2.3-alpha.3` would be allowed to match the |  | ||||||
| version `1.2.3-alpha.7`, but it would *not* be satisfied by |  | ||||||
| `3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater |  | ||||||
| than" `1.2.3-alpha.3` according to the SemVer sort rules.  The version |  | ||||||
| range only accepts prerelease tags on the `1.2.3` version.  The |  | ||||||
| version `3.4.5` *would* satisfy the range, because it does not have a |  | ||||||
| prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. |  | ||||||
| 
 |  | ||||||
| The purpose for this behavior is twofold.  First, prerelease versions |  | ||||||
| frequently are updated very quickly, and contain many breaking changes |  | ||||||
| that are (by the author's design) not yet fit for public consumption. |  | ||||||
| Therefore, by default, they are excluded from range matching |  | ||||||
| semantics. |  | ||||||
| 
 |  | ||||||
| Second, a user who has opted into using a prerelease version has |  | ||||||
| clearly indicated the intent to use *that specific* set of |  | ||||||
| alpha/beta/rc versions.  By including a prerelease tag in the range, |  | ||||||
| the user is indicating that they are aware of the risk.  However, it |  | ||||||
| is still not appropriate to assume that they have opted into taking a |  | ||||||
| similar risk on the *next* set of prerelease versions. |  | ||||||
| 
 |  | ||||||
| Note that this behavior can be suppressed (treating all prerelease |  | ||||||
| versions as if they were normal versions, for the purpose of range |  | ||||||
| matching) by setting the `includePrerelease` flag on the options |  | ||||||
| object to any |  | ||||||
| [functions](https://github.com/npm/node-semver#functions) that do |  | ||||||
| range matching. |  | ||||||
| 
 |  | ||||||
| #### Prerelease Identifiers |  | ||||||
| 
 |  | ||||||
| The method `.inc` takes an additional `identifier` string argument that |  | ||||||
| will append the value of the string as a prerelease identifier: |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| semver.inc('1.2.3', 'prerelease', 'beta') |  | ||||||
| // '1.2.4-beta.0' |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| command-line example: |  | ||||||
| 
 |  | ||||||
| ```bash |  | ||||||
| $ semver 1.2.3 -i prerelease --preid beta |  | ||||||
| 1.2.4-beta.0 |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| Which then can be used to increment further: |  | ||||||
| 
 |  | ||||||
| ```bash |  | ||||||
| $ semver 1.2.4-beta.0 -i prerelease |  | ||||||
| 1.2.4-beta.1 |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### Advanced Range Syntax |  | ||||||
| 
 |  | ||||||
| Advanced range syntax desugars to primitive comparators in |  | ||||||
| deterministic ways. |  | ||||||
| 
 |  | ||||||
| Advanced ranges may be combined in the same way as primitive |  | ||||||
| comparators using white space or `||`. |  | ||||||
| 
 |  | ||||||
| #### Hyphen Ranges `X.Y.Z - A.B.C` |  | ||||||
| 
 |  | ||||||
| Specifies an inclusive set. |  | ||||||
| 
 |  | ||||||
| * `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` |  | ||||||
| 
 |  | ||||||
| If a partial version is provided as the first version in the inclusive |  | ||||||
| range, then the missing pieces are replaced with zeroes. |  | ||||||
| 
 |  | ||||||
| * `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` |  | ||||||
| 
 |  | ||||||
| If a partial version is provided as the second version in the |  | ||||||
| inclusive range, then all versions that start with the supplied parts |  | ||||||
| of the tuple are accepted, but nothing that would be greater than the |  | ||||||
| provided tuple parts. |  | ||||||
| 
 |  | ||||||
| * `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` |  | ||||||
| * `1.2.3 - 2` := `>=1.2.3 <3.0.0` |  | ||||||
| 
 |  | ||||||
| #### X-Ranges `1.2.x` `1.X` `1.2.*` `*` |  | ||||||
| 
 |  | ||||||
| Any of `X`, `x`, or `*` may be used to "stand in" for one of the |  | ||||||
| numeric values in the `[major, minor, patch]` tuple. |  | ||||||
| 
 |  | ||||||
| * `*` := `>=0.0.0` (Any version satisfies) |  | ||||||
| * `1.x` := `>=1.0.0 <2.0.0` (Matching major version) |  | ||||||
| * `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) |  | ||||||
| 
 |  | ||||||
| A partial version range is treated as an X-Range, so the special |  | ||||||
| character is in fact optional. |  | ||||||
| 
 |  | ||||||
| * `""` (empty string) := `*` := `>=0.0.0` |  | ||||||
| * `1` := `1.x.x` := `>=1.0.0 <2.0.0` |  | ||||||
| * `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` |  | ||||||
| 
 |  | ||||||
| #### Tilde Ranges `~1.2.3` `~1.2` `~1` |  | ||||||
| 
 |  | ||||||
| Allows patch-level changes if a minor version is specified on the |  | ||||||
| comparator.  Allows minor-level changes if not. |  | ||||||
| 
 |  | ||||||
| * `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` |  | ||||||
| * `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) |  | ||||||
| * `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) |  | ||||||
| * `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` |  | ||||||
| * `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) |  | ||||||
| * `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) |  | ||||||
| * `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in |  | ||||||
|   the `1.2.3` version will be allowed, if they are greater than or |  | ||||||
|   equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but |  | ||||||
|   `1.2.4-beta.2` would not, because it is a prerelease of a |  | ||||||
|   different `[major, minor, patch]` tuple. |  | ||||||
| 
 |  | ||||||
| #### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` |  | ||||||
| 
 |  | ||||||
| Allows changes that do not modify the left-most non-zero element in the |  | ||||||
| `[major, minor, patch]` tuple.  In other words, this allows patch and |  | ||||||
| minor updates for versions `1.0.0` and above, patch updates for |  | ||||||
| versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. |  | ||||||
| 
 |  | ||||||
| Many authors treat a `0.x` version as if the `x` were the major |  | ||||||
| "breaking-change" indicator. |  | ||||||
| 
 |  | ||||||
| Caret ranges are ideal when an author may make breaking changes |  | ||||||
| between `0.2.4` and `0.3.0` releases, which is a common practice. |  | ||||||
| However, it presumes that there will *not* be breaking changes between |  | ||||||
| `0.2.4` and `0.2.5`.  It allows for changes that are presumed to be |  | ||||||
| additive (but non-breaking), according to commonly observed practices. |  | ||||||
| 
 |  | ||||||
| * `^1.2.3` := `>=1.2.3 <2.0.0` |  | ||||||
| * `^0.2.3` := `>=0.2.3 <0.3.0` |  | ||||||
| * `^0.0.3` := `>=0.0.3 <0.0.4` |  | ||||||
| * `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in |  | ||||||
|   the `1.2.3` version will be allowed, if they are greater than or |  | ||||||
|   equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but |  | ||||||
|   `1.2.4-beta.2` would not, because it is a prerelease of a |  | ||||||
|   different `[major, minor, patch]` tuple. |  | ||||||
| * `^0.0.3-beta` := `>=0.0.3-beta <0.0.4`  Note that prereleases in the |  | ||||||
|   `0.0.3` version *only* will be allowed, if they are greater than or |  | ||||||
|   equal to `beta`.  So, `0.0.3-pr.2` would be allowed. |  | ||||||
| 
 |  | ||||||
| When parsing caret ranges, a missing `patch` value desugars to the |  | ||||||
| number `0`, but will allow flexibility within that value, even if the |  | ||||||
| major and minor versions are both `0`. |  | ||||||
| 
 |  | ||||||
| * `^1.2.x` := `>=1.2.0 <2.0.0` |  | ||||||
| * `^0.0.x` := `>=0.0.0 <0.1.0` |  | ||||||
| * `^0.0` := `>=0.0.0 <0.1.0` |  | ||||||
| 
 |  | ||||||
| A missing `minor` and `patch` values will desugar to zero, but also |  | ||||||
| allow flexibility within those values, even if the major version is |  | ||||||
| zero. |  | ||||||
| 
 |  | ||||||
| * `^1.x` := `>=1.0.0 <2.0.0` |  | ||||||
| * `^0.x` := `>=0.0.0 <1.0.0` |  | ||||||
| 
 |  | ||||||
| ### Range Grammar |  | ||||||
| 
 |  | ||||||
| Putting all this together, here is a Backus-Naur grammar for ranges, |  | ||||||
| for the benefit of parser authors: |  | ||||||
| 
 |  | ||||||
| ```bnf |  | ||||||
| range-set  ::= range ( logical-or range ) * |  | ||||||
| logical-or ::= ( ' ' ) * '||' ( ' ' ) * |  | ||||||
| range      ::= hyphen | simple ( ' ' simple ) * | '' |  | ||||||
| hyphen     ::= partial ' - ' partial |  | ||||||
| simple     ::= primitive | partial | tilde | caret |  | ||||||
| primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial |  | ||||||
| partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )? |  | ||||||
| xr         ::= 'x' | 'X' | '*' | nr |  | ||||||
| nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * |  | ||||||
| tilde      ::= '~' partial |  | ||||||
| caret      ::= '^' partial |  | ||||||
| qualifier  ::= ( '-' pre )? ( '+' build )? |  | ||||||
| pre        ::= parts |  | ||||||
| build      ::= parts |  | ||||||
| parts      ::= part ( '.' part ) * |  | ||||||
| part       ::= nr | [-0-9A-Za-z]+ |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ## Functions |  | ||||||
| 
 |  | ||||||
| All methods and classes take a final `options` object argument.  All |  | ||||||
| options in this object are `false` by default.  The options supported |  | ||||||
| are: |  | ||||||
| 
 |  | ||||||
| - `loose`  Be more forgiving about not-quite-valid semver strings. |  | ||||||
|   (Any resulting output will always be 100% strict compliant, of |  | ||||||
|   course.)  For backwards compatibility reasons, if the `options` |  | ||||||
|   argument is a boolean value instead of an object, it is interpreted |  | ||||||
|   to be the `loose` param. |  | ||||||
| - `includePrerelease`  Set to suppress the [default |  | ||||||
|   behavior](https://github.com/npm/node-semver#prerelease-tags) of |  | ||||||
|   excluding prerelease tagged versions from ranges unless they are |  | ||||||
|   explicitly opted into. |  | ||||||
| 
 |  | ||||||
| Strict-mode Comparators and Ranges will be strict about the SemVer |  | ||||||
| strings that they parse. |  | ||||||
| 
 |  | ||||||
| * `valid(v)`: Return the parsed version, or null if it's not valid. |  | ||||||
| * `inc(v, release)`: Return the version incremented by the release |  | ||||||
|   type (`major`,   `premajor`, `minor`, `preminor`, `patch`, |  | ||||||
|   `prepatch`, or `prerelease`), or null if it's not valid |  | ||||||
|   * `premajor` in one call will bump the version up to the next major |  | ||||||
|     version and down to a prerelease of that major version. |  | ||||||
|     `preminor`, and `prepatch` work the same way. |  | ||||||
|   * If called from a non-prerelease version, the `prerelease` will work the |  | ||||||
|     same as `prepatch`. It increments the patch version, then makes a |  | ||||||
|     prerelease. If the input version is already a prerelease it simply |  | ||||||
|     increments it. |  | ||||||
| * `prerelease(v)`: Returns an array of prerelease components, or null |  | ||||||
|   if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` |  | ||||||
| * `major(v)`: Return the major version number. |  | ||||||
| * `minor(v)`: Return the minor version number. |  | ||||||
| * `patch(v)`: Return the patch version number. |  | ||||||
| * `intersects(r1, r2, loose)`: Return true if the two supplied ranges |  | ||||||
|   or comparators intersect. |  | ||||||
| * `parse(v)`: Attempt to parse a string as a semantic version, returning either |  | ||||||
|   a `SemVer` object or `null`. |  | ||||||
| 
 |  | ||||||
| ### Comparison |  | ||||||
| 
 |  | ||||||
| * `gt(v1, v2)`: `v1 > v2` |  | ||||||
| * `gte(v1, v2)`: `v1 >= v2` |  | ||||||
| * `lt(v1, v2)`: `v1 < v2` |  | ||||||
| * `lte(v1, v2)`: `v1 <= v2` |  | ||||||
| * `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, |  | ||||||
|   even if they're not the exact same string.  You already know how to |  | ||||||
|   compare strings. |  | ||||||
| * `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. |  | ||||||
| * `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call |  | ||||||
|   the corresponding function above.  `"==="` and `"!=="` do simple |  | ||||||
|   string comparison, but are included for completeness.  Throws if an |  | ||||||
|   invalid comparison string is provided. |  | ||||||
| * `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if |  | ||||||
|   `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`. |  | ||||||
| * `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions |  | ||||||
|   in descending order when passed to `Array.sort()`. |  | ||||||
| * `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions |  | ||||||
|   are equal.  Sorts in ascending order if passed to `Array.sort()`. |  | ||||||
|   `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`. |  | ||||||
| * `diff(v1, v2)`: Returns difference between two versions by the release type |  | ||||||
|   (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), |  | ||||||
|   or null if the versions are the same. |  | ||||||
| 
 |  | ||||||
| ### Comparators |  | ||||||
| 
 |  | ||||||
| * `intersects(comparator)`: Return true if the comparators intersect |  | ||||||
| 
 |  | ||||||
| ### Ranges |  | ||||||
| 
 |  | ||||||
| * `validRange(range)`: Return the valid range or null if it's not valid |  | ||||||
| * `satisfies(version, range)`: Return true if the version satisfies the |  | ||||||
|   range. |  | ||||||
| * `maxSatisfying(versions, range)`: Return the highest version in the list |  | ||||||
|   that satisfies the range, or `null` if none of them do. |  | ||||||
| * `minSatisfying(versions, range)`: Return the lowest version in the list |  | ||||||
|   that satisfies the range, or `null` if none of them do. |  | ||||||
| * `minVersion(range)`: Return the lowest version that can possibly match |  | ||||||
|   the given range. |  | ||||||
| * `gtr(version, range)`: Return `true` if version is greater than all the |  | ||||||
|   versions possible in the range. |  | ||||||
| * `ltr(version, range)`: Return `true` if version is less than all the |  | ||||||
|   versions possible in the range. |  | ||||||
| * `outside(version, range, hilo)`: Return true if the version is outside |  | ||||||
|   the bounds of the range in either the high or low direction.  The |  | ||||||
|   `hilo` argument must be either the string `'>'` or `'<'`.  (This is |  | ||||||
|   the function called by `gtr` and `ltr`.) |  | ||||||
| * `intersects(range)`: Return true if any of the ranges comparators intersect |  | ||||||
| 
 |  | ||||||
| Note that, since ranges may be non-contiguous, a version might not be |  | ||||||
| greater than a range, less than a range, *or* satisfy a range!  For |  | ||||||
| example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` |  | ||||||
| until `2.0.0`, so the version `1.2.10` would not be greater than the |  | ||||||
| range (because `2.0.1` satisfies, which is higher), nor less than the |  | ||||||
| range (since `1.2.8` satisfies, which is lower), and it also does not |  | ||||||
| satisfy the range. |  | ||||||
| 
 |  | ||||||
| If you want to know if a version satisfies or does not satisfy a |  | ||||||
| range, use the `satisfies(version, range)` function. |  | ||||||
| 
 |  | ||||||
| ### Coercion |  | ||||||
| 
 |  | ||||||
| * `coerce(version, options)`: Coerces a string to semver if possible |  | ||||||
| 
 |  | ||||||
| This aims to provide a very forgiving translation of a non-semver string to |  | ||||||
| semver. It looks for the first digit in a string, and consumes all |  | ||||||
| remaining characters which satisfy at least a partial semver (e.g., `1`, |  | ||||||
| `1.2`, `1.2.3`) up to the max permitted length (256 characters).  Longer |  | ||||||
| versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`).  All |  | ||||||
| surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes |  | ||||||
| `3.4.0`).  Only text which lacks digits will fail coercion (`version one` |  | ||||||
| is not valid).  The maximum  length for any semver component considered for |  | ||||||
| coercion is 16 characters; longer components will be ignored |  | ||||||
| (`10000000000000000.4.7.4` becomes `4.7.4`).  The maximum value for any |  | ||||||
| semver component is `Integer.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value |  | ||||||
| components are invalid (`9999999999999999.4.7.4` is likely invalid). |  | ||||||
| 
 |  | ||||||
| If the `options.rtl` flag is set, then `coerce` will return the right-most |  | ||||||
| coercible tuple that does not share an ending index with a longer coercible |  | ||||||
| tuple.  For example, `1.2.3.4` will return `2.3.4` in rtl mode, not |  | ||||||
| `4.0.0`.  `1.2.3/4` will return `4.0.0`, because the `4` is not a part of |  | ||||||
| any other overlapping SemVer tuple. |  | ||||||
| 
 |  | ||||||
| ### Clean |  | ||||||
| 
 |  | ||||||
| * `clean(version)`: Clean a string to be a valid semver if possible |  | ||||||
| 
 |  | ||||||
| This will return a cleaned and trimmed semver version. If the provided version is not valid a null will be returned. This does not work for ranges.  |  | ||||||
| 
 |  | ||||||
| ex. |  | ||||||
| * `s.clean(' = v 2.1.5foo')`: `null` |  | ||||||
| * `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'` |  | ||||||
| * `s.clean(' = v 2.1.5-foo')`: `null` |  | ||||||
| * `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'` |  | ||||||
| * `s.clean('=v2.1.5')`: `'2.1.5'` |  | ||||||
| * `s.clean('  =v2.1.5')`: `2.1.5` |  | ||||||
| * `s.clean('      2.1.5   ')`: `'2.1.5'` |  | ||||||
| * `s.clean('~1.0.0')`: `null` |  | ||||||
							
								
								
									
										174
									
								
								node_modules/semver/bin/semver.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										174
									
								
								node_modules/semver/bin/semver.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,174 +0,0 @@ | |||||||
| #!/usr/bin/env node
 |  | ||||||
| // Standalone semver comparison program.
 |  | ||||||
| // Exits successfully and prints matching version(s) if
 |  | ||||||
| // any supplied version is valid and passes all tests.
 |  | ||||||
| 
 |  | ||||||
| var argv = process.argv.slice(2) |  | ||||||
| 
 |  | ||||||
| var versions = [] |  | ||||||
| 
 |  | ||||||
| var range = [] |  | ||||||
| 
 |  | ||||||
| var inc = null |  | ||||||
| 
 |  | ||||||
| var version = require('../package.json').version |  | ||||||
| 
 |  | ||||||
| var loose = false |  | ||||||
| 
 |  | ||||||
| var includePrerelease = false |  | ||||||
| 
 |  | ||||||
| var coerce = false |  | ||||||
| 
 |  | ||||||
| var rtl = false |  | ||||||
| 
 |  | ||||||
| var identifier |  | ||||||
| 
 |  | ||||||
| var semver = require('../semver') |  | ||||||
| 
 |  | ||||||
| var reverse = false |  | ||||||
| 
 |  | ||||||
| var options = {} |  | ||||||
| 
 |  | ||||||
| main() |  | ||||||
| 
 |  | ||||||
| function main () { |  | ||||||
|   if (!argv.length) return help() |  | ||||||
|   while (argv.length) { |  | ||||||
|     var a = argv.shift() |  | ||||||
|     var indexOfEqualSign = a.indexOf('=') |  | ||||||
|     if (indexOfEqualSign !== -1) { |  | ||||||
|       a = a.slice(0, indexOfEqualSign) |  | ||||||
|       argv.unshift(a.slice(indexOfEqualSign + 1)) |  | ||||||
|     } |  | ||||||
|     switch (a) { |  | ||||||
|       case '-rv': case '-rev': case '--rev': case '--reverse': |  | ||||||
|         reverse = true |  | ||||||
|         break |  | ||||||
|       case '-l': case '--loose': |  | ||||||
|         loose = true |  | ||||||
|         break |  | ||||||
|       case '-p': case '--include-prerelease': |  | ||||||
|         includePrerelease = true |  | ||||||
|         break |  | ||||||
|       case '-v': case '--version': |  | ||||||
|         versions.push(argv.shift()) |  | ||||||
|         break |  | ||||||
|       case '-i': case '--inc': case '--increment': |  | ||||||
|         switch (argv[0]) { |  | ||||||
|           case 'major': case 'minor': case 'patch': case 'prerelease': |  | ||||||
|           case 'premajor': case 'preminor': case 'prepatch': |  | ||||||
|             inc = argv.shift() |  | ||||||
|             break |  | ||||||
|           default: |  | ||||||
|             inc = 'patch' |  | ||||||
|             break |  | ||||||
|         } |  | ||||||
|         break |  | ||||||
|       case '--preid': |  | ||||||
|         identifier = argv.shift() |  | ||||||
|         break |  | ||||||
|       case '-r': case '--range': |  | ||||||
|         range.push(argv.shift()) |  | ||||||
|         break |  | ||||||
|       case '-c': case '--coerce': |  | ||||||
|         coerce = true |  | ||||||
|         break |  | ||||||
|       case '--rtl': |  | ||||||
|         rtl = true |  | ||||||
|         break |  | ||||||
|       case '--ltr': |  | ||||||
|         rtl = false |  | ||||||
|         break |  | ||||||
|       case '-h': case '--help': case '-?': |  | ||||||
|         return help() |  | ||||||
|       default: |  | ||||||
|         versions.push(a) |  | ||||||
|         break |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   var options = { loose: loose, includePrerelease: includePrerelease, rtl: rtl } |  | ||||||
| 
 |  | ||||||
|   versions = versions.map(function (v) { |  | ||||||
|     return coerce ? (semver.coerce(v, options) || { version: v }).version : v |  | ||||||
|   }).filter(function (v) { |  | ||||||
|     return semver.valid(v) |  | ||||||
|   }) |  | ||||||
|   if (!versions.length) return fail() |  | ||||||
|   if (inc && (versions.length !== 1 || range.length)) { return failInc() } |  | ||||||
| 
 |  | ||||||
|   for (var i = 0, l = range.length; i < l; i++) { |  | ||||||
|     versions = versions.filter(function (v) { |  | ||||||
|       return semver.satisfies(v, range[i], options) |  | ||||||
|     }) |  | ||||||
|     if (!versions.length) return fail() |  | ||||||
|   } |  | ||||||
|   return success(versions) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function failInc () { |  | ||||||
|   console.error('--inc can only be used on a single version with no range') |  | ||||||
|   fail() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function fail () { process.exit(1) } |  | ||||||
| 
 |  | ||||||
| function success () { |  | ||||||
|   var compare = reverse ? 'rcompare' : 'compare' |  | ||||||
|   versions.sort(function (a, b) { |  | ||||||
|     return semver[compare](a, b, options) |  | ||||||
|   }).map(function (v) { |  | ||||||
|     return semver.clean(v, options) |  | ||||||
|   }).map(function (v) { |  | ||||||
|     return inc ? semver.inc(v, inc, options, identifier) : v |  | ||||||
|   }).forEach(function (v, i, _) { console.log(v) }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function help () { |  | ||||||
|   console.log(['SemVer ' + version, |  | ||||||
|     '', |  | ||||||
|     'A JavaScript implementation of the https://semver.org/ specification', |  | ||||||
|     'Copyright Isaac Z. Schlueter', |  | ||||||
|     '', |  | ||||||
|     'Usage: semver [options] <version> [<version> [...]]', |  | ||||||
|     'Prints valid versions sorted by SemVer precedence', |  | ||||||
|     '', |  | ||||||
|     'Options:', |  | ||||||
|     '-r --range <range>', |  | ||||||
|     '        Print versions that match the specified range.', |  | ||||||
|     '', |  | ||||||
|     '-i --increment [<level>]', |  | ||||||
|     '        Increment a version by the specified level.  Level can', |  | ||||||
|     '        be one of: major, minor, patch, premajor, preminor,', |  | ||||||
|     "        prepatch, or prerelease.  Default level is 'patch'.", |  | ||||||
|     '        Only one version may be specified.', |  | ||||||
|     '', |  | ||||||
|     '--preid <identifier>', |  | ||||||
|     '        Identifier to be used to prefix premajor, preminor,', |  | ||||||
|     '        prepatch or prerelease version increments.', |  | ||||||
|     '', |  | ||||||
|     '-l --loose', |  | ||||||
|     '        Interpret versions and ranges loosely', |  | ||||||
|     '', |  | ||||||
|     '-p --include-prerelease', |  | ||||||
|     '        Always include prerelease versions in range matching', |  | ||||||
|     '', |  | ||||||
|     '-c --coerce', |  | ||||||
|     '        Coerce a string into SemVer if possible', |  | ||||||
|     '        (does not imply --loose)', |  | ||||||
|     '', |  | ||||||
|     '--rtl', |  | ||||||
|     '        Coerce version strings right to left', |  | ||||||
|     '', |  | ||||||
|     '--ltr', |  | ||||||
|     '        Coerce version strings left to right (default)', |  | ||||||
|     '', |  | ||||||
|     'Program exits successfully if any valid version satisfies', |  | ||||||
|     'all supplied ranges, and prints all satisfying versions.', |  | ||||||
|     '', |  | ||||||
|     'If no satisfying versions are found, then exits failure.', |  | ||||||
|     '', |  | ||||||
|     'Versions are printed in ascending order, so supplying', |  | ||||||
|     'multiple versions to the utility will just sort them.' |  | ||||||
|   ].join('\n')) |  | ||||||
| } |  | ||||||
							
								
								
									
										62
									
								
								node_modules/semver/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										62
									
								
								node_modules/semver/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,62 +0,0 @@ | |||||||
| { |  | ||||||
|   "_from": "semver@^6.1.1", |  | ||||||
|   "_id": "semver@6.3.0", |  | ||||||
|   "_inBundle": false, |  | ||||||
|   "_integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", |  | ||||||
|   "_location": "/semver", |  | ||||||
|   "_phantomChildren": {}, |  | ||||||
|   "_requested": { |  | ||||||
|     "type": "range", |  | ||||||
|     "registry": true, |  | ||||||
|     "raw": "semver@^6.1.1", |  | ||||||
|     "name": "semver", |  | ||||||
|     "escapedName": "semver", |  | ||||||
|     "rawSpec": "^6.1.1", |  | ||||||
|     "saveSpec": null, |  | ||||||
|     "fetchSpec": "^6.1.1" |  | ||||||
|   }, |  | ||||||
|   "_requiredBy": [ |  | ||||||
|     "/", |  | ||||||
|     "/@actions/tool-cache", |  | ||||||
|     "/istanbul-lib-instrument" |  | ||||||
|   ], |  | ||||||
|   "_resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", |  | ||||||
|   "_shasum": "ee0a64c8af5e8ceea67687b133761e1becbd1d3d", |  | ||||||
|   "_spec": "semver@^6.1.1", |  | ||||||
|   "_where": "E:\\github\\setup-python", |  | ||||||
|   "bin": { |  | ||||||
|     "semver": "./bin/semver.js" |  | ||||||
|   }, |  | ||||||
|   "bugs": { |  | ||||||
|     "url": "https://github.com/npm/node-semver/issues" |  | ||||||
|   }, |  | ||||||
|   "bundleDependencies": false, |  | ||||||
|   "deprecated": false, |  | ||||||
|   "description": "The semantic version parser used by npm.", |  | ||||||
|   "devDependencies": { |  | ||||||
|     "tap": "^14.3.1" |  | ||||||
|   }, |  | ||||||
|   "files": [ |  | ||||||
|     "bin", |  | ||||||
|     "range.bnf", |  | ||||||
|     "semver.js" |  | ||||||
|   ], |  | ||||||
|   "homepage": "https://github.com/npm/node-semver#readme", |  | ||||||
|   "license": "ISC", |  | ||||||
|   "main": "semver.js", |  | ||||||
|   "name": "semver", |  | ||||||
|   "repository": { |  | ||||||
|     "type": "git", |  | ||||||
|     "url": "git+https://github.com/npm/node-semver.git" |  | ||||||
|   }, |  | ||||||
|   "scripts": { |  | ||||||
|     "postpublish": "git push origin --follow-tags", |  | ||||||
|     "postversion": "npm publish", |  | ||||||
|     "preversion": "npm test", |  | ||||||
|     "test": "tap" |  | ||||||
|   }, |  | ||||||
|   "tap": { |  | ||||||
|     "check-coverage": true |  | ||||||
|   }, |  | ||||||
|   "version": "6.3.0" |  | ||||||
| } |  | ||||||
							
								
								
									
										16
									
								
								node_modules/semver/range.bnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								node_modules/semver/range.bnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,16 +0,0 @@ | |||||||
| range-set  ::= range ( logical-or range ) * |  | ||||||
| logical-or ::= ( ' ' ) * '||' ( ' ' ) * |  | ||||||
| range      ::= hyphen | simple ( ' ' simple ) * | '' |  | ||||||
| hyphen     ::= partial ' - ' partial |  | ||||||
| simple     ::= primitive | partial | tilde | caret |  | ||||||
| primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial |  | ||||||
| partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )? |  | ||||||
| xr         ::= 'x' | 'X' | '*' | nr |  | ||||||
| nr         ::= '0' | [1-9] ( [0-9] ) * |  | ||||||
| tilde      ::= '~' partial |  | ||||||
| caret      ::= '^' partial |  | ||||||
| qualifier  ::= ( '-' pre )? ( '+' build )? |  | ||||||
| pre        ::= parts |  | ||||||
| build      ::= parts |  | ||||||
| parts      ::= part ( '.' part ) * |  | ||||||
| part       ::= nr | [-0-9A-Za-z]+ |  | ||||||
							
								
								
									
										1596
									
								
								node_modules/semver/semver.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1596
									
								
								node_modules/semver/semver.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								node_modules/tunnel/.npmignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								node_modules/tunnel/.npmignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,2 +0,0 @@ | |||||||
| /.idea |  | ||||||
| /node_modules |  | ||||||
							
								
								
									
										13
									
								
								node_modules/tunnel/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								node_modules/tunnel/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,13 +0,0 @@ | |||||||
| # Changelog |  | ||||||
| 
 |  | ||||||
|  - 0.0.4 (2016/01/23) |  | ||||||
|    - supported Node v0.12 or later. |  | ||||||
| 
 |  | ||||||
|  - 0.0.3 (2014/01/20) |  | ||||||
|    - fixed package.json |  | ||||||
| 
 |  | ||||||
|  - 0.0.1 (2012/02/18) |  | ||||||
|    - supported Node v0.6.x (0.6.11 or later). |  | ||||||
| 
 |  | ||||||
|  - 0.0.0 (2012/02/11) |  | ||||||
|    - first release. |  | ||||||
							
								
								
									
										21
									
								
								node_modules/tunnel/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								node_modules/tunnel/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,21 +0,0 @@ | |||||||
| The MIT License (MIT) |  | ||||||
| 
 |  | ||||||
| Copyright (c) 2012 Koichi Kobayashi |  | ||||||
| 
 |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining a copy |  | ||||||
| of this software and associated documentation files (the "Software"), to deal |  | ||||||
| in the Software without restriction, including without limitation the rights |  | ||||||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |  | ||||||
| copies of the Software, and to permit persons to whom the Software is |  | ||||||
| furnished to do so, subject to the following conditions: |  | ||||||
| 
 |  | ||||||
| The above copyright notice and this permission notice shall be included in |  | ||||||
| all copies or substantial portions of the Software. |  | ||||||
| 
 |  | ||||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |  | ||||||
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |  | ||||||
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |  | ||||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |  | ||||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |  | ||||||
| THE SOFTWARE. |  | ||||||
							
								
								
									
										179
									
								
								node_modules/tunnel/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										179
									
								
								node_modules/tunnel/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,179 +0,0 @@ | |||||||
| # node-tunnel - HTTP/HTTPS Agents for tunneling proxies |  | ||||||
| 
 |  | ||||||
| ## Example |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| var tunnel = require('tunnel'); |  | ||||||
| 
 |  | ||||||
| var tunnelingAgent = tunnel.httpsOverHttp({ |  | ||||||
|   proxy: { |  | ||||||
|     host: 'localhost', |  | ||||||
|     port: 3128 |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| var req = https.request({ |  | ||||||
|   host: 'example.com', |  | ||||||
|   port: 443, |  | ||||||
|   agent: tunnelingAgent |  | ||||||
| }); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ## Installation |  | ||||||
| 
 |  | ||||||
|     $ npm install tunnel |  | ||||||
| 
 |  | ||||||
| ## Usages |  | ||||||
| 
 |  | ||||||
| ### HTTP over HTTP tunneling |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| var tunnelingAgent = tunnel.httpOverHttp({ |  | ||||||
|   maxSockets: poolSize, // Defaults to 5 |  | ||||||
| 
 |  | ||||||
|   proxy: { // Proxy settings |  | ||||||
|     host: proxyHost, // Defaults to 'localhost' |  | ||||||
|     port: proxyPort, // Defaults to 80 |  | ||||||
|     localAddress: localAddress, // Local interface if necessary |  | ||||||
| 
 |  | ||||||
|     // Basic authorization for proxy server if necessary |  | ||||||
|     proxyAuth: 'user:password', |  | ||||||
| 
 |  | ||||||
|     // Header fields for proxy server if necessary |  | ||||||
|     headers: { |  | ||||||
|       'User-Agent': 'Node' |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| var req = http.request({ |  | ||||||
|   host: 'example.com', |  | ||||||
|   port: 80, |  | ||||||
|   agent: tunnelingAgent |  | ||||||
| }); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### HTTPS over HTTP tunneling |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| var tunnelingAgent = tunnel.httpsOverHttp({ |  | ||||||
|   maxSockets: poolSize, // Defaults to 5 |  | ||||||
| 
 |  | ||||||
|   // CA for origin server if necessary |  | ||||||
|   ca: [ fs.readFileSync('origin-server-ca.pem')], |  | ||||||
| 
 |  | ||||||
|   // Client certification for origin server if necessary |  | ||||||
|   key: fs.readFileSync('origin-server-key.pem'), |  | ||||||
|   cert: fs.readFileSync('origin-server-cert.pem'), |  | ||||||
| 
 |  | ||||||
|   proxy: { // Proxy settings |  | ||||||
|     host: proxyHost, // Defaults to 'localhost' |  | ||||||
|     port: proxyPort, // Defaults to 80 |  | ||||||
|     localAddress: localAddress, // Local interface if necessary |  | ||||||
| 
 |  | ||||||
|     // Basic authorization for proxy server if necessary |  | ||||||
|     proxyAuth: 'user:password', |  | ||||||
| 
 |  | ||||||
|     // Header fields for proxy server if necessary |  | ||||||
|     headers: { |  | ||||||
|       'User-Agent': 'Node' |  | ||||||
|     }, |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| var req = https.request({ |  | ||||||
|   host: 'example.com', |  | ||||||
|   port: 443, |  | ||||||
|   agent: tunnelingAgent |  | ||||||
| }); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### HTTP over HTTPS tunneling |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| var tunnelingAgent = tunnel.httpOverHttps({ |  | ||||||
|   maxSockets: poolSize, // Defaults to 5 |  | ||||||
| 
 |  | ||||||
|   proxy: { // Proxy settings |  | ||||||
|     host: proxyHost, // Defaults to 'localhost' |  | ||||||
|     port: proxyPort, // Defaults to 443 |  | ||||||
|     localAddress: localAddress, // Local interface if necessary |  | ||||||
| 
 |  | ||||||
|     // Basic authorization for proxy server if necessary |  | ||||||
|     proxyAuth: 'user:password', |  | ||||||
| 
 |  | ||||||
|     // Header fields for proxy server if necessary |  | ||||||
|     headers: { |  | ||||||
|       'User-Agent': 'Node' |  | ||||||
|     }, |  | ||||||
| 
 |  | ||||||
|     // CA for proxy server if necessary |  | ||||||
|     ca: [ fs.readFileSync('origin-server-ca.pem')], |  | ||||||
| 
 |  | ||||||
|     // Server name for verification if necessary |  | ||||||
|     servername: 'example.com', |  | ||||||
| 
 |  | ||||||
|     // Client certification for proxy server if necessary |  | ||||||
|     key: fs.readFileSync('origin-server-key.pem'), |  | ||||||
|     cert: fs.readFileSync('origin-server-cert.pem'), |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| var req = http.request({ |  | ||||||
|   host: 'example.com', |  | ||||||
|   port: 80, |  | ||||||
|   agent: tunnelingAgent |  | ||||||
| }); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### HTTPS over HTTPS tunneling |  | ||||||
| 
 |  | ||||||
| ```javascript |  | ||||||
| var tunnelingAgent = tunnel.httpsOverHttps({ |  | ||||||
|   maxSockets: poolSize, // Defaults to 5 |  | ||||||
| 
 |  | ||||||
|   // CA for origin server if necessary |  | ||||||
|   ca: [ fs.readFileSync('origin-server-ca.pem')], |  | ||||||
| 
 |  | ||||||
|   // Client certification for origin server if necessary |  | ||||||
|   key: fs.readFileSync('origin-server-key.pem'), |  | ||||||
|   cert: fs.readFileSync('origin-server-cert.pem'), |  | ||||||
| 
 |  | ||||||
|   proxy: { // Proxy settings |  | ||||||
|     host: proxyHost, // Defaults to 'localhost' |  | ||||||
|     port: proxyPort, // Defaults to 443 |  | ||||||
|     localAddress: localAddress, // Local interface if necessary |  | ||||||
| 
 |  | ||||||
|     // Basic authorization for proxy server if necessary |  | ||||||
|     proxyAuth: 'user:password', |  | ||||||
| 
 |  | ||||||
|     // Header fields for proxy server if necessary |  | ||||||
|     headers: { |  | ||||||
|       'User-Agent': 'Node' |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // CA for proxy server if necessary |  | ||||||
|     ca: [ fs.readFileSync('origin-server-ca.pem')], |  | ||||||
| 
 |  | ||||||
|     // Server name for verification if necessary |  | ||||||
|     servername: 'example.com', |  | ||||||
| 
 |  | ||||||
|     // Client certification for proxy server if necessary |  | ||||||
|     key: fs.readFileSync('origin-server-key.pem'), |  | ||||||
|     cert: fs.readFileSync('origin-server-cert.pem'), |  | ||||||
|   } |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| var req = https.request({ |  | ||||||
|   host: 'example.com', |  | ||||||
|   port: 443, |  | ||||||
|   agent: tunnelingAgent |  | ||||||
| }); |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ## CONTRIBUTORS |  | ||||||
| * [Aleksis Brezas (abresas)](https://github.com/abresas) |  | ||||||
| 
 |  | ||||||
| ## License |  | ||||||
| 
 |  | ||||||
| Licensed under the [MIT](https://github.com/koichik/node-tunnel/blob/master/LICENSE) license. |  | ||||||
							
								
								
									
										1
									
								
								node_modules/tunnel/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/tunnel/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| module.exports = require('./lib/tunnel'); |  | ||||||
							
								
								
									
										247
									
								
								node_modules/tunnel/lib/tunnel.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										247
									
								
								node_modules/tunnel/lib/tunnel.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,247 +0,0 @@ | |||||||
| 'use strict'; |  | ||||||
| 
 |  | ||||||
| var net = require('net'); |  | ||||||
| var tls = require('tls'); |  | ||||||
| var http = require('http'); |  | ||||||
| var https = require('https'); |  | ||||||
| var events = require('events'); |  | ||||||
| var assert = require('assert'); |  | ||||||
| var util = require('util'); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| exports.httpOverHttp = httpOverHttp; |  | ||||||
| exports.httpsOverHttp = httpsOverHttp; |  | ||||||
| exports.httpOverHttps = httpOverHttps; |  | ||||||
| exports.httpsOverHttps = httpsOverHttps; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function httpOverHttp(options) { |  | ||||||
|   var agent = new TunnelingAgent(options); |  | ||||||
|   agent.request = http.request; |  | ||||||
|   return agent; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function httpsOverHttp(options) { |  | ||||||
|   var agent = new TunnelingAgent(options); |  | ||||||
|   agent.request = http.request; |  | ||||||
|   agent.createSocket = createSecureSocket; |  | ||||||
|   return agent; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function httpOverHttps(options) { |  | ||||||
|   var agent = new TunnelingAgent(options); |  | ||||||
|   agent.request = https.request; |  | ||||||
|   return agent; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function httpsOverHttps(options) { |  | ||||||
|   var agent = new TunnelingAgent(options); |  | ||||||
|   agent.request = https.request; |  | ||||||
|   agent.createSocket = createSecureSocket; |  | ||||||
|   return agent; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function TunnelingAgent(options) { |  | ||||||
|   var self = this; |  | ||||||
|   self.options = options || {}; |  | ||||||
|   self.proxyOptions = self.options.proxy || {}; |  | ||||||
|   self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; |  | ||||||
|   self.requests = []; |  | ||||||
|   self.sockets = []; |  | ||||||
| 
 |  | ||||||
|   self.on('free', function onFree(socket, host, port, localAddress) { |  | ||||||
|     var options = toOptions(host, port, localAddress); |  | ||||||
|     for (var i = 0, len = self.requests.length; i < len; ++i) { |  | ||||||
|       var pending = self.requests[i]; |  | ||||||
|       if (pending.host === options.host && pending.port === options.port) { |  | ||||||
|         // Detect the request to connect same origin server,
 |  | ||||||
|         // reuse the connection.
 |  | ||||||
|         self.requests.splice(i, 1); |  | ||||||
|         pending.request.onSocket(socket); |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     socket.destroy(); |  | ||||||
|     self.removeSocket(socket); |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
| util.inherits(TunnelingAgent, events.EventEmitter); |  | ||||||
| 
 |  | ||||||
| TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { |  | ||||||
|   var self = this; |  | ||||||
|   var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); |  | ||||||
| 
 |  | ||||||
|   if (self.sockets.length >= this.maxSockets) { |  | ||||||
|     // We are over limit so we'll add it to the queue.
 |  | ||||||
|     self.requests.push(options); |  | ||||||
|     return; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // If we are under maxSockets create a new one.
 |  | ||||||
|   self.createSocket(options, function(socket) { |  | ||||||
|     socket.on('free', onFree); |  | ||||||
|     socket.on('close', onCloseOrRemove); |  | ||||||
|     socket.on('agentRemove', onCloseOrRemove); |  | ||||||
|     req.onSocket(socket); |  | ||||||
| 
 |  | ||||||
|     function onFree() { |  | ||||||
|       self.emit('free', socket, options); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function onCloseOrRemove(err) { |  | ||||||
|       self.removeSocket(socket); |  | ||||||
|       socket.removeListener('free', onFree); |  | ||||||
|       socket.removeListener('close', onCloseOrRemove); |  | ||||||
|       socket.removeListener('agentRemove', onCloseOrRemove); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { |  | ||||||
|   var self = this; |  | ||||||
|   var placeholder = {}; |  | ||||||
|   self.sockets.push(placeholder); |  | ||||||
| 
 |  | ||||||
|   var connectOptions = mergeOptions({}, self.proxyOptions, { |  | ||||||
|     method: 'CONNECT', |  | ||||||
|     path: options.host + ':' + options.port, |  | ||||||
|     agent: false |  | ||||||
|   }); |  | ||||||
|   if (connectOptions.proxyAuth) { |  | ||||||
|     connectOptions.headers = connectOptions.headers || {}; |  | ||||||
|     connectOptions.headers['Proxy-Authorization'] = 'Basic ' + |  | ||||||
|         new Buffer(connectOptions.proxyAuth).toString('base64'); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   debug('making CONNECT request'); |  | ||||||
|   var connectReq = self.request(connectOptions); |  | ||||||
|   connectReq.useChunkedEncodingByDefault = false; // for v0.6
 |  | ||||||
|   connectReq.once('response', onResponse); // for v0.6
 |  | ||||||
|   connectReq.once('upgrade', onUpgrade);   // for v0.6
 |  | ||||||
|   connectReq.once('connect', onConnect);   // for v0.7 or later
 |  | ||||||
|   connectReq.once('error', onError); |  | ||||||
|   connectReq.end(); |  | ||||||
| 
 |  | ||||||
|   function onResponse(res) { |  | ||||||
|     // Very hacky. This is necessary to avoid http-parser leaks.
 |  | ||||||
|     res.upgrade = true; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function onUpgrade(res, socket, head) { |  | ||||||
|     // Hacky.
 |  | ||||||
|     process.nextTick(function() { |  | ||||||
|       onConnect(res, socket, head); |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function onConnect(res, socket, head) { |  | ||||||
|     connectReq.removeAllListeners(); |  | ||||||
|     socket.removeAllListeners(); |  | ||||||
| 
 |  | ||||||
|     if (res.statusCode === 200) { |  | ||||||
|       assert.equal(head.length, 0); |  | ||||||
|       debug('tunneling connection has established'); |  | ||||||
|       self.sockets[self.sockets.indexOf(placeholder)] = socket; |  | ||||||
|       cb(socket); |  | ||||||
|     } else { |  | ||||||
|       debug('tunneling socket could not be established, statusCode=%d', |  | ||||||
|             res.statusCode); |  | ||||||
|       var error = new Error('tunneling socket could not be established, ' + |  | ||||||
|                             'statusCode=' + res.statusCode); |  | ||||||
|       error.code = 'ECONNRESET'; |  | ||||||
|       options.request.emit('error', error); |  | ||||||
|       self.removeSocket(placeholder); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   function onError(cause) { |  | ||||||
|     connectReq.removeAllListeners(); |  | ||||||
| 
 |  | ||||||
|     debug('tunneling socket could not be established, cause=%s\n', |  | ||||||
|           cause.message, cause.stack); |  | ||||||
|     var error = new Error('tunneling socket could not be established, ' + |  | ||||||
|                           'cause=' + cause.message); |  | ||||||
|     error.code = 'ECONNRESET'; |  | ||||||
|     options.request.emit('error', error); |  | ||||||
|     self.removeSocket(placeholder); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { |  | ||||||
|   var pos = this.sockets.indexOf(socket) |  | ||||||
|   if (pos === -1) { |  | ||||||
|     return; |  | ||||||
|   } |  | ||||||
|   this.sockets.splice(pos, 1); |  | ||||||
| 
 |  | ||||||
|   var pending = this.requests.shift(); |  | ||||||
|   if (pending) { |  | ||||||
|     // If we have pending requests and a socket gets closed a new one
 |  | ||||||
|     // needs to be created to take over in the pool for the one that closed.
 |  | ||||||
|     this.createSocket(pending, function(socket) { |  | ||||||
|       pending.request.onSocket(socket); |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| function createSecureSocket(options, cb) { |  | ||||||
|   var self = this; |  | ||||||
|   TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { |  | ||||||
|     var hostHeader = options.request.getHeader('host'); |  | ||||||
|     var tlsOptions = mergeOptions({}, self.options, { |  | ||||||
|       socket: socket, |  | ||||||
|       servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     // 0 is dummy port for v0.6
 |  | ||||||
|     var secureSocket = tls.connect(0, tlsOptions); |  | ||||||
|     self.sockets[self.sockets.indexOf(socket)] = secureSocket; |  | ||||||
|     cb(secureSocket); |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| function toOptions(host, port, localAddress) { |  | ||||||
|   if (typeof host === 'string') { // since v0.10
 |  | ||||||
|     return { |  | ||||||
|       host: host, |  | ||||||
|       port: port, |  | ||||||
|       localAddress: localAddress |  | ||||||
|     }; |  | ||||||
|   } |  | ||||||
|   return host; // for v0.11 or later
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function mergeOptions(target) { |  | ||||||
|   for (var i = 1, len = arguments.length; i < len; ++i) { |  | ||||||
|     var overrides = arguments[i]; |  | ||||||
|     if (typeof overrides === 'object') { |  | ||||||
|       var keys = Object.keys(overrides); |  | ||||||
|       for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { |  | ||||||
|         var k = keys[j]; |  | ||||||
|         if (overrides[k] !== undefined) { |  | ||||||
|           target[k] = overrides[k]; |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return target; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| var debug; |  | ||||||
| if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { |  | ||||||
|   debug = function() { |  | ||||||
|     var args = Array.prototype.slice.call(arguments); |  | ||||||
|     if (typeof args[0] === 'string') { |  | ||||||
|       args[0] = 'TUNNEL: ' + args[0]; |  | ||||||
|     } else { |  | ||||||
|       args.unshift('TUNNEL:'); |  | ||||||
|     } |  | ||||||
|     console.error.apply(console, args); |  | ||||||
|   } |  | ||||||
| } else { |  | ||||||
|   debug = function() {}; |  | ||||||
| } |  | ||||||
| exports.debug = debug; // for test
 |  | ||||||
							
								
								
									
										64
									
								
								node_modules/tunnel/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								node_modules/tunnel/package.json
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,64 +0,0 @@ | |||||||
| { |  | ||||||
|   "_from": "tunnel@0.0.4", |  | ||||||
|   "_id": "tunnel@0.0.4", |  | ||||||
|   "_inBundle": false, |  | ||||||
|   "_integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", |  | ||||||
|   "_location": "/tunnel", |  | ||||||
|   "_phantomChildren": {}, |  | ||||||
|   "_requested": { |  | ||||||
|     "type": "version", |  | ||||||
|     "registry": true, |  | ||||||
|     "raw": "tunnel@0.0.4", |  | ||||||
|     "name": "tunnel", |  | ||||||
|     "escapedName": "tunnel", |  | ||||||
|     "rawSpec": "0.0.4", |  | ||||||
|     "saveSpec": null, |  | ||||||
|     "fetchSpec": "0.0.4" |  | ||||||
|   }, |  | ||||||
|   "_requiredBy": [ |  | ||||||
|     "/typed-rest-client" |  | ||||||
|   ], |  | ||||||
|   "_resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", |  | ||||||
|   "_shasum": "2d3785a158c174c9a16dc2c046ec5fc5f1742213", |  | ||||||
|   "_spec": "tunnel@0.0.4", |  | ||||||
|   "_where": "E:\\github\\setup-python\\node_modules\\typed-rest-client", |  | ||||||
|   "author": { |  | ||||||
|     "name": "Koichi Kobayashi", |  | ||||||
|     "email": "koichik@improvement.jp" |  | ||||||
|   }, |  | ||||||
|   "bugs": { |  | ||||||
|     "url": "https://github.com/koichik/node-tunnel/issues" |  | ||||||
|   }, |  | ||||||
|   "bundleDependencies": false, |  | ||||||
|   "deprecated": false, |  | ||||||
|   "description": "Node HTTP/HTTPS Agents for tunneling proxies", |  | ||||||
|   "devDependencies": { |  | ||||||
|     "mocha": "*", |  | ||||||
|     "should": "*" |  | ||||||
|   }, |  | ||||||
|   "directories": { |  | ||||||
|     "lib": "./lib" |  | ||||||
|   }, |  | ||||||
|   "engines": { |  | ||||||
|     "node": ">=0.6.11 <=0.7.0 || >=0.7.3" |  | ||||||
|   }, |  | ||||||
|   "homepage": "https://github.com/koichik/node-tunnel/", |  | ||||||
|   "keywords": [ |  | ||||||
|     "http", |  | ||||||
|     "https", |  | ||||||
|     "agent", |  | ||||||
|     "proxy", |  | ||||||
|     "tunnel" |  | ||||||
|   ], |  | ||||||
|   "license": "MIT", |  | ||||||
|   "main": "./index.js", |  | ||||||
|   "name": "tunnel", |  | ||||||
|   "repository": { |  | ||||||
|     "type": "git", |  | ||||||
|     "url": "git+https://github.com/koichik/node-tunnel.git" |  | ||||||
|   }, |  | ||||||
|   "scripts": { |  | ||||||
|     "test": "./node_modules/mocha/bin/mocha" |  | ||||||
|   }, |  | ||||||
|   "version": "0.0.4" |  | ||||||
| } |  | ||||||
							
								
								
									
										108
									
								
								node_modules/tunnel/test/http-over-http.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										108
									
								
								node_modules/tunnel/test/http-over-http.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,108 +0,0 @@ | |||||||
| var http = require('http'); |  | ||||||
| var net = require('net'); |  | ||||||
| var should = require('should'); |  | ||||||
| var tunnel = require('../index'); |  | ||||||
| 
 |  | ||||||
| describe('HTTP over HTTP', function() { |  | ||||||
|   it('should finish without error', function(done) { |  | ||||||
|     var serverPort = 3000; |  | ||||||
|     var proxyPort = 3001; |  | ||||||
|     var poolSize = 3; |  | ||||||
|     var N = 10; |  | ||||||
|     var serverConnect = 0; |  | ||||||
|     var proxyConnect = 0; |  | ||||||
|     var clientConnect = 0; |  | ||||||
|     var server; |  | ||||||
|     var proxy; |  | ||||||
|     var agent; |  | ||||||
|      |  | ||||||
|     server = http.createServer(function(req, res) { |  | ||||||
|       tunnel.debug('SERVER: got request'); |  | ||||||
|       ++serverConnect; |  | ||||||
|       res.writeHead(200); |  | ||||||
|       res.end('Hello' + req.url); |  | ||||||
|       tunnel.debug('SERVER: sending response'); |  | ||||||
|     }); |  | ||||||
|     server.listen(serverPort, setupProxy); |  | ||||||
| 
 |  | ||||||
|     function setupProxy() { |  | ||||||
|       proxy = http.createServer(function(req, res) { |  | ||||||
|         should.fail(); |  | ||||||
|       }); |  | ||||||
|       proxy.on('upgrade', onConnect); // for v0.6
 |  | ||||||
|       proxy.on('connect', onConnect); // for v0.7 or later
 |  | ||||||
| 
 |  | ||||||
|       function onConnect(req, clientSocket, head) { |  | ||||||
|         tunnel.debug('PROXY: got CONNECT request'); |  | ||||||
| 
 |  | ||||||
|         req.method.should.equal('CONNECT'); |  | ||||||
|         req.url.should.equal('localhost:' + serverPort); |  | ||||||
|         req.headers.should.not.have.property('transfer-encoding'); |  | ||||||
|         req.headers.should.have.property('proxy-authorization', |  | ||||||
|             'Basic ' + new Buffer('user:password').toString('base64')); |  | ||||||
|         ++proxyConnect; |  | ||||||
|      |  | ||||||
|         tunnel.debug('PROXY: creating a tunnel'); |  | ||||||
|         var serverSocket = net.connect(serverPort, function() { |  | ||||||
|           tunnel.debug('PROXY: replying to client CONNECT request'); |  | ||||||
|           clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); |  | ||||||
|           clientSocket.pipe(serverSocket); |  | ||||||
|           serverSocket.write(head); |  | ||||||
|           serverSocket.pipe(clientSocket); |  | ||||||
|           // workaround, see joyent/node#2524
 |  | ||||||
|           serverSocket.on('end', function() { |  | ||||||
|             clientSocket.end(); |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|       proxy.listen(proxyPort, setupClient); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function setupClient() { |  | ||||||
|       agent = tunnel.httpOverHttp({ |  | ||||||
|         maxSockets: poolSize, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           proxyAuth: 'user:password' |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
| 
 |  | ||||||
|       for (var i = 0; i < N; ++i) { |  | ||||||
|         doClientRequest(i); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       function doClientRequest(i) { |  | ||||||
|         tunnel.debug('CLIENT: Making HTTP request (%d)', i); |  | ||||||
|         var req = http.get({ |  | ||||||
|           port: serverPort, |  | ||||||
|           path: '/' + i, |  | ||||||
|           agent: agent |  | ||||||
|         }, function(res) { |  | ||||||
|           tunnel.debug('CLIENT: got HTTP response (%d)', i); |  | ||||||
|           res.setEncoding('utf8'); |  | ||||||
|           res.on('data', function(data) { |  | ||||||
|             data.should.equal('Hello/' + i); |  | ||||||
|           }); |  | ||||||
|           res.on('end', function() { |  | ||||||
|             ++clientConnect; |  | ||||||
|             if (clientConnect === N) { |  | ||||||
|               proxy.close(); |  | ||||||
|               server.close(); |  | ||||||
|             } |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     server.on('close', function() { |  | ||||||
|       serverConnect.should.equal(N); |  | ||||||
|       proxyConnect.should.equal(poolSize); |  | ||||||
|       clientConnect.should.equal(N); |  | ||||||
|      |  | ||||||
|       agent.sockets.should.be.empty; |  | ||||||
|       agent.requests.should.be.empty; |  | ||||||
|    |  | ||||||
|       done(); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
							
								
								
									
										130
									
								
								node_modules/tunnel/test/http-over-https.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										130
									
								
								node_modules/tunnel/test/http-over-https.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,130 +0,0 @@ | |||||||
| var http = require('http'); |  | ||||||
| var https = require('https'); |  | ||||||
| var net = require('net'); |  | ||||||
| var fs = require('fs'); |  | ||||||
| var path = require('path'); |  | ||||||
| var should = require('should'); |  | ||||||
| var tunnel = require('../index'); |  | ||||||
| 
 |  | ||||||
| function readPem(file) { |  | ||||||
|   return fs.readFileSync(path.join('test/keys', file + '.pem')); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var proxyKey = readPem('proxy1-key'); |  | ||||||
| var proxyCert = readPem('proxy1-cert'); |  | ||||||
| var proxyCA = readPem('ca2-cert'); |  | ||||||
| var clientKey = readPem('client1-key'); |  | ||||||
| var clientCert = readPem('client1-cert'); |  | ||||||
| var clientCA = readPem('ca3-cert'); |  | ||||||
| 
 |  | ||||||
| describe('HTTP over HTTPS', function() { |  | ||||||
|   it('should finish without error', function(done) { |  | ||||||
|     var serverPort = 3004; |  | ||||||
|     var proxyPort = 3005; |  | ||||||
|     var poolSize = 3; |  | ||||||
|     var N = 10; |  | ||||||
|     var serverConnect = 0; |  | ||||||
|     var proxyConnect = 0; |  | ||||||
|     var clientConnect = 0; |  | ||||||
|     var server; |  | ||||||
|     var proxy; |  | ||||||
|     var agent; |  | ||||||
| 
 |  | ||||||
|     server = http.createServer(function(req, res) { |  | ||||||
|       tunnel.debug('SERVER: got request'); |  | ||||||
|       ++serverConnect; |  | ||||||
|       res.writeHead(200); |  | ||||||
|       res.end('Hello' + req.url); |  | ||||||
|       tunnel.debug('SERVER: sending response'); |  | ||||||
|     }); |  | ||||||
|     server.listen(serverPort, setupProxy); |  | ||||||
| 
 |  | ||||||
|     function setupProxy() { |  | ||||||
|       proxy = https.createServer({ |  | ||||||
|         key: proxyKey, |  | ||||||
|         cert: proxyCert, |  | ||||||
|         ca: [clientCA], |  | ||||||
|         requestCert: true, |  | ||||||
|         rejectUnauthorized: true |  | ||||||
|       }, function(req, res) { |  | ||||||
|         should.fail(); |  | ||||||
|       }); |  | ||||||
|       proxy.on('upgrade', onConnect); // for v0.6
 |  | ||||||
|       proxy.on('connect', onConnect); // for v0.7 or later
 |  | ||||||
| 
 |  | ||||||
|       function onConnect(req, clientSocket, head) { |  | ||||||
|         tunnel.debug('PROXY: got CONNECT request'); |  | ||||||
| 
 |  | ||||||
|         req.method.should.equal('CONNECT'); |  | ||||||
|         req.url.should.equal('localhost:' + serverPort); |  | ||||||
|         req.headers.should.not.have.property('transfer-encoding'); |  | ||||||
|         ++proxyConnect; |  | ||||||
| 
 |  | ||||||
|         tunnel.debug('PROXY: creating a tunnel'); |  | ||||||
|         var serverSocket = net.connect(serverPort, function() { |  | ||||||
|           tunnel.debug('PROXY: replying to client CONNECT request'); |  | ||||||
|           clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); |  | ||||||
|           clientSocket.pipe(serverSocket); |  | ||||||
|           serverSocket.write(head); |  | ||||||
|           serverSocket.pipe(clientSocket); |  | ||||||
|           // workaround, see joyent/node#2524
 |  | ||||||
|           serverSocket.on('end', function() { |  | ||||||
|             clientSocket.end(); |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|       proxy.listen(proxyPort, setupClient); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function setupClient() { |  | ||||||
|       agent = tunnel.httpOverHttps({ |  | ||||||
|         maxSockets: poolSize, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           key: clientKey, |  | ||||||
|           cert: clientCert, |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthorized: true |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
| 
 |  | ||||||
|       for (var i = 0; i < N; ++i) { |  | ||||||
|         doClientRequest(i); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       function doClientRequest(i) { |  | ||||||
|         tunnel.debug('CLIENT: Making HTTP request (%d)', i); |  | ||||||
|         var req = http.get({ |  | ||||||
|           port: serverPort, |  | ||||||
|           path: '/' + i, |  | ||||||
|           agent: agent |  | ||||||
|         }, function(res) { |  | ||||||
|           tunnel.debug('CLIENT: got HTTP response (%d)', i); |  | ||||||
|           res.setEncoding('utf8'); |  | ||||||
|           res.on('data', function(data) { |  | ||||||
|             data.should.equal('Hello/' + i); |  | ||||||
|           }); |  | ||||||
|           res.on('end', function() { |  | ||||||
|             ++clientConnect; |  | ||||||
|             if (clientConnect === N) { |  | ||||||
|               proxy.close(); |  | ||||||
|               server.close(); |  | ||||||
|             } |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     server.on('close', function() { |  | ||||||
|       serverConnect.should.equal(N); |  | ||||||
|       proxyConnect.should.equal(poolSize); |  | ||||||
|       clientConnect.should.equal(N); |  | ||||||
| 
 |  | ||||||
|       var name = 'localhost:' + serverPort; |  | ||||||
|       agent.sockets.should.be.empty; |  | ||||||
|       agent.requests.should.be.empty; |  | ||||||
| 
 |  | ||||||
|       done(); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
							
								
								
									
										130
									
								
								node_modules/tunnel/test/https-over-http.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										130
									
								
								node_modules/tunnel/test/https-over-http.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,130 +0,0 @@ | |||||||
| var http = require('http'); |  | ||||||
| var https = require('https'); |  | ||||||
| var net = require('net'); |  | ||||||
| var fs = require('fs'); |  | ||||||
| var path = require('path'); |  | ||||||
| var should = require('should'); |  | ||||||
| var tunnel = require('../index'); |  | ||||||
| 
 |  | ||||||
| function readPem(file) { |  | ||||||
|   return fs.readFileSync(path.join('test/keys', file + '.pem')); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var serverKey = readPem('server1-key'); |  | ||||||
| var serverCert = readPem('server1-cert'); |  | ||||||
| var serverCA = readPem('ca1-cert'); |  | ||||||
| var clientKey = readPem('client1-key'); |  | ||||||
| var clientCert = readPem('client1-cert'); |  | ||||||
| var clientCA = readPem('ca3-cert'); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| describe('HTTPS over HTTP', function() { |  | ||||||
|   it('should finish without error', function(done) { |  | ||||||
|     var serverPort = 3002; |  | ||||||
|     var proxyPort = 3003; |  | ||||||
|     var poolSize = 3; |  | ||||||
|     var N = 10; |  | ||||||
|     var serverConnect = 0; |  | ||||||
|     var proxyConnect = 0; |  | ||||||
|     var clientConnect = 0; |  | ||||||
|     var server; |  | ||||||
|     var proxy; |  | ||||||
|     var agent; |  | ||||||
| 
 |  | ||||||
|     server = https.createServer({ |  | ||||||
|       key: serverKey, |  | ||||||
|       cert: serverCert, |  | ||||||
|       ca: [clientCA], |  | ||||||
|       requestCert: true, |  | ||||||
|       rejectUnauthorized: true |  | ||||||
|     }, function(req, res) { |  | ||||||
|       tunnel.debug('SERVER: got request'); |  | ||||||
|       ++serverConnect; |  | ||||||
|       res.writeHead(200); |  | ||||||
|       res.end('Hello' + req.url); |  | ||||||
|       tunnel.debug('SERVER: sending response'); |  | ||||||
|     }); |  | ||||||
|     server.listen(serverPort, setupProxy); |  | ||||||
| 
 |  | ||||||
|     function setupProxy() { |  | ||||||
|       proxy = http.createServer(function(req, res) { |  | ||||||
|         should.fail(); |  | ||||||
|       }); |  | ||||||
|       proxy.on('upgrade', onConnect); // for v0.6
 |  | ||||||
|       proxy.on('connect', onConnect); // for v0.7 or later
 |  | ||||||
| 
 |  | ||||||
|       function onConnect(req, clientSocket, head) { |  | ||||||
|         tunnel.debug('PROXY: got CONNECT request'); |  | ||||||
| 
 |  | ||||||
|         req.method.should.equal('CONNECT'); |  | ||||||
|         req.url.should.equal('localhost:' + serverPort); |  | ||||||
|         req.headers.should.not.have.property('transfer-encoding'); |  | ||||||
|         ++proxyConnect; |  | ||||||
| 
 |  | ||||||
|         var serverSocket = net.connect(serverPort, function() { |  | ||||||
|           tunnel.debug('PROXY: replying to client CONNECT request'); |  | ||||||
|           clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); |  | ||||||
|           clientSocket.pipe(serverSocket); |  | ||||||
|           serverSocket.write(head); |  | ||||||
|           serverSocket.pipe(clientSocket); |  | ||||||
|           // workaround, see joyent/node#2524
 |  | ||||||
|           serverSocket.on('end', function() { |  | ||||||
|             clientSocket.end(); |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|       proxy.listen(proxyPort, setupClient); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function setupClient() { |  | ||||||
|       agent = tunnel.httpsOverHttp({ |  | ||||||
|         maxSockets: poolSize, |  | ||||||
|         key: clientKey, |  | ||||||
|         cert: clientCert, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthorized: true, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
| 
 |  | ||||||
|       for (var i = 0; i < N; ++i) { |  | ||||||
|         doClientRequest(i); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       function doClientRequest(i) { |  | ||||||
|         tunnel.debug('CLIENT: Making HTTPS request (%d)', i); |  | ||||||
|         var req = https.get({ |  | ||||||
|           port: serverPort, |  | ||||||
|           path: '/' + i, |  | ||||||
|           agent: agent |  | ||||||
|         }, function(res) { |  | ||||||
|           tunnel.debug('CLIENT: got HTTPS response (%d)', i); |  | ||||||
|           res.setEncoding('utf8'); |  | ||||||
|           res.on('data', function(data) { |  | ||||||
|             data.should.equal('Hello/' + i); |  | ||||||
|           }); |  | ||||||
|           res.on('end', function() { |  | ||||||
|             ++clientConnect; |  | ||||||
|             if (clientConnect === N) { |  | ||||||
|               proxy.close(); |  | ||||||
|               server.close(); |  | ||||||
|             } |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     server.on('close', function() { |  | ||||||
|       serverConnect.should.equal(N); |  | ||||||
|       proxyConnect.should.equal(poolSize); |  | ||||||
|       clientConnect.should.equal(N); |  | ||||||
| 
 |  | ||||||
|       var name = 'localhost:' + serverPort; |  | ||||||
|       agent.sockets.should.be.empty; |  | ||||||
|       agent.requests.should.be.empty; |  | ||||||
| 
 |  | ||||||
|       done(); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
							
								
								
									
										261
									
								
								node_modules/tunnel/test/https-over-https-error.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										261
									
								
								node_modules/tunnel/test/https-over-https-error.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,261 +0,0 @@ | |||||||
| var http = require('http'); |  | ||||||
| var https = require('https'); |  | ||||||
| var net = require('net'); |  | ||||||
| var fs = require('fs'); |  | ||||||
| var path = require('path'); |  | ||||||
| var should = require('should'); |  | ||||||
| var tunnel = require('../index'); |  | ||||||
| 
 |  | ||||||
| function readPem(file) { |  | ||||||
|   return fs.readFileSync(path.join('test/keys', file + '.pem')); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var serverKey = readPem('server2-key'); |  | ||||||
| var serverCert = readPem('server2-cert'); |  | ||||||
| var serverCA = readPem('ca1-cert'); |  | ||||||
| var proxyKey = readPem('proxy2-key'); |  | ||||||
| var proxyCert = readPem('proxy2-cert'); |  | ||||||
| var proxyCA = readPem('ca2-cert'); |  | ||||||
| var client1Key = readPem('client1-key'); |  | ||||||
| var client1Cert = readPem('client1-cert'); |  | ||||||
| var client1CA = readPem('ca3-cert'); |  | ||||||
| var client2Key = readPem('client2-key'); |  | ||||||
| var client2Cert = readPem('client2-cert'); |  | ||||||
| var client2CA = readPem('ca4-cert'); |  | ||||||
| 
 |  | ||||||
| describe('HTTPS over HTTPS authentication failed', function() { |  | ||||||
|   it('should finish without error', function(done) { |  | ||||||
|     var serverPort = 3008; |  | ||||||
|     var proxyPort = 3009; |  | ||||||
|     var serverConnect = 0; |  | ||||||
|     var proxyConnect = 0; |  | ||||||
|     var clientRequest = 0; |  | ||||||
|     var clientConnect = 0; |  | ||||||
|     var clientError = 0; |  | ||||||
|     var server; |  | ||||||
|     var proxy; |  | ||||||
| 
 |  | ||||||
|     server = https.createServer({ |  | ||||||
|       key: serverKey, |  | ||||||
|       cert: serverCert, |  | ||||||
|       ca: [client1CA], |  | ||||||
|       requestCert: true, |  | ||||||
|       rejectUnauthorized: true |  | ||||||
|     }, function(req, res) { |  | ||||||
|       tunnel.debug('SERVER: got request', req.url); |  | ||||||
|       ++serverConnect; |  | ||||||
|       req.on('data', function(data) { |  | ||||||
|       }); |  | ||||||
|       req.on('end', function() { |  | ||||||
|         res.writeHead(200); |  | ||||||
|         res.end('Hello, ' + serverConnect); |  | ||||||
|         tunnel.debug('SERVER: sending response'); |  | ||||||
|       }); |  | ||||||
|       req.resume(); |  | ||||||
|     }); |  | ||||||
|     //server.addContext('server2', {
 |  | ||||||
|     //  key: serverKey,
 |  | ||||||
|     //  cert: serverCert,
 |  | ||||||
|     //  ca: [client1CA],
 |  | ||||||
|     //});
 |  | ||||||
|     server.listen(serverPort, setupProxy); |  | ||||||
| 
 |  | ||||||
|     function setupProxy() { |  | ||||||
|       proxy = https.createServer({ |  | ||||||
|         key: proxyKey, |  | ||||||
|         cert: proxyCert, |  | ||||||
|         ca: [client2CA], |  | ||||||
|         requestCert: true, |  | ||||||
|         rejectUnauthorized: true |  | ||||||
|       }, function(req, res) { |  | ||||||
|         should.fail(); |  | ||||||
|       }); |  | ||||||
|       //proxy.addContext('proxy2', {
 |  | ||||||
|       //  key: proxyKey,
 |  | ||||||
|       //  cert: proxyCert,
 |  | ||||||
|       //  ca: [client2CA],
 |  | ||||||
|       //});
 |  | ||||||
|       proxy.on('upgrade', onConnect); // for v0.6
 |  | ||||||
|       proxy.on('connect', onConnect); // for v0.7 or later
 |  | ||||||
| 
 |  | ||||||
|       function onConnect(req, clientSocket, head) { |  | ||||||
|         req.method.should.equal('CONNECT'); |  | ||||||
|         req.url.should.equal('localhost:' + serverPort); |  | ||||||
|         req.headers.should.not.have.property('transfer-encoding'); |  | ||||||
|         ++proxyConnect; |  | ||||||
| 
 |  | ||||||
|         var serverSocket = net.connect(serverPort, function() { |  | ||||||
|           tunnel.debug('PROXY: replying to client CONNECT request'); |  | ||||||
|           clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); |  | ||||||
|           clientSocket.pipe(serverSocket); |  | ||||||
|           serverSocket.write(head); |  | ||||||
|           serverSocket.pipe(clientSocket); |  | ||||||
|           // workaround, see #2524
 |  | ||||||
|           serverSocket.on('end', function() { |  | ||||||
|             clientSocket.end(); |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|       proxy.listen(proxyPort, setupClient); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function setupClient() { |  | ||||||
|       function doRequest(name, options, host) { |  | ||||||
|         tunnel.debug('CLIENT: Making HTTPS request (%s)', name); |  | ||||||
|         ++clientRequest; |  | ||||||
|         var agent = tunnel.httpsOverHttps(options); |  | ||||||
|         var req = https.get({ |  | ||||||
|           host: 'localhost', |  | ||||||
|           port: serverPort, |  | ||||||
|           path: '/' + encodeURIComponent(name), |  | ||||||
|           headers: { |  | ||||||
|             host: host ? host : 'localhost', |  | ||||||
|           }, |  | ||||||
|           rejectUnauthorized: true, |  | ||||||
|           agent: agent |  | ||||||
|         }, function(res) { |  | ||||||
|           tunnel.debug('CLIENT: got HTTPS response (%s)', name); |  | ||||||
|           ++clientConnect; |  | ||||||
|           res.on('data', function(data) { |  | ||||||
|           }); |  | ||||||
|           res.on('end', function() { |  | ||||||
|             req.emit('finish'); |  | ||||||
|           }); |  | ||||||
|           res.resume(); |  | ||||||
|         }); |  | ||||||
|         req.on('error', function(err) { |  | ||||||
|           tunnel.debug('CLIENT: failed HTTP response (%s)', name, err); |  | ||||||
|           ++clientError; |  | ||||||
|           req.emit('finish'); |  | ||||||
|         }); |  | ||||||
|         req.on('finish', function() { |  | ||||||
|           if (clientConnect + clientError === clientRequest) { |  | ||||||
|             proxy.close(); |  | ||||||
|             server.close(); |  | ||||||
|           } |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       doRequest('no cert origin nor proxy', { // invalid
 |  | ||||||
|         maxSockets: 1, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthorized: true, |  | ||||||
|         // no certificate for origin server
 |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthorized: true, |  | ||||||
|           headers: { |  | ||||||
|             host: 'proxy2' |  | ||||||
|           } |  | ||||||
|           // no certificate for proxy
 |  | ||||||
|         } |  | ||||||
|       }, 'server2'); |  | ||||||
| 
 |  | ||||||
|       doRequest('no cert proxy', { // invalid
 |  | ||||||
|         maxSockets: 1, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthorized: true, |  | ||||||
|         // client certification for origin server
 |  | ||||||
|         key: client1Key, |  | ||||||
|         cert: client1Cert, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthorized: true, |  | ||||||
|           headers: { |  | ||||||
|             host: 'proxy2' |  | ||||||
|           } |  | ||||||
|           // no certificate for proxy
 |  | ||||||
|         } |  | ||||||
|       }, 'server2'); |  | ||||||
| 
 |  | ||||||
|       doRequest('no cert origin', { // invalid
 |  | ||||||
|         maxSockets: 1, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthorized: true, |  | ||||||
|         // no certificate for origin server
 |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           servername: 'proxy2', |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthorized: true, |  | ||||||
|           headers: { |  | ||||||
|             host: 'proxy2' |  | ||||||
|           }, |  | ||||||
|           // client certification for proxy
 |  | ||||||
|           key: client2Key, |  | ||||||
|           cert: client2Cert |  | ||||||
|         } |  | ||||||
|       }, 'server2'); |  | ||||||
| 
 |  | ||||||
|       doRequest('invalid proxy server name', { // invalid
 |  | ||||||
|         maxSockets: 1, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthorized: true, |  | ||||||
|         // client certification for origin server
 |  | ||||||
|         key: client1Key, |  | ||||||
|         cert: client1Cert, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthorized: true, |  | ||||||
|           // client certification for proxy
 |  | ||||||
|           key: client2Key, |  | ||||||
|           cert: client2Cert, |  | ||||||
|         } |  | ||||||
|       }, 'server2'); |  | ||||||
| 
 |  | ||||||
|       doRequest('invalid origin server name', { // invalid
 |  | ||||||
|         maxSockets: 1, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthorized: true, |  | ||||||
|         // client certification for origin server
 |  | ||||||
|         key: client1Key, |  | ||||||
|         cert: client1Cert, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           servername: 'proxy2', |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthorized: true, |  | ||||||
|           headers: { |  | ||||||
|             host: 'proxy2' |  | ||||||
|           }, |  | ||||||
|           // client certification for proxy
 |  | ||||||
|           key: client2Key, |  | ||||||
|           cert: client2Cert |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
| 
 |  | ||||||
|       doRequest('valid', { // valid
 |  | ||||||
|         maxSockets: 1, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthorized: true, |  | ||||||
|         // client certification for origin server
 |  | ||||||
|         key: client1Key, |  | ||||||
|         cert: client1Cert, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           servername: 'proxy2', |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthorized: true, |  | ||||||
|           headers: { |  | ||||||
|             host: 'proxy2' |  | ||||||
|           }, |  | ||||||
|           // client certification for proxy
 |  | ||||||
|           key: client2Key, |  | ||||||
|           cert: client2Cert |  | ||||||
|         } |  | ||||||
|       }, 'server2'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     server.on('close', function() { |  | ||||||
|       serverConnect.should.equal(1); |  | ||||||
|       proxyConnect.should.equal(3); |  | ||||||
|       clientConnect.should.equal(1); |  | ||||||
|       clientError.should.equal(5); |  | ||||||
| 
 |  | ||||||
|       done(); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
							
								
								
									
										146
									
								
								node_modules/tunnel/test/https-over-https.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										146
									
								
								node_modules/tunnel/test/https-over-https.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,146 +0,0 @@ | |||||||
| var http = require('http'); |  | ||||||
| var https = require('https'); |  | ||||||
| var net = require('net'); |  | ||||||
| var fs = require('fs'); |  | ||||||
| var path = require('path'); |  | ||||||
| var should = require('should'); |  | ||||||
| var tunnel = require('../index.js'); |  | ||||||
| 
 |  | ||||||
| function readPem(file) { |  | ||||||
|   return fs.readFileSync(path.join('test/keys', file + '.pem')); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var serverKey = readPem('server1-key'); |  | ||||||
| var serverCert = readPem('server1-cert'); |  | ||||||
| var serverCA = readPem('ca1-cert'); |  | ||||||
| var proxyKey = readPem('proxy1-key'); |  | ||||||
| var proxyCert = readPem('proxy1-cert'); |  | ||||||
| var proxyCA = readPem('ca2-cert'); |  | ||||||
| var client1Key = readPem('client1-key'); |  | ||||||
| var client1Cert = readPem('client1-cert'); |  | ||||||
| var client1CA = readPem('ca3-cert'); |  | ||||||
| var client2Key = readPem('client2-key'); |  | ||||||
| var client2Cert = readPem('client2-cert'); |  | ||||||
| var client2CA = readPem('ca4-cert'); |  | ||||||
| 
 |  | ||||||
| describe('HTTPS over HTTPS', function() { |  | ||||||
|   it('should finish without error', function(done) { |  | ||||||
|     var serverPort = 3006; |  | ||||||
|     var proxyPort = 3007; |  | ||||||
|     var poolSize = 3; |  | ||||||
|     var N = 5; |  | ||||||
|     var serverConnect = 0; |  | ||||||
|     var proxyConnect = 0; |  | ||||||
|     var clientConnect = 0; |  | ||||||
|     var server; |  | ||||||
|     var proxy; |  | ||||||
|     var agent; |  | ||||||
| 
 |  | ||||||
|     server = https.createServer({ |  | ||||||
|       key: serverKey, |  | ||||||
|       cert: serverCert, |  | ||||||
|       ca: [client1CA], |  | ||||||
|       requestCert: true, |  | ||||||
|       rejectUnauthorized: true |  | ||||||
|     }, function(req, res) { |  | ||||||
|       tunnel.debug('SERVER: got request'); |  | ||||||
|       ++serverConnect; |  | ||||||
|       res.writeHead(200); |  | ||||||
|       res.end('Hello' + req.url); |  | ||||||
|       tunnel.debug('SERVER: sending response'); |  | ||||||
|     }); |  | ||||||
|     server.listen(serverPort, setupProxy); |  | ||||||
| 
 |  | ||||||
|     function setupProxy() { |  | ||||||
|       proxy = https.createServer({ |  | ||||||
|         key: proxyKey, |  | ||||||
|         cert: proxyCert, |  | ||||||
|         ca: [client2CA], |  | ||||||
|         requestCert: true, |  | ||||||
|         rejectUnauthorized: true |  | ||||||
|       }, function(req, res) { |  | ||||||
|         should.fail(); |  | ||||||
|       }); |  | ||||||
|       proxy.on('upgrade', onConnect); // for v0.6
 |  | ||||||
|       proxy.on('connect', onConnect); // for v0.7 or later
 |  | ||||||
| 
 |  | ||||||
|       function onConnect(req, clientSocket, head) { |  | ||||||
|         tunnel.debug('PROXY: got CONNECT request'); |  | ||||||
|         req.method.should.equal('CONNECT'); |  | ||||||
|         req.url.should.equal('localhost:' + serverPort); |  | ||||||
|         req.headers.should.not.have.property('transfer-encoding'); |  | ||||||
|         ++proxyConnect; |  | ||||||
| 
 |  | ||||||
|         var serverSocket = net.connect(serverPort, function() { |  | ||||||
|           tunnel.debug('PROXY: replying to client CONNECT request'); |  | ||||||
|           clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); |  | ||||||
|           clientSocket.pipe(serverSocket); |  | ||||||
|           serverSocket.write(head); |  | ||||||
|           serverSocket.pipe(clientSocket); |  | ||||||
|           // workaround, see joyent/node#2524
 |  | ||||||
|           serverSocket.on('end', function() { |  | ||||||
|             clientSocket.end(); |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|       proxy.listen(proxyPort, setupClient); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function setupClient() { |  | ||||||
|       agent = tunnel.httpsOverHttps({ |  | ||||||
|         maxSockets: poolSize, |  | ||||||
|         // client certification for origin server
 |  | ||||||
|         key: client1Key, |  | ||||||
|         cert: client1Cert, |  | ||||||
|         ca: [serverCA], |  | ||||||
|         rejectUnauthroized: true, |  | ||||||
|         proxy: { |  | ||||||
|           port: proxyPort, |  | ||||||
|           // client certification for proxy
 |  | ||||||
|           key: client2Key, |  | ||||||
|           cert: client2Cert, |  | ||||||
|           ca: [proxyCA], |  | ||||||
|           rejectUnauthroized: true |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
| 
 |  | ||||||
|       for (var i = 0; i < N; ++i) { |  | ||||||
|         doClientRequest(i); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       function doClientRequest(i) { |  | ||||||
|         tunnel.debug('CLIENT: Making HTTPS request (%d)', i); |  | ||||||
|         var req = https.get({ |  | ||||||
|           port: serverPort, |  | ||||||
|           path: '/' + i, |  | ||||||
|           agent: agent |  | ||||||
|         }, function(res) { |  | ||||||
|           tunnel.debug('CLIENT: got HTTPS response (%d)', i); |  | ||||||
|           res.setEncoding('utf8'); |  | ||||||
|           res.on('data', function(data) { |  | ||||||
|             data.should.equal('Hello/' + i); |  | ||||||
|           }); |  | ||||||
|           res.on('end', function() { |  | ||||||
|             ++clientConnect; |  | ||||||
|             if (clientConnect === N) { |  | ||||||
|               proxy.close(); |  | ||||||
|               server.close(); |  | ||||||
|             } |  | ||||||
|           }); |  | ||||||
|         }); |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     server.on('close', function() { |  | ||||||
|       serverConnect.should.equal(N); |  | ||||||
|       proxyConnect.should.equal(poolSize); |  | ||||||
|       clientConnect.should.equal(N); |  | ||||||
| 
 |  | ||||||
|       var name = 'localhost:' + serverPort; |  | ||||||
|       agent.sockets.should.be.empty; |  | ||||||
|       agent.requests.should.be.empty; |  | ||||||
|    |  | ||||||
|       done(); |  | ||||||
|     }); |  | ||||||
|   }); |  | ||||||
| }); |  | ||||||
							
								
								
									
										157
									
								
								node_modules/tunnel/test/keys/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										157
									
								
								node_modules/tunnel/test/keys/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,157 +0,0 @@ | |||||||
| all: server1-cert.pem server2-cert.pem proxy1-cert.pem proxy2-cert.pem client1-cert.pem client2-cert.pem |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # Create Certificate Authority: ca1
 |  | ||||||
| # ('password' is used for the CA password.)
 |  | ||||||
| #
 |  | ||||||
| ca1-cert.pem: ca1.cnf |  | ||||||
| 	openssl req -new -x509 -days 9999 -config ca1.cnf -keyout ca1-key.pem -out ca1-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # Create Certificate Authority: ca2
 |  | ||||||
| # ('password' is used for the CA password.)
 |  | ||||||
| #
 |  | ||||||
| ca2-cert.pem: ca2.cnf |  | ||||||
| 	openssl req -new -x509 -days 9999 -config ca2.cnf -keyout ca2-key.pem -out ca2-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # Create Certificate Authority: ca3
 |  | ||||||
| # ('password' is used for the CA password.)
 |  | ||||||
| #
 |  | ||||||
| ca3-cert.pem: ca3.cnf |  | ||||||
| 	openssl req -new -x509 -days 9999 -config ca3.cnf -keyout ca3-key.pem -out ca3-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # Create Certificate Authority: ca4
 |  | ||||||
| # ('password' is used for the CA password.)
 |  | ||||||
| #
 |  | ||||||
| ca4-cert.pem: ca4.cnf |  | ||||||
| 	openssl req -new -x509 -days 9999 -config ca4.cnf -keyout ca4-key.pem -out ca4-cert.pem |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # server1 is signed by ca1.
 |  | ||||||
| #
 |  | ||||||
| server1-key.pem: |  | ||||||
| 	openssl genrsa -out server1-key.pem 1024 |  | ||||||
| 
 |  | ||||||
| server1-csr.pem: server1.cnf server1-key.pem |  | ||||||
| 	openssl req -new -config server1.cnf -key server1-key.pem -out server1-csr.pem |  | ||||||
| 
 |  | ||||||
| server1-cert.pem: server1-csr.pem ca1-cert.pem ca1-key.pem |  | ||||||
| 	openssl x509 -req \
 |  | ||||||
| 		-days 9999 \
 |  | ||||||
| 		-passin "pass:password" \
 |  | ||||||
| 		-in server1-csr.pem \
 |  | ||||||
| 		-CA ca1-cert.pem \
 |  | ||||||
| 		-CAkey ca1-key.pem \
 |  | ||||||
| 		-CAcreateserial \
 |  | ||||||
| 		-out server1-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # server2 is signed by ca1.
 |  | ||||||
| #
 |  | ||||||
| server2-key.pem: |  | ||||||
| 	openssl genrsa -out server2-key.pem 1024 |  | ||||||
| 
 |  | ||||||
| server2-csr.pem: server2.cnf server2-key.pem |  | ||||||
| 	openssl req -new -config server2.cnf -key server2-key.pem -out server2-csr.pem |  | ||||||
| 
 |  | ||||||
| server2-cert.pem: server2-csr.pem ca1-cert.pem ca1-key.pem |  | ||||||
| 	openssl x509 -req \
 |  | ||||||
| 		-days 9999 \
 |  | ||||||
| 		-passin "pass:password" \
 |  | ||||||
| 		-in server2-csr.pem \
 |  | ||||||
| 		-CA ca1-cert.pem \
 |  | ||||||
| 		-CAkey ca1-key.pem \
 |  | ||||||
| 		-CAcreateserial \
 |  | ||||||
| 		-out server2-cert.pem |  | ||||||
| 
 |  | ||||||
| server2-verify: server2-cert.pem ca1-cert.pem |  | ||||||
| 	openssl verify -CAfile ca1-cert.pem server2-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # proxy1 is signed by ca2.
 |  | ||||||
| #
 |  | ||||||
| proxy1-key.pem: |  | ||||||
| 	openssl genrsa -out proxy1-key.pem 1024 |  | ||||||
| 
 |  | ||||||
| proxy1-csr.pem: proxy1.cnf proxy1-key.pem |  | ||||||
| 	openssl req -new -config proxy1.cnf -key proxy1-key.pem -out proxy1-csr.pem |  | ||||||
| 
 |  | ||||||
| proxy1-cert.pem: proxy1-csr.pem ca2-cert.pem ca2-key.pem |  | ||||||
| 	openssl x509 -req \
 |  | ||||||
| 		-days 9999 \
 |  | ||||||
| 		-passin "pass:password" \
 |  | ||||||
| 		-in proxy1-csr.pem \
 |  | ||||||
| 		-CA ca2-cert.pem \
 |  | ||||||
| 		-CAkey ca2-key.pem \
 |  | ||||||
| 		-CAcreateserial \
 |  | ||||||
| 		-out proxy1-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # proxy2 is signed by ca2.
 |  | ||||||
| #
 |  | ||||||
| proxy2-key.pem: |  | ||||||
| 	openssl genrsa -out proxy2-key.pem 1024 |  | ||||||
| 
 |  | ||||||
| proxy2-csr.pem: proxy2.cnf proxy2-key.pem |  | ||||||
| 	openssl req -new -config proxy2.cnf -key proxy2-key.pem -out proxy2-csr.pem |  | ||||||
| 
 |  | ||||||
| proxy2-cert.pem: proxy2-csr.pem ca2-cert.pem ca2-key.pem |  | ||||||
| 	openssl x509 -req \
 |  | ||||||
| 		-days 9999 \
 |  | ||||||
| 		-passin "pass:password" \
 |  | ||||||
| 		-in proxy2-csr.pem \
 |  | ||||||
| 		-CA ca2-cert.pem \
 |  | ||||||
| 		-CAkey ca2-key.pem \
 |  | ||||||
| 		-CAcreateserial \
 |  | ||||||
| 		-out proxy2-cert.pem |  | ||||||
| 
 |  | ||||||
| proxy2-verify: proxy2-cert.pem ca2-cert.pem |  | ||||||
| 	openssl verify -CAfile ca2-cert.pem proxy2-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # client1 is signed by ca3.
 |  | ||||||
| #
 |  | ||||||
| client1-key.pem: |  | ||||||
| 	openssl genrsa -out client1-key.pem 1024 |  | ||||||
| 
 |  | ||||||
| client1-csr.pem: client1.cnf client1-key.pem |  | ||||||
| 	openssl req -new -config client1.cnf -key client1-key.pem -out client1-csr.pem |  | ||||||
| 
 |  | ||||||
| client1-cert.pem: client1-csr.pem ca3-cert.pem ca3-key.pem |  | ||||||
| 	openssl x509 -req \
 |  | ||||||
| 		-days 9999 \
 |  | ||||||
| 		-passin "pass:password" \
 |  | ||||||
| 		-in client1-csr.pem \
 |  | ||||||
| 		-CA ca3-cert.pem \
 |  | ||||||
| 		-CAkey ca3-key.pem \
 |  | ||||||
| 		-CAcreateserial \
 |  | ||||||
| 		-out client1-cert.pem |  | ||||||
| 
 |  | ||||||
| #
 |  | ||||||
| # client2 is signed by ca4.
 |  | ||||||
| #
 |  | ||||||
| client2-key.pem: |  | ||||||
| 	openssl genrsa -out client2-key.pem 1024 |  | ||||||
| 
 |  | ||||||
| client2-csr.pem: client2.cnf client2-key.pem |  | ||||||
| 	openssl req -new -config client2.cnf -key client2-key.pem -out client2-csr.pem |  | ||||||
| 
 |  | ||||||
| client2-cert.pem: client2-csr.pem ca4-cert.pem ca4-key.pem |  | ||||||
| 	openssl x509 -req \
 |  | ||||||
| 		-days 9999 \
 |  | ||||||
| 		-passin "pass:password" \
 |  | ||||||
| 		-in client2-csr.pem \
 |  | ||||||
| 		-CA ca4-cert.pem \
 |  | ||||||
| 		-CAkey ca4-key.pem \
 |  | ||||||
| 		-CAcreateserial \
 |  | ||||||
| 		-out client2-cert.pem |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| clean: |  | ||||||
| 	rm -f *.pem *.srl |  | ||||||
| 
 |  | ||||||
| test: client-verify server2-verify proxy1-verify proxy2-verify client-verify |  | ||||||
							
								
								
									
										14
									
								
								node_modules/tunnel/test/keys/agent1-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								node_modules/tunnel/test/keys/agent1-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,14 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIICKjCCAZMCCQDQ8o4kHKdCPDANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJV |  | ||||||
| UzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO |  | ||||||
| BgNVBAsTB05vZGUuanMxDDAKBgNVBAMTA2NhMTEgMB4GCSqGSIb3DQEJARYRcnlA |  | ||||||
| dGlueWNsb3Vkcy5vcmcwHhcNMTEwMzE0MTgyOTEyWhcNMzgwNzI5MTgyOTEyWjB9 |  | ||||||
| MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQK |  | ||||||
| EwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MTEgMB4G |  | ||||||
| CSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwXDANBgkqhkiG9w0BAQEFAANL |  | ||||||
| ADBIAkEAnzpAqcoXZxWJz/WFK7BXwD23jlREyG11x7gkydteHvn6PrVBbB5yfu6c |  | ||||||
| bk8w3/Ar608AcyMQ9vHjkLQKH7cjEQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAKha |  | ||||||
| HqjCfTIut+m/idKy3AoFh48tBHo3p9Nl5uBjQJmahKdZAaiksL24Pl+NzPQ8LIU+ |  | ||||||
| FyDHFp6OeJKN6HzZ72Bh9wpBVu6Uj1hwhZhincyTXT80wtSI/BoUAW8Ls2kwPdus |  | ||||||
| 64LsJhhxqj2m4vPKNRbHB2QxnNrGi30CUf3kt3Ia |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										10
									
								
								node_modules/tunnel/test/keys/agent1-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								node_modules/tunnel/test/keys/agent1-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,10 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE REQUEST----- |  | ||||||
| MIIBXTCCAQcCAQAwfTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH |  | ||||||
| EwJTRjEPMA0GA1UEChMGSm95ZW50MRAwDgYDVQQLEwdOb2RlLmpzMQ8wDQYDVQQD |  | ||||||
| EwZhZ2VudDExIDAeBgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMFwwDQYJ |  | ||||||
| KoZIhvcNAQEBBQADSwAwSAJBAJ86QKnKF2cVic/1hSuwV8A9t45URMhtdce4JMnb |  | ||||||
| Xh75+j61QWwecn7unG5PMN/wK+tPAHMjEPbx45C0Ch+3IxECAwEAAaAlMCMGCSqG |  | ||||||
| SIb3DQEJBzEWExRBIGNoYWxsZW5nZSBwYXNzd29yZDANBgkqhkiG9w0BAQUFAANB |  | ||||||
| AF+AfG64hNyYHum46m6i7RgnUBrJSOynGjs23TekV4he3QdMSAAPPqbll8W14+y3 |  | ||||||
| vOo7/yQ2v2uTqxCjakUNPPs= |  | ||||||
| -----END CERTIFICATE REQUEST----- |  | ||||||
							
								
								
									
										9
									
								
								node_modules/tunnel/test/keys/agent1-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								node_modules/tunnel/test/keys/agent1-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,9 +0,0 @@ | |||||||
| -----BEGIN RSA PRIVATE KEY----- |  | ||||||
| MIIBOwIBAAJBAJ86QKnKF2cVic/1hSuwV8A9t45URMhtdce4JMnbXh75+j61QWwe |  | ||||||
| cn7unG5PMN/wK+tPAHMjEPbx45C0Ch+3IxECAwEAAQJBAI2cU1IuR+4IO87WPyAB |  | ||||||
| 76kruoo87AeNQkjjvuQ/00+b/6IS45mcEP5Kw0NukbqBhIw2di9uQ9J51DJ/ZfQr |  | ||||||
| +YECIQDUHaN3ZjIdJ7/w8Yq9Zzz+3kY2F/xEz6e4ftOFW8bY2QIhAMAref+WYckC |  | ||||||
| oECgOLAvAxB1lI4j7oCbAaawfxKdnPj5AiEAi95rXx09aGpAsBGmSdScrPdG1v6j |  | ||||||
| 83/2ebrvoZ1uFqkCIB0AssnrRVjUB6GZTNTyU3ERfdkx/RX1zvr8WkFR/lXpAiB7 |  | ||||||
| cUZ1i8ZkZrPrdVgw2cb28UJM7qZHQnXcMHTXFFvxeQ== |  | ||||||
| -----END RSA PRIVATE KEY----- |  | ||||||
							
								
								
									
										19
									
								
								node_modules/tunnel/test/keys/agent1.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								node_modules/tunnel/test/keys/agent1.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,19 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = US |  | ||||||
| ST                     = CA |  | ||||||
| L                      = SF |  | ||||||
| O                      = Joyent |  | ||||||
| OU                     = Node.js |  | ||||||
| CN                     = agent1 |  | ||||||
| emailAddress           = ry@tinyclouds.org |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
							
								
								
									
										13
									
								
								node_modules/tunnel/test/keys/agent2-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								node_modules/tunnel/test/keys/agent2-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,13 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIIB7DCCAZYCCQC7gs0MDNn6MTANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJV |  | ||||||
| UzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO |  | ||||||
| BgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEgMB4GCSqGSIb3DQEJARYR |  | ||||||
| cnlAdGlueWNsb3Vkcy5vcmcwHhcNMTEwMzE0MTgyOTEyWhcNMzgwNzI5MTgyOTEy |  | ||||||
| WjB9MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYD |  | ||||||
| VQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MjEg |  | ||||||
| MB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwXDANBgkqhkiG9w0BAQEF |  | ||||||
| AANLADBIAkEAyXb8FrRdKbhrKLgLSsn61i1C7w7fVVVd7OQsmV/7p9WB2lWFiDlC |  | ||||||
| WKGU9SiIz/A6wNZDUAuc2E+VwtpCT561AQIDAQABMA0GCSqGSIb3DQEBBQUAA0EA |  | ||||||
| C8HzpuNhFLCI3A5KkBS5zHAQax6TFUOhbpBCR0aTDbJ6F1liDTK1lmU/BjvPoj+9 |  | ||||||
| 1LHwrmh29rK8kBPEjmymCQ== |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										10
									
								
								node_modules/tunnel/test/keys/agent2-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								node_modules/tunnel/test/keys/agent2-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,10 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE REQUEST----- |  | ||||||
| MIIBXTCCAQcCAQAwfTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH |  | ||||||
| EwJTRjEPMA0GA1UEChMGSm95ZW50MRAwDgYDVQQLEwdOb2RlLmpzMQ8wDQYDVQQD |  | ||||||
| EwZhZ2VudDIxIDAeBgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMFwwDQYJ |  | ||||||
| KoZIhvcNAQEBBQADSwAwSAJBAMl2/Ba0XSm4ayi4C0rJ+tYtQu8O31VVXezkLJlf |  | ||||||
| +6fVgdpVhYg5QlihlPUoiM/wOsDWQ1ALnNhPlcLaQk+etQECAwEAAaAlMCMGCSqG |  | ||||||
| SIb3DQEJBzEWExRBIGNoYWxsZW5nZSBwYXNzd29yZDANBgkqhkiG9w0BAQUFAANB |  | ||||||
| AJnll2pt5l0pzskQSpjjLVTlFDFmJr/AZ3UK8v0WxBjYjCe5Jx4YehkChpxIyDUm |  | ||||||
| U3J9q9MDUf0+Y2+EGkssFfk= |  | ||||||
| -----END CERTIFICATE REQUEST----- |  | ||||||
							
								
								
									
										9
									
								
								node_modules/tunnel/test/keys/agent2-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								node_modules/tunnel/test/keys/agent2-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,9 +0,0 @@ | |||||||
| -----BEGIN RSA PRIVATE KEY----- |  | ||||||
| MIIBOgIBAAJBAMl2/Ba0XSm4ayi4C0rJ+tYtQu8O31VVXezkLJlf+6fVgdpVhYg5 |  | ||||||
| QlihlPUoiM/wOsDWQ1ALnNhPlcLaQk+etQECAwEAAQJBAMT6Bf34+UHKY1ObpsbH |  | ||||||
| 9u2jsVblFq1rWvs8GPMY6oertzvwm3DpuSUp7PTgOB1nLTLYtCERbQ4ovtN8tn3p |  | ||||||
| OHUCIQDzIEGsoCr5vlxXvy2zJwu+fxYuhTZWMVuo1397L0VyhwIhANQh+yzqUgaf |  | ||||||
| WRtSB4T2W7ADtJI35ET61jKBty3CqJY3AiAIwju7dVW3A5WeD6Qc1SZGKZvp9yCb |  | ||||||
| AFI2BfVwwaY11wIgXF3PeGcvACMyMWsuSv7aPXHfliswAbkWuzcwA4TW01ECIGWa |  | ||||||
| cgsDvVFxmfM5NPSuT/UDTa6R5BFISB5ea0N0AR3I |  | ||||||
| -----END RSA PRIVATE KEY----- |  | ||||||
							
								
								
									
										19
									
								
								node_modules/tunnel/test/keys/agent2.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								node_modules/tunnel/test/keys/agent2.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,19 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = US |  | ||||||
| ST                     = CA |  | ||||||
| L                      = SF |  | ||||||
| O                      = Joyent |  | ||||||
| OU                     = Node.js |  | ||||||
| CN                     = agent2 |  | ||||||
| emailAddress           = ry@tinyclouds.org |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
							
								
								
									
										14
									
								
								node_modules/tunnel/test/keys/agent3-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								node_modules/tunnel/test/keys/agent3-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,14 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIICKjCCAZMCCQCDBr594bsJmTANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJV |  | ||||||
| UzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAO |  | ||||||
| BgNVBAsTB05vZGUuanMxDDAKBgNVBAMTA2NhMjEgMB4GCSqGSIb3DQEJARYRcnlA |  | ||||||
| dGlueWNsb3Vkcy5vcmcwHhcNMTEwMzE0MTgyOTEyWhcNMzgwNzI5MTgyOTEyWjB9 |  | ||||||
| MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQK |  | ||||||
| EwZKb3llbnQxEDAOBgNVBAsTB05vZGUuanMxDzANBgNVBAMTBmFnZW50MzEgMB4G |  | ||||||
| CSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwXDANBgkqhkiG9w0BAQEFAANL |  | ||||||
| ADBIAkEAtlNDZ+bHeBI0B2gD/IWqA7Aq1hwsnS4+XpnLesjTQcL2JwFFpkR0oWrw |  | ||||||
| yjrYhCogi7c5gjKrLZF1d2JD5JgHgQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAJoK |  | ||||||
| bXwsImk7vJz9649yrmsXwnuGbEKVYMvqcGyjaZNP9lYEG41y5CeRzxhWy2rlYdhE |  | ||||||
| f2nqE2lg75oJP7LQqfQY7aCqwahM3q/GQbsfKVCGjF7TVyq9TQzd8iW+FEJIQzSE |  | ||||||
| 3aN85hR67+3VAXeSzmkGSVBO2m1SJIug4qftIkc2 |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										10
									
								
								node_modules/tunnel/test/keys/agent3-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								node_modules/tunnel/test/keys/agent3-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,10 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE REQUEST----- |  | ||||||
| MIIBXTCCAQcCAQAwfTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH |  | ||||||
| EwJTRjEPMA0GA1UEChMGSm95ZW50MRAwDgYDVQQLEwdOb2RlLmpzMQ8wDQYDVQQD |  | ||||||
| EwZhZ2VudDMxIDAeBgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMFwwDQYJ |  | ||||||
| KoZIhvcNAQEBBQADSwAwSAJBALZTQ2fmx3gSNAdoA/yFqgOwKtYcLJ0uPl6Zy3rI |  | ||||||
| 00HC9icBRaZEdKFq8Mo62IQqIIu3OYIyqy2RdXdiQ+SYB4ECAwEAAaAlMCMGCSqG |  | ||||||
| SIb3DQEJBzEWExRBIGNoYWxsZW5nZSBwYXNzd29yZDANBgkqhkiG9w0BAQUFAANB |  | ||||||
| AEGo76iH+a8pnE+RWQT+wg9/BL+iIuqrcFXLs0rbGonqderrwXAe15ODwql/Bfu3 |  | ||||||
| zgMt8ooTsgMPcMX9EgmubEM= |  | ||||||
| -----END CERTIFICATE REQUEST----- |  | ||||||
							
								
								
									
										9
									
								
								node_modules/tunnel/test/keys/agent3-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								node_modules/tunnel/test/keys/agent3-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,9 +0,0 @@ | |||||||
| -----BEGIN RSA PRIVATE KEY----- |  | ||||||
| MIIBOwIBAAJBALZTQ2fmx3gSNAdoA/yFqgOwKtYcLJ0uPl6Zy3rI00HC9icBRaZE |  | ||||||
| dKFq8Mo62IQqIIu3OYIyqy2RdXdiQ+SYB4ECAwEAAQJAIk+G9s2SKgFa8y3a2jGZ |  | ||||||
| LfqABSzmJGooaIsOpLuYLd6eCC31XUDlT4rPVGRhysKQCQ4+NMjgdnj9ZqNnvXY/ |  | ||||||
| RQIhAOgbdltr3Ey2hy7RuDW5rmOeJTuVqCrZ7QI8ifyCEbYTAiEAyRfvWSvvASeP |  | ||||||
| kZTMUhATRUpuyDQW+058NE0oJSinTpsCIQCR/FPhBGI3TcaQyA9Ym0T4GwvIAkUX |  | ||||||
| TqInefRAAX8qSQIgZVJPAdIWGbHSL9sWW97HpukLCorcbYEtKbkamiZyrjMCIQCX |  | ||||||
| lX76ttkeId5OsJGQcF67eFMMr2UGZ1WMf6M39lCYHQ== |  | ||||||
| -----END RSA PRIVATE KEY----- |  | ||||||
							
								
								
									
										19
									
								
								node_modules/tunnel/test/keys/agent3.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								node_modules/tunnel/test/keys/agent3.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,19 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = US |  | ||||||
| ST                     = CA |  | ||||||
| L                      = SF |  | ||||||
| O                      = Joyent |  | ||||||
| OU                     = Node.js |  | ||||||
| CN                     = agent3 |  | ||||||
| emailAddress           = ry@tinyclouds.org |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
							
								
								
									
										15
									
								
								node_modules/tunnel/test/keys/agent4-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								node_modules/tunnel/test/keys/agent4-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,15 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIICSDCCAbGgAwIBAgIJAIMGvn3huwmaMA0GCSqGSIb3DQEBBQUAMHoxCzAJBgNV |  | ||||||
| BAYTAlVTMQswCQYDVQQIEwJDQTELMAkGA1UEBxMCU0YxDzANBgNVBAoTBkpveWVu |  | ||||||
| dDEQMA4GA1UECxMHTm9kZS5qczEMMAoGA1UEAxMDY2EyMSAwHgYJKoZIhvcNAQkB |  | ||||||
| FhFyeUB0aW55Y2xvdWRzLm9yZzAeFw0xMTAzMTQxODI5MTJaFw0zODA3MjkxODI5 |  | ||||||
| MTJaMH0xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTELMAkGA1UEBxMCU0YxDzAN |  | ||||||
| BgNVBAoTBkpveWVudDEQMA4GA1UECxMHTm9kZS5qczEPMA0GA1UEAxMGYWdlbnQ0 |  | ||||||
| MSAwHgYJKoZIhvcNAQkBFhFyeUB0aW55Y2xvdWRzLm9yZzBcMA0GCSqGSIb3DQEB |  | ||||||
| AQUAA0sAMEgCQQDN/yMfmQ8zdvmjlGk7b3Mn6wY2FjaMb4c5ENJX15vyYhKS1zhx |  | ||||||
| 6n0kQIn2vf6yqG7tO5Okz2IJiD9Sa06mK6GrAgMBAAGjFzAVMBMGA1UdJQQMMAoG |  | ||||||
| CCsGAQUFBwMCMA0GCSqGSIb3DQEBBQUAA4GBAA8FXpRmdrHBdlofNvxa14zLvv0N |  | ||||||
| WnUGUmxVklFLKXvpVWTanOhVgI2TDCMrT5WvCRTD25iT1EUKWxjDhFJrklQJ+IfC |  | ||||||
| KC6fsgO7AynuxWSfSkc8/acGiAH+20vW9QxR53HYiIDMXEV/wnE0KVcr3t/d70lr |  | ||||||
| ImanTrunagV+3O4O |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										10
									
								
								node_modules/tunnel/test/keys/agent4-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								node_modules/tunnel/test/keys/agent4-csr.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,10 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE REQUEST----- |  | ||||||
| MIIBXTCCAQcCAQAwfTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMQswCQYDVQQH |  | ||||||
| EwJTRjEPMA0GA1UEChMGSm95ZW50MRAwDgYDVQQLEwdOb2RlLmpzMQ8wDQYDVQQD |  | ||||||
| EwZhZ2VudDQxIDAeBgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMFwwDQYJ |  | ||||||
| KoZIhvcNAQEBBQADSwAwSAJBAM3/Ix+ZDzN2+aOUaTtvcyfrBjYWNoxvhzkQ0lfX |  | ||||||
| m/JiEpLXOHHqfSRAifa9/rKobu07k6TPYgmIP1JrTqYroasCAwEAAaAlMCMGCSqG |  | ||||||
| SIb3DQEJBzEWExRBIGNoYWxsZW5nZSBwYXNzd29yZDANBgkqhkiG9w0BAQUFAANB |  | ||||||
| AMzo7GUOBtGm5MSck1rrEE2C1bU3qoVvXVuiN3A/57zXeNeq24FZMLnkDeL9U+/b |  | ||||||
| Kj646XFou04gla982Xp74p0= |  | ||||||
| -----END CERTIFICATE REQUEST----- |  | ||||||
							
								
								
									
										9
									
								
								node_modules/tunnel/test/keys/agent4-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								node_modules/tunnel/test/keys/agent4-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,9 +0,0 @@ | |||||||
| -----BEGIN RSA PRIVATE KEY----- |  | ||||||
| MIIBOQIBAAJBAM3/Ix+ZDzN2+aOUaTtvcyfrBjYWNoxvhzkQ0lfXm/JiEpLXOHHq |  | ||||||
| fSRAifa9/rKobu07k6TPYgmIP1JrTqYroasCAwEAAQJAN8RQb+dx1A7rejtdWbfM |  | ||||||
| Rww7PD07Oz2eL/a72wgFsdIabRuVypIoHunqV0sAegYtNJt9yu+VhREw0R5tx/qz |  | ||||||
| EQIhAPY+nmzp0b4iFRk7mtGUmCTr9iwwzoqzITwphE7FpQnFAiEA1ihUHFT9YPHO |  | ||||||
| f85skM6qZv77NEgXHO8NJmQZ5GX1ZK8CICzle+Mluo0tD6W7HV4q9pZ8wzSJbY8S |  | ||||||
| W/PpKetm09F1AiAWTw8sAGKAtc/IGo3Oq+iuYAN1F8lolzJsfGMCGujsOwIgAJKP |  | ||||||
| t3eXilwX3ZlsDWSklWNZ7iYcfYrvAc3JqU6gFCE= |  | ||||||
| -----END RSA PRIVATE KEY----- |  | ||||||
							
								
								
									
										21
									
								
								node_modules/tunnel/test/keys/agent4.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								node_modules/tunnel/test/keys/agent4.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,21 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = US |  | ||||||
| ST                     = CA |  | ||||||
| L                      = SF |  | ||||||
| O                      = Joyent |  | ||||||
| OU                     = Node.js |  | ||||||
| CN                     = agent4 |  | ||||||
| emailAddress           = ry@tinyclouds.org |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
| [ ext_key_usage ] |  | ||||||
| extendedKeyUsage       = clientAuth |  | ||||||
							
								
								
									
										14
									
								
								node_modules/tunnel/test/keys/ca1-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								node_modules/tunnel/test/keys/ca1-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,14 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIICIzCCAYwCCQC4ONZJx5BOwjANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJK |  | ||||||
| UDESMBAGA1UECxQJbm9kZWpzX2pwMQwwCgYDVQQDEwNjYTExJTAjBgkqhkiG9w0B |  | ||||||
| CQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQuanAwHhcNMTMxMjI0MTEyMzIxWhcNNDEw |  | ||||||
| NTEwMTEyMzIxWjBWMQswCQYDVQQGEwJKUDESMBAGA1UECxQJbm9kZWpzX2pwMQww |  | ||||||
| CgYDVQQDEwNjYTExJTAjBgkqhkiG9w0BCQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQu |  | ||||||
| anAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJMS1ug8jUu0wwEfD4h9/Mg |  | ||||||
| w0fvs7JbpMxtwpdcFpg/6ECd8YzGUvljLzeHPe2AhF26MiWIUN3YTxZRiQQ2tv93 |  | ||||||
| afRVWchdPypytmuxv2aYGjhZ66Tv4vNRizM71OE+66+KS30gEQW2k4MTr0ZVlRPR |  | ||||||
| OVey+zRSLdVaKciB/XaBAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEApfbly4b+Ry1q |  | ||||||
| bGIgGrlTvNFvF+j2RuHqSpuTB4nKyw1tbNreKmEEb6SBEfkjcTONx5rKECZ5RRPX |  | ||||||
| z4R/o1G6Dn21ouf1pWQO0BC/HnLN30KvvsoZRoxBn/fqBlJA+j/Kpj3RQgFj6l2I |  | ||||||
| AKI5fD+ucPqRGhjmmTsNyc+Ln4UfAq8= |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										1
									
								
								node_modules/tunnel/test/keys/ca1-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/tunnel/test/keys/ca1-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| B111C9CEF0257692 |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca1-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca1-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| -----BEGIN ENCRYPTED PRIVATE KEY----- |  | ||||||
| MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIbo5wvG42IY0CAggA |  | ||||||
| MBQGCCqGSIb3DQMHBAgf8SPuz4biYASCAoAR4r8MVikusOAEt4Xp6nB7whrMX4iG |  | ||||||
| G792Qpf21nHZPMV73w3cdkfimbAfUn8F50tSJwdrAa8U9BjjpL9Kt0loIyXt/r8c |  | ||||||
| 6PWAQ4WZuLPgTFUTJUNAXrunBHI0iFWYEN4YzJYmT1qN3J4u0diy0MkKz6eJPfZ3 |  | ||||||
| 3v97+nF7dR2H86ZgLKsuE4pO5IRb60XW85d7CYaY6rU6l6mXMF0g9sIccHTlFoet |  | ||||||
| Xm6cA7NAm1XSI1ciYcoc8oaVE9dXoOALaTnBEZ2MJGpsYQ0Hr7kB4VKAO9wsOta5 |  | ||||||
| L9nXPv79Nzo1MZMChkrORFnwOzH4ffsUwVQ70jUzkt5DEyzCM1oSxFNRQESxnFrr |  | ||||||
| 7c1jLg2gxAVwnqYo8njsKJ23BZqZUxHsBgB2Mg1L/iPT6zhclD0u3RZx9MR4ezB2 |  | ||||||
| IqoCF19Z5bblkReAeVRAE9Ol4hKVaCEIIPUspcw7eGVGONalHDCSXpIFnJoZLeXJ |  | ||||||
| OZjLmYlA6KkJw52eNE5IwIb8l/tha2fwNpRvlMoXp65yH9wKyJk8zPSM6WAk4dKD |  | ||||||
| nLrTCK4KtM6aIbG14Mff6WEf3uaLPM0cLwxmuypfieCZfkIzgytNdFZoBgaYUpon |  | ||||||
| zazvUMoy3gqDBorcU08SaosdRoL+s+QVkRhA29shf42lqOM4zbh0dTul4QDlLG0U |  | ||||||
| VBNeMJ3HnrqATfBU28j3bUqtuF2RffgcN/3ivlBjcyzF/iPt0TWmm6Zz5v4K8+b6 |  | ||||||
| lOm6gofIz+ffg2cXfPzrqZ2/xhFkcerRuN0Xp5eAhlI2vGJVGuEc4X+tT7VtQgLV |  | ||||||
| iovqzlLhp+ph/gsfCcsYZ9iso3ozw+Cx1HfJ8XT7yWUgXxblkt4uszEo |  | ||||||
| -----END ENCRYPTED PRIVATE KEY----- |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca1.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca1.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 9999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| output_password        = password |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = JP |  | ||||||
| OU                     = nodejs_jp |  | ||||||
| CN                     = ca1 |  | ||||||
| emailAddress           = koichik@improvement.jp |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
							
								
								
									
										14
									
								
								node_modules/tunnel/test/keys/ca2-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								node_modules/tunnel/test/keys/ca2-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,14 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIICIzCCAYwCCQCxIhZSDET+8DANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJK |  | ||||||
| UDESMBAGA1UECxQJbm9kZWpzX2pwMQwwCgYDVQQDEwNjYTIxJTAjBgkqhkiG9w0B |  | ||||||
| CQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQuanAwHhcNMTMxMjI0MTEyMzIxWhcNNDEw |  | ||||||
| NTEwMTEyMzIxWjBWMQswCQYDVQQGEwJKUDESMBAGA1UECxQJbm9kZWpzX2pwMQww |  | ||||||
| CgYDVQQDEwNjYTIxJTAjBgkqhkiG9w0BCQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQu |  | ||||||
| anAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaaLMMe7K5eYABH3NnJoimG |  | ||||||
| LvY4S5tdGF6YRwfkn1bgGa+kEw1zNqa/Y0jSzs4h7bApt3+bKTalR4+Zk+0UmWgZ |  | ||||||
| Gvlq8+mdqDXtBKoWE3vYDPBmeNyKsgxf9UIhFOpsxVUeYP8t66qJyUk/FlFJcDqc |  | ||||||
| WPawikl1bUFSZXBKu4PxAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAwh3sXPIkA5kn |  | ||||||
| fpg7fV5haS4EpFr9ia61dzWbhXDZtasAx+nWdWqgG4T+HIYSLlMNZbGJ998uhFZf |  | ||||||
| DEHlbY/WuSBukZ0w+xqKBtPyjLIQKVvNiaTx5YMzQes62R1iklOXzBzyHbYIxFOG |  | ||||||
| dqLfIjEe/mVVoR23LN2tr8Wa6+rmd+w= |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										1
									
								
								node_modules/tunnel/test/keys/ca2-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/tunnel/test/keys/ca2-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| 9BF2D4B2E00EDF16 |  | ||||||
							
								
								
									
										10
									
								
								node_modules/tunnel/test/keys/ca2-crl.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								node_modules/tunnel/test/keys/ca2-crl.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,10 +0,0 @@ | |||||||
| -----BEGIN X509 CRL----- |  | ||||||
| MIIBXTCBxzANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJVUzELMAkGA1UECBMC |  | ||||||
| Q0ExCzAJBgNVBAcTAlNGMQ8wDQYDVQQKEwZKb3llbnQxEDAOBgNVBAsTB05vZGUu |  | ||||||
| anMxDDAKBgNVBAMTA2NhMjEgMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5v |  | ||||||
| cmcXDTExMDMxNDE4MjkxNloXDTEzMTIwNzE4MjkxNlowHDAaAgkAgwa+feG7CZoX |  | ||||||
| DTExMDMxNDE4MjkxNFowDQYJKoZIhvcNAQEEBQADgYEArRKuEkOla61fm4zlZtHe |  | ||||||
| LTXFV0Hgo21PScHAp6JqPol4rN5R9+EmUkv7gPCVVBJ9VjIgxSosHiLsDiz3zR+u |  | ||||||
| txHemhzbdIVANAIiChnFct8sEqH2eL4N6XNUIlMIR06NjNl7NbN8w8haqiearnuT |  | ||||||
| wmnaL4TThPmpbpKAF7N7JqQ= |  | ||||||
| -----END X509 CRL----- |  | ||||||
							
								
								
									
										1
									
								
								node_modules/tunnel/test/keys/ca2-database.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/tunnel/test/keys/ca2-database.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| R	380729182912Z	110314182914Z	8306BE7DE1BB099A	unknown	/C=US/ST=CA/L=SF/O=Joyent/OU=Node.js/CN=agent4/emailAddress=ry@tinyclouds.org |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca2-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca2-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| -----BEGIN ENCRYPTED PRIVATE KEY----- |  | ||||||
| MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI3aq9fKZIOF0CAggA |  | ||||||
| MBQGCCqGSIb3DQMHBAjyunMfVve0OwSCAoAdMsrRFlQUSILw+bq3cSVIIbFjwcs0 |  | ||||||
| B1Uz2rc9SB+1qjsazjv4zvPQSXTrsx2EOSJf9PSPz7r+c0NzO9vfWLorpXof/lwL |  | ||||||
| C1tRN7/1OqEW/mTK+1wlv0M5C4cmf44BBXmI+y+RWrQ/qc+CWEMvfHwv9zWr2K+i |  | ||||||
| cLlZv55727GvZYCMMVLiqYd/Ejj98loBsE5dhN4JJ5MPaN3UHhFTCpD453GIIzCi |  | ||||||
| FRuYhOOtX4qYoEuP2db4S2qu26723ZJnYBEHkK2YZiRrgvoZHugyGIr4f/RRoSUI |  | ||||||
| fPgycgQfL3Ow+Y1G533PiZ+CYgh9cViUzhZImEPiZpSuUntAD1loOYkJuV9Ai9XZ |  | ||||||
| +t6+7tfkM3aAo1bkaU8KcfINxxNWfAhCbUQw+tGJl2A+73OM5AGjGSfzjQQL/FOa |  | ||||||
| 5omfEvdfEX2XyRRlqnQ2VucvSTL9ZdzbIJGg/euJTpM44Fwc7yAZv2aprbPoPixu |  | ||||||
| yyf0LoTjlGGSBZvHkunpWx82lYEXvHhcnCxV5MDFw8wehvDrvcSuzb8//HzLOiOB |  | ||||||
| gzUr3DOQk4U1UD6xixZjAKC+NUwTVZoHg68KtmQfkq+eGUWf5oJP4xUigi3ui/Wy |  | ||||||
| OCBDdlRBkFtgLGL51KJqtq1ixx3Q9HMl0y6edr5Ls0unDIo0LtUWUUcAtr6wl+kK |  | ||||||
| zSztxFMi2zTtbhbkwoVpucNstFQNfV1k22vtnlcux2FV2DdZiJQwYpIbr8Gj6gpK |  | ||||||
| gtV5l9RFe21oZBcKPt/chrF8ayiClfGMpF3D2p2GqGCe0HuH5uM/JAFf60rbnriA |  | ||||||
| Nu1bWiXsXLRUXcLIQ/uEPR3Mvvo9k1h4Q6it1Rp67eQiXCX6h2uFq+sB |  | ||||||
| -----END ENCRYPTED PRIVATE KEY----- |  | ||||||
							
								
								
									
										1
									
								
								node_modules/tunnel/test/keys/ca2-serial
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/tunnel/test/keys/ca2-serial
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| 01 |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca2.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca2.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 9999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| output_password        = password |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = JP |  | ||||||
| OU                     = nodejs_jp |  | ||||||
| CN                     = ca2 |  | ||||||
| emailAddress           = koichik@improvement.jp |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
							
								
								
									
										14
									
								
								node_modules/tunnel/test/keys/ca3-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								node_modules/tunnel/test/keys/ca3-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,14 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIICIzCCAYwCCQCudHFhEWiUHDANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJK |  | ||||||
| UDESMBAGA1UECxQJbm9kZWpzX2pwMQwwCgYDVQQDEwNjYTMxJTAjBgkqhkiG9w0B |  | ||||||
| CQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQuanAwHhcNMTMxMjI0MTEyMzIxWhcNNDEw |  | ||||||
| NTEwMTEyMzIxWjBWMQswCQYDVQQGEwJKUDESMBAGA1UECxQJbm9kZWpzX2pwMQww |  | ||||||
| CgYDVQQDEwNjYTMxJTAjBgkqhkiG9w0BCQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQu |  | ||||||
| anAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJPRJMhCNtxX6dQ3rLdrzVCl |  | ||||||
| XJMSRIICpbsc7arOzSJcrsIYeYC4d29dGwxYNLnAkKSmHujFT9SmFgh88CoYETLp |  | ||||||
| gE9zCk9hVCwUlWelM/UaIrzeLT4SC3VBptnLmMtk2mqFniLcaFdMycAcX8OIhAgG |  | ||||||
| fbqyT5Wxwz7UMegip2ZjAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEADpu8a/W+NPnS |  | ||||||
| mhyIOxXn8O//2oH9ELlBYFLIgTid0xmS05x/MgkXtWqiBEEZFoOfoJBJxM3vTFs0 |  | ||||||
| PiZvcVjv0IIjDF4s54yRVH+4WI2p7cil1fgzAVRTuOIuR+VyN7ct8s26a/7GFDq6 |  | ||||||
| NJMByyjsJHyxwwri5hVv+jbLCxmnDjI= |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										1
									
								
								node_modules/tunnel/test/keys/ca3-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/tunnel/test/keys/ca3-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| EF7B2CF0FA61DF41 |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca3-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca3-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| -----BEGIN ENCRYPTED PRIVATE KEY----- |  | ||||||
| MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIwAta+L4c9soCAggA |  | ||||||
| MBQGCCqGSIb3DQMHBAgqRud2p3SvogSCAoDXoDJOJDkvgFpQ6rxeV5r0fLX4SrGJ |  | ||||||
| quv4yt02QxSDUPN2ZLtBt6bLzg4Zv2pIggufYJcZ2IOUnX82T7FlvBP8hbW1q3Bs |  | ||||||
| jAso7z8kJlFrZjNudjuP2l/X8tjrVyr3I0PoRoomtcHnCcSDdyne8Dqqj1enuikF |  | ||||||
| 8b7FZUqocNLfu8LmNGxMmMwjw3UqhtpP5DjqV60B8ytQFPoz/gFh6aNGvsrD/avU |  | ||||||
| Dj8EJkQZP6Q32vmCzAvSiLjk7FA7RFmBtaurE9hJYNlc5v1eo69EUwPkeVlTpglJ |  | ||||||
| 5sZAHxlhQCgc72ST6uFQKiMO3ng/JJA5N9EvacYSHQvI1TQIo43V2A//zUh/5hGL |  | ||||||
| sDv4pRuFq9miX8iiQpwo1LDfRzdwg7+tiLm8/mDyeLUSzDNc6GIX/tC9R4Ukq4ge |  | ||||||
| 1Cfq0gtKSRxZhM8HqpGBC9rDs5mpdUqTRsoHLFn5T6/gMiAtrLCJxgD8JsZBa8rM |  | ||||||
| KZ09QEdZXTvpyvZ8bSakP5PF6Yz3QYO32CakL7LDPpCng0QDNHG10YaZbTOgJIzQ |  | ||||||
| NJ5o87DkgDx0Bb3L8FoREIBkjpYFbQi2fvPthoepZ3D5VamVsOwOiZ2sR1WF2J8l |  | ||||||
| X9c8GdG38byO+SQIPNZ8eT5JvUcNeSlIZiVSwvaEk496d2KzhmMMfoBLFVeHXG90 |  | ||||||
| CIZPleVfkTmgNQgXPWcFngqTZdDEGsHjEDDhbEAijB3EeOxyiiEDJPMy5zqkdy5D |  | ||||||
| cZ/Y77EDbln7omcyL+cGvCgBhhYpTbtbuBtzW4CiCvcfEB5N4EtJKOTRJXIpL/d3 |  | ||||||
| oVnZruqRRKidKwFMEZU2NZJX5FneAWFSeCv0IrY2vAUIc3El+n84CFFK |  | ||||||
| -----END ENCRYPTED PRIVATE KEY----- |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca3.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca3.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 9999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| output_password        = password |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = JP |  | ||||||
| OU                     = nodejs_jp |  | ||||||
| CN                     = ca3 |  | ||||||
| emailAddress           = koichik@improvement.jp |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
							
								
								
									
										14
									
								
								node_modules/tunnel/test/keys/ca4-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								node_modules/tunnel/test/keys/ca4-cert.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,14 +0,0 @@ | |||||||
| -----BEGIN CERTIFICATE----- |  | ||||||
| MIICIzCCAYwCCQDUGh2r7lOpITANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJK |  | ||||||
| UDESMBAGA1UECxQJbm9kZWpzX2pwMQwwCgYDVQQDEwNjYTQxJTAjBgkqhkiG9w0B |  | ||||||
| CQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQuanAwHhcNMTMxMjI0MTEyMzIxWhcNNDEw |  | ||||||
| NTEwMTEyMzIxWjBWMQswCQYDVQQGEwJKUDESMBAGA1UECxQJbm9kZWpzX2pwMQww |  | ||||||
| CgYDVQQDEwNjYTQxJTAjBgkqhkiG9w0BCQEWFmtvaWNoaWtAaW1wcm92ZW1lbnQu |  | ||||||
| anAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOOC+SPC8XzkjIHfKPMzzNV6 |  | ||||||
| O/LpqQWdzJtEvFNW0oQ9g8gSV4iKqwUFrLNnSlwSGigvqKqGmYtG8S17ANWInoxI |  | ||||||
| c3sQlrS2cGbgLUBNKu4hZ7s+11EPOjbnn0QUE5w9GN8fy8CDx7ID/8URYKoxcoRv |  | ||||||
| 0w7EJ2agfd68KS1ayxUXAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAumPFeR63Dyki |  | ||||||
| SWQtRAe2QWkIFlSRAR2PvSDdsDMLwMeXF5wD3Hv51yfTu9Gkg0QJB86deYfQ5vfV |  | ||||||
| 4QsOQ35icesa12boyYpTE0/OoEX1f/s1sLlszpRvtAki3J4bkcGWAzM5yO1fKqpQ |  | ||||||
| MbtPzLn+DA7ymxuJa6EQAEb+kaJEBuU= |  | ||||||
| -----END CERTIFICATE----- |  | ||||||
							
								
								
									
										1
									
								
								node_modules/tunnel/test/keys/ca4-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								node_modules/tunnel/test/keys/ca4-cert.srl
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | |||||||
| B01FE0416A2EDCF5 |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca4-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca4-key.pem
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| -----BEGIN ENCRYPTED PRIVATE KEY----- |  | ||||||
| MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIWE/ri/feeikCAggA |  | ||||||
| MBQGCCqGSIb3DQMHBAiu6hUzoFnsVASCAoC53ZQ4gxLcFnb5yAcdCl4DdKOJ5m4G |  | ||||||
| CHosR87pJpZlO68DsCKwORUp9tTmb1/Q4Wm9n2kRf6VQNyVVm6REwzEPAgIJEgy2 |  | ||||||
| FqLmfqpTElbRsQako8UDXjDjaMO30e+Qhy8HOTrHMJZ6LgrU90xnOCPPeN9fYmIu |  | ||||||
| YBkX4qewUfu+wFzk/unUbFLChvJsEN4fdrlDwTJMHRzKwbdvg3mHlCnspWwjA2Mc |  | ||||||
| q27QPeb3mwRUajmqL0dT9y7wVYeAN2zV59VoWm6zV+dWFgyMlVrVCRYkqQC3xOsy |  | ||||||
| ZlKrGldrY8nNdv5s6+Sc7YavTJiJxHgIB7sm6QFIsdqjxTBEGD4/YhEI52SUw/xO |  | ||||||
| VJmOTWdWUz4FdWNi7286nfhZ0+mdv6fUoG54Qv6ahnUMJvEsp60LkR1gHXLzQu/m |  | ||||||
| +yDZFqY/IIg2QA7M3gL0Md5GrWydDlD2uBPoXcC4A5gfOHswzHWDKurDCpoMqdpn |  | ||||||
| CUQ/ZVl2rwF8Pnty61MjY1xCN1r8xQjFBCgcfBWw5v6sNRbr/vef3TfQIBzVm+hx |  | ||||||
| akDb1nckBsIjMT9EfeT6hXub2n0oehEHewF1COifbcOjnxToLSswPLrtb0behB+o |  | ||||||
| zTgftn+4XrkY0sFY69TzYtQVMLAsiWTpZFvAi+D++2pXlQ/bnxKJiBBc6kZuAGpN |  | ||||||
| z+cJ4kUuFE4S9v5C5vK89nIgcuJT06u8wYTy0N0j/DnIjSaVgGr0Y0841mXtU1VV |  | ||||||
| wUZjuyYrVwVT/g5r6uzEFldTcjmYkbMaxo+MYnEZZgqYJvu2QlK87YxJOwo+D1NX |  | ||||||
| 4gl1s/bmlPlGw/t9TxutI3S9PEr3JM3013e9UPE+evlTG9IIrZaUPzyj |  | ||||||
| -----END ENCRYPTED PRIVATE KEY----- |  | ||||||
							
								
								
									
										17
									
								
								node_modules/tunnel/test/keys/ca4.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								node_modules/tunnel/test/keys/ca4.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,17 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 9999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| output_password        = password |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = JP |  | ||||||
| OU                     = nodejs_jp |  | ||||||
| CN                     = ca4 |  | ||||||
| emailAddress           = koichik@improvement.jp |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
							
								
								
									
										16
									
								
								node_modules/tunnel/test/keys/client.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								node_modules/tunnel/test/keys/client.cnf
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,16 +0,0 @@ | |||||||
| [ req ] |  | ||||||
| default_bits           = 1024 |  | ||||||
| days                   = 9999 |  | ||||||
| distinguished_name     = req_distinguished_name |  | ||||||
| attributes             = req_attributes |  | ||||||
| prompt                 = no |  | ||||||
| 
 |  | ||||||
| [ req_distinguished_name ] |  | ||||||
| C                      = JP |  | ||||||
| OU                     = nodejs_jp |  | ||||||
| CN                     = localhost |  | ||||||
| emailAddress           = koichik@improvement.jp |  | ||||||
| 
 |  | ||||||
| [ req_attributes ] |  | ||||||
| challengePassword              = A challenge password |  | ||||||
| 
 |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user