webdriver-manager
Advanced tools
Comparing version 10.2.7 to 10.2.8
@@ -7,6 +7,6 @@ "use strict"; | ||
}; | ||
var child_process = require('child_process'); | ||
var path = require('path'); | ||
var rimraf = require('rimraf'); | ||
var config_1 = require('../config'); | ||
var utils_1 = require('../utils'); | ||
var binary_1 = require('./binary'); | ||
@@ -64,3 +64,3 @@ /** | ||
avds.forEach(function (avd) { | ||
child_process.spawnSync(path.join(sdkPath, 'tools', 'android'), ['delete', 'avd', '-n', avd + '-v' + version_1 + '-wd-manager']); | ||
utils_1.spawnSync(path.join(sdkPath, 'tools', 'android'), ['delete', 'avd', '-n', avd + '-v' + version_1 + '-wd-manager']); | ||
}); | ||
@@ -67,0 +67,0 @@ } |
@@ -22,1 +22,2 @@ export interface MinimistArgs { | ||
} | ||
export declare function unparseOptions(options: Options): string[]; |
@@ -7,3 +7,3 @@ "use strict"; | ||
this.type = type; | ||
if (defaultValue) { | ||
if (defaultValue != null) { | ||
this.defaultValue = defaultValue; | ||
@@ -22,17 +22,32 @@ } | ||
var value = this.getValue_(); | ||
if (value && typeof value === 'number') { | ||
if (value != null && (typeof value === 'number' || typeof value === 'string')) { | ||
return +value; | ||
} | ||
return null; | ||
else { | ||
return null; | ||
} | ||
}; | ||
Option.prototype.getString = function () { | ||
var value = this.getValue_(); | ||
if (value && typeof value === 'string') { | ||
return '' + value; | ||
if (value != null) { | ||
return '' + this.getValue_(); | ||
} | ||
return ''; | ||
else { | ||
return ''; | ||
} | ||
}; | ||
Option.prototype.getBoolean = function () { | ||
var value = this.getValue_(); | ||
return Boolean(value); | ||
if (value != null) { | ||
if (typeof value === 'string') { | ||
return !(value === '0' || value === 'false'); | ||
} | ||
else if (typeof value === 'number') { | ||
return value !== 0; | ||
} | ||
else { | ||
return value; | ||
} | ||
} | ||
return false; | ||
}; | ||
@@ -42,2 +57,14 @@ return Option; | ||
exports.Option = Option; | ||
function unparseOptions(options) { | ||
var args = []; | ||
for (var name_1 in options) { | ||
var value = options[name_1].getValue_(); | ||
if (value !== options[name_1].defaultValue) { | ||
args.push('--' + name_1, '' + value); | ||
} | ||
} | ||
return args; | ||
} | ||
exports.unparseOptions = unparseOptions; | ||
; | ||
//# sourceMappingURL=options.js.map |
@@ -67,3 +67,3 @@ "use strict"; | ||
var keyItem = keyList[0]; | ||
if (tempJson[keyItem]) { | ||
if (tempJson[keyItem] != null) { | ||
tempJson = tempJson[keyItem]; | ||
@@ -76,3 +76,3 @@ keyList = keyList.slice(1); | ||
} | ||
return tempJson.toString(); | ||
return tempJson; | ||
}; | ||
@@ -79,0 +79,0 @@ /** |
"use strict"; | ||
var child_process = require('child_process'); | ||
var child_process_1 = require('child_process'); | ||
var fs = require('fs'); | ||
@@ -9,2 +9,3 @@ var glob = require('glob'); | ||
var q = require('q'); | ||
var utils_1 = require('../utils'); | ||
var noop = function () { }; | ||
@@ -26,4 +27,4 @@ // Make a function which configures a child process to automatically respond | ||
// Run a command on the android SDK | ||
function runAndroidSDKCommand(sdkPath, cmd, args, spawnOptions, config_fun) { | ||
var child = child_process.spawn(path.join(sdkPath, 'tools', 'android'), [cmd].concat(args), spawnOptions); | ||
function runAndroidSDKCommand(sdkPath, cmd, args, stdio, config_fun) { | ||
var child = utils_1.spawn(path.join(sdkPath, 'tools', 'android'), [cmd].concat(args), stdio); | ||
if (config_fun) { | ||
@@ -55,3 +56,3 @@ config_fun(child); | ||
function downloadAndroidUpdates(sdkPath, targets, search_all, auto_accept) { | ||
return runAndroidSDKCommand(sdkPath, 'update', ['sdk', '-u'].concat(search_all ? ['-a'] : []).concat(['-t', targets.join(',')]), { stdio: auto_accept ? 'pipe' : 'inherit' }, auto_accept ? respondFactory('Do you accept the license', 'y') : noop); | ||
return runAndroidSDKCommand(sdkPath, 'update', ['sdk', '-u'].concat(search_all ? ['-a'] : []).concat(['-t', targets.join(',')]), auto_accept ? 'pipe' : 'inherit', auto_accept ? respondFactory('Do you accept the license', 'y') : noop); | ||
} | ||
@@ -63,8 +64,10 @@ // Setup hardware acceleration for x86-64 emulation | ||
console.log('Enabling hardware acceleration (requires root access)'); | ||
child_process.spawnSync('sudo', [path.join(sdkPath, 'extras', 'intel', 'Hardware_Accelerated_Execution_Manager', 'silent_install.sh')], { stdio: 'inherit' }); | ||
// We don't need the wrapped spawnSync because we know we're on OSX | ||
child_process_1.spawnSync('sudo', [path.join(sdkPath, 'extras', 'intel', 'Hardware_Accelerated_Execution_Manager', 'silent_install.sh')], { stdio: 'inherit' }); | ||
} | ||
else if (os.type() == 'Windows_NT') { | ||
console.log('Enabling hardware acceleration (requires admin access)'); | ||
child_process.spawnSync('runas', [ | ||
'/noprofile', '/user:Administrator', | ||
// We don't need the wrapped spawnSync because we know we're on Windows | ||
child_process_1.spawnSync('cmd', [ | ||
'/c', 'runas', '/noprofile', '/user:Administrator', | ||
path.join(sdkPath, 'extras', 'intel', 'Hardware_Accelerated_Execution_Manager', 'silent_install.bat') | ||
@@ -179,6 +182,6 @@ ], { stdio: 'inherit' }); | ||
function makeAVD(sdkPath, desc, version) { | ||
return runAndroidSDKCommand(sdkPath, 'delete', ['avd', '--name', desc.avdName(version)], {}) | ||
return runAndroidSDKCommand(sdkPath, 'delete', ['avd', '--name', desc.avdName(version)]) | ||
.then(noop, noop) | ||
.then(function () { | ||
return runAndroidSDKCommand(sdkPath, 'create', ['avd', '--name', desc.avdName(version), '--target', desc.api, '--abi', desc.abi], { stdio: 'pipe' }, respondFactory('Do you wish to create a custom hardware profile', 'no')); | ||
return runAndroidSDKCommand(sdkPath, 'create', ['avd', '--name', desc.avdName(version), '--target', desc.api, '--abi', desc.abi], 'pipe', respondFactory('Do you wish to create a custom hardware profile', 'no')); | ||
}); | ||
@@ -185,0 +188,0 @@ } |
@@ -32,2 +32,4 @@ import { Options } from '../cli'; | ||
export declare const STARTED_SIGNIFIER: string; | ||
export declare const SIGNAL_VIA_IPC: string; | ||
export declare const DETACH: string; | ||
export declare var Opts: Options; |
@@ -35,2 +35,4 @@ "use strict"; | ||
exports.STARTED_SIGNIFIER = 'started-signifier'; | ||
exports.SIGNAL_VIA_IPC = 'signal-via-ipc'; | ||
exports.DETACH = 'detach'; | ||
/** | ||
@@ -74,3 +76,6 @@ * The options used by the commands. | ||
opts[exports.STARTED_SIGNIFIER] = new cli_1.Option(exports.STARTED_SIGNIFIER, 'A string to be outputted once the selenium server is up and running. Useful if you are writing a script which uses webdriver-manager.', 'string'); | ||
opts[exports.SIGNAL_VIA_IPC] = new cli_1.Option(exports.SIGNAL_VIA_IPC, 'If you are using --' + exports.STARTED_SIGNIFIER + | ||
', this flag will emit the signal string using process.send(), rather than writing it to stdout', 'boolean', false); | ||
opts[exports.DETACH] = new cli_1.Option(exports.DETACH, 'Once the selenium server is up and running, return control to the parent process and continue running the server in the background.', 'boolean', false); | ||
exports.Opts = opts; | ||
//# sourceMappingURL=opts.js.map |
"use strict"; | ||
var childProcess = require('child_process'); | ||
var fs = require('fs'); | ||
@@ -13,7 +12,9 @@ var http = require('http'); | ||
var files_1 = require('../files'); | ||
var utils_1 = require('../utils'); | ||
var Opt = require('./'); | ||
var opts_1 = require('./opts'); | ||
var commandName = 'start'; | ||
var logger = new cli_1.Logger('start'); | ||
var prog = new cli_1.Program() | ||
.command('start', 'start up the selenium server') | ||
.command(commandName, 'start up the selenium server') | ||
.action(start) | ||
@@ -33,3 +34,5 @@ .addOption(opts_1.Opts[Opt.OUT_DIR]) | ||
.addOption(opts_1.Opts[Opt.AVD_USE_SNAPSHOTS]) | ||
.addOption(opts_1.Opts[Opt.STARTED_SIGNIFIER]); | ||
.addOption(opts_1.Opts[Opt.STARTED_SIGNIFIER]) | ||
.addOption(opts_1.Opts[Opt.SIGNAL_VIA_IPC]) | ||
.addOption(opts_1.Opts[Opt.DETACH]); | ||
if (os.type() === 'Darwin') { | ||
@@ -58,2 +61,5 @@ prog.addOption(opts_1.Opts[Opt.IOS]); | ||
function start(options) { | ||
if (options[Opt.DETACH].getBoolean()) { | ||
return detachedRun(options); | ||
} | ||
var osType = os.type(); | ||
@@ -174,6 +180,6 @@ var binaries = files_1.FileManager.setupBinaries(); | ||
logger.info('java' + argsToString); | ||
var seleniumProcess = spawnCommand('java', args); | ||
var seleniumProcess = utils_1.spawn('java', args, 'inherit'); | ||
if (options[Opt.STARTED_SIGNIFIER].getString()) { | ||
// TODO(sjelin): check android too once it's working | ||
signalWhenReady(options[Opt.STARTED_SIGNIFIER].getString(), seleniumPort); | ||
// TODO(sjelin): check android too once it's working signalWhenReady( | ||
signalWhenReady(options[Opt.STARTED_SIGNIFIER].getString(), options[Opt.SIGNAL_VIA_IPC].getBoolean(), seleniumPort); | ||
} | ||
@@ -183,4 +189,3 @@ logger.info('seleniumProcess.pid: ' + seleniumProcess.pid); | ||
logger.info('Selenium Standalone has exited with code ' + code); | ||
killAndroid(); | ||
killAppium(); | ||
shutdownEverything(); | ||
process.exit(code); | ||
@@ -191,17 +196,9 @@ }); | ||
logger.info('Attempting to shut down selenium nicely'); | ||
http.get('http://localhost:' + seleniumPort + '/selenium-server/driver/?cmd=shutDownSeleniumServer'); | ||
killAndroid(); | ||
killAppium(); | ||
shutdownEverything(seleniumPort); | ||
}); | ||
process.on('SIGINT', function () { | ||
logger.info('Staying alive until the Selenium Standalone process exits'); | ||
shutdownEverything(seleniumPort); | ||
}); | ||
} | ||
function spawnCommand(command, args) { | ||
var osType = os.type(); | ||
var windows = osType === 'Windows_NT'; | ||
var winCommand = windows ? 'cmd' : command; | ||
var finalArgs = windows ? ['/c'].concat([command], args) : args; | ||
return childProcess.spawn(winCommand, finalArgs, { stdio: 'inherit' }); | ||
} | ||
// Manage processes used in android emulation | ||
@@ -235,3 +232,3 @@ var androidProcesses = []; | ||
} | ||
androidProcesses.push(childProcess.spawn(path.join(sdkPath, 'tools', emuBin), emuArgs, { stdio: 'inherit' })); | ||
androidProcesses.push(utils_1.spawn(path.join(sdkPath, 'tools', emuBin), emuArgs, 'inherit')); | ||
}); | ||
@@ -252,3 +249,3 @@ } | ||
} | ||
appiumProcess = childProcess.spawn(path.join(outputDir, binary.filename(), 'node_modules', '.bin', 'appium'), port ? ['--port', port] : []); | ||
appiumProcess = utils_1.spawn(path.join(outputDir, binary.filename(), 'node_modules', '.bin', 'appium'), port ? ['--port', port] : []); | ||
} | ||
@@ -261,3 +258,3 @@ function killAppium() { | ||
} | ||
function signalWhenReady(signal, seleniumPort) { | ||
function signalWhenReady(signal, viaIPC, seleniumPort) { | ||
function check(callback) { | ||
@@ -284,3 +281,3 @@ http.get('http://localhost:' + seleniumPort + '/selenium-server/driver/?cmd=getLogMessages', function (res) { | ||
if (ready) { | ||
console.log(signal); | ||
sendStartedSignal(signal, viaIPC); | ||
} | ||
@@ -294,2 +291,52 @@ else if (triesRemaining) { | ||
} | ||
function sendStartedSignal(signal, viaIPC) { | ||
if (viaIPC) { | ||
if (process.send) { | ||
return process.send(signal); | ||
} | ||
else { | ||
logger.warn('No IPC channel, sending signal via stdout'); | ||
} | ||
} | ||
} | ||
function shutdownEverything(seleniumPort) { | ||
if (seleniumPort) { | ||
http.get('http://localhost:' + seleniumPort + '/selenium-server/driver/?cmd=shutDownSeleniumServer'); | ||
} | ||
killAndroid(); | ||
killAppium(); | ||
} | ||
function detachedRun(options) { | ||
var file = path.resolve(__dirname, '..', 'webdriver.js'); | ||
var oldSignal = options[Opt.STARTED_SIGNIFIER].getString(); | ||
var oldViaIPC = options[Opt.SIGNAL_VIA_IPC].getBoolean(); | ||
options[Opt.DETACH].value = false; | ||
options[Opt.STARTED_SIGNIFIER].value = 'server started'; | ||
options[Opt.SIGNAL_VIA_IPC].value = true; | ||
var args = [file, commandName].concat(cli_1.unparseOptions(options)); | ||
var unreffed = false; | ||
var child = utils_1.spawn(process.execPath, args, ['ignore', 1, 2, 'ipc']); | ||
child.on('message', function (message) { | ||
if (message == options[Opt.STARTED_SIGNIFIER].getString()) { | ||
if (oldSignal) { | ||
sendStartedSignal(oldSignal, oldViaIPC); | ||
} | ||
logger.info('Detached pid: ' + child.pid); | ||
child.disconnect(); | ||
child.unref(); | ||
unreffed = true; | ||
} | ||
}); | ||
child.on('exit', function (code) { | ||
if (!unreffed) { | ||
if (code == 0) { | ||
logger.warn('Server never seemed to start, and has now exited'); | ||
} | ||
else { | ||
logger.error('Server never seemed to start, and has probably crashed'); | ||
} | ||
process.exit(code); | ||
} | ||
}); | ||
} | ||
//# sourceMappingURL=start.js.map |
@@ -14,2 +14,3 @@ "use strict"; | ||
var files_1 = require('../files'); | ||
var utils_1 = require('../utils'); | ||
var Opt = require('./'); | ||
@@ -231,4 +232,4 @@ var initialize_1 = require('./initialize'); | ||
fs.writeFileSync(path.join(folder, 'package.json'), '{}'); | ||
child_process.spawn('npm', ['install', 'appium@' + binary.version()], { cwd: folder }); | ||
utils_1.spawn('npm', ['install', 'appium@' + binary.version()], null, { cwd: folder }); | ||
} | ||
//# sourceMappingURL=update.js.map |
@@ -83,3 +83,3 @@ "use strict"; | ||
var options = { | ||
method: 'HEAD', | ||
method: 'GET', | ||
url: fileUrl, | ||
@@ -90,6 +90,11 @@ strictSSL: !opt_ignoreSSL, | ||
}; | ||
var contentLength = 0; | ||
request(options).on('response', function (response) { | ||
contentLength = response.headers['content-length']; | ||
deferred.resolve(contentLength); | ||
if (response.headers['Location']) { | ||
var urlLocation = response.headers['Location']; | ||
deferred.resolve(Downloader.httpHeadContentLength(urlLocation, opt_proxy, opt_ignoreSSL)); | ||
} | ||
else if (response.headers['content-length']) { | ||
var contentLength = response.headers['content-length']; | ||
deferred.resolve(contentLength); | ||
} | ||
}); | ||
@@ -96,0 +101,0 @@ return deferred.promise; |
"use strict"; | ||
var minimist = require('minimist'); | ||
var cli_1 = require('./cli'); | ||
var clean = require('./cmds/clean'); | ||
var start = require('./cmds/start'); | ||
var status = require('./cmds/status'); | ||
var update = require('./cmds/update'); | ||
var commandline = new cli_1.Cli() | ||
.usage('webdriver-manager <command> [options]') | ||
.program(clean.program) | ||
.program(start.program) | ||
.program(status.program) | ||
.program(update.program); | ||
var minimistOptions = commandline.getMinimistOptions(); | ||
var cli_instance_1 = require('./cli_instance'); | ||
var minimistOptions = cli_instance_1.cli.getMinimistOptions(); | ||
var argv = minimist(process.argv.slice(2), minimistOptions); | ||
var cmd = argv._; | ||
if (commandline.programs[cmd[0]]) { | ||
if (cli_instance_1.cli.programs[cmd[0]]) { | ||
if (cmd[0] === 'help') { | ||
commandline.printHelp(); | ||
cli_instance_1.cli.printHelp(); | ||
} | ||
else if (cmd[1] === 'help' || argv['help'] || argv['h']) { | ||
commandline.programs[cmd[0]].printHelp(); | ||
cli_instance_1.cli.programs[cmd[0]].printHelp(); | ||
} | ||
else { | ||
commandline.programs[cmd[0]].run(JSON.parse(JSON.stringify(argv))); | ||
cli_instance_1.cli.programs[cmd[0]].run(JSON.parse(JSON.stringify(argv))); | ||
} | ||
} | ||
else { | ||
commandline.printHelp(); | ||
cli_instance_1.cli.printHelp(); | ||
} | ||
exports.cli = commandline; | ||
//# sourceMappingURL=webdriver.js.map |
{ | ||
"name": "webdriver-manager", | ||
"version": "10.2.7", | ||
"version": "10.2.8", | ||
"description": "A selenium server and browser driver manager for your end to end tests.", | ||
"scripts": { | ||
"check_format": "gulp format:enforce", | ||
"format": "gulp format", | ||
"prepublish": "gulp prepublish", | ||
@@ -37,3 +39,3 @@ "test": "gulp test" | ||
"q": "^1.4.1", | ||
"request": "^2.69.0", | ||
"request": "^2.78.0", | ||
"rimraf": "^2.5.2", | ||
@@ -48,8 +50,8 @@ "semver": "^5.3.0" | ||
"@types/ini": "^1.3.28", | ||
"@types/jasmine": "^2.2.32", | ||
"@types/jasmine": "^2.5.37", | ||
"@types/minimatch": "^2.0.28", | ||
"@types/minimist": "^1.1.28", | ||
"@types/node": "^6.0.37", | ||
"@types/node": "^6.0.46", | ||
"@types/q": "^0.0.32", | ||
"@types/request": "^0.0.32", | ||
"@types/request": "^0.0.33", | ||
"@types/rimraf": "^0.0.28", | ||
@@ -62,4 +64,4 @@ "@types/semver": "^5.3.30", | ||
"run-sequence": "^1.1.5", | ||
"typescript": "^2.0.0" | ||
"typescript": "^2.1.1" | ||
} | ||
} |
@@ -0,1 +1,26 @@ | ||
# 10.2.8 | ||
## Features | ||
- ([1f9713a](https://github.com/angular/webdriver-manager/commit/1f9713aff1e7d44de900ed3c74abac532d3e25ff)) | ||
feat(start and shutdown): Added `--detach` option for `start` command and new `shutdown` command | ||
(#130) | ||
- ([88cf46b](https://github.com/angular/webdriver-manager/commit/88cf46b715250559ba8a726370a83c5c2f4daed1)) | ||
feat(version): have a way to get the package version (#136) | ||
closes #119 | ||
## Bug fixes | ||
- ([5966b6a](https://github.com/angular/webdriver-manager/commit/5966b6ac7329878e9e16f5b1b88261c5b7f7e438)) | ||
fix(cli): fix setting flag to false (#135) | ||
- This fixes `webdriver-manager update --gecko=false` | ||
- This does not fix `webdriver-manager update --gecko=0`. Minimist interprets 0 as true. | ||
- Add options and programs unit tests | ||
closes #110 | ||
- ([35676ee](https://github.com/angular/webdriver-manager/commit/35676ee70c816d43f045fa33d02e41bf502a3a14)) | ||
fix(gecko): follow redirects for content-length (#133) | ||
# 10.2.7 | ||
@@ -2,0 +27,0 @@ |
@@ -31,6 +31,8 @@ 'use strict'; | ||
var tsGlobs = ['lib/**/*.ts', 'spec/**/*.ts']; | ||
gulp.task('format:enforce', () => { | ||
const format = require('gulp-clang-format'); | ||
const clangFormat = require('clang-format'); | ||
return gulp.src(['lib/**/*.ts']).pipe( | ||
return gulp.src(tsGlobs).pipe( | ||
format.checkFormat('file', clangFormat, {verbose: true, fail: true})); | ||
@@ -42,3 +44,3 @@ }); | ||
const clangFormat = require('clang-format'); | ||
return gulp.src(['lib/**/*.ts'], { base: '.' }).pipe( | ||
return gulp.src(tsGlobs, { base: '.' }).pipe( | ||
format.format('file', clangFormat)).pipe(gulp.dest('.')); | ||
@@ -48,7 +50,7 @@ }); | ||
gulp.task('tsc', function(done) { | ||
runSpawn(done, 'node', ['node_modules/typescript/bin/tsc']); | ||
runSpawn(done, process.execPath, ['node_modules/typescript/bin/tsc']); | ||
}); | ||
gulp.task('prepublish', function(done) { | ||
runSequence('format', 'tsc', 'copy', done); | ||
runSequence('tsc', 'copy', done); | ||
}); | ||
@@ -59,6 +61,6 @@ | ||
gulp.task('test', ['build'], function(done) { | ||
gulp.task('test', ['format', 'build'], function(done) { | ||
var opt_arg = []; | ||
opt_arg.push('node_modules/jasmine/bin/jasmine.js'); | ||
runSpawn(done, 'node', opt_arg); | ||
runSpawn(done, process.execPath, opt_arg); | ||
}); |
{ | ||
"name": "webdriver-manager", | ||
"version": "10.2.7", | ||
"version": "10.2.8", | ||
"description": "A selenium server and browser driver manager for your end to end tests.", | ||
"scripts": { | ||
"check_format": "gulp format:enforce", | ||
"format": "gulp format", | ||
"prepublish": "gulp prepublish", | ||
@@ -37,3 +39,3 @@ "test": "gulp test" | ||
"q": "^1.4.1", | ||
"request": "^2.69.0", | ||
"request": "^2.78.0", | ||
"rimraf": "^2.5.2", | ||
@@ -48,8 +50,8 @@ "semver": "^5.3.0" | ||
"@types/ini": "^1.3.28", | ||
"@types/jasmine": "^2.2.32", | ||
"@types/jasmine": "^2.5.37", | ||
"@types/minimatch": "^2.0.28", | ||
"@types/minimist": "^1.1.28", | ||
"@types/node": "^6.0.37", | ||
"@types/node": "^6.0.46", | ||
"@types/q": "^0.0.32", | ||
"@types/request": "^0.0.32", | ||
"@types/request": "^0.0.33", | ||
"@types/rimraf": "^0.0.28", | ||
@@ -62,4 +64,4 @@ "@types/semver": "^5.3.30", | ||
"run-sequence": "^1.1.5", | ||
"typescript": "^2.0.0" | ||
"typescript": "^2.1.1" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
107
23
6
289951
3522
Updatedrequest@^2.78.0