Socket
Socket
Sign inDemoInstall

protractor

Package Overview
Dependencies
Maintainers
2
Versions
103
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

protractor - npm Package Compare versions

Comparing version 4.0.9 to 4.0.10

built/debugger.d.ts

56

built/browser.d.ts
/// <reference types="selenium-webdriver" />
import { ActionSequence, Capabilities, Command as WdCommand, FileDetector, Options, promise as wdpromise, Session, TargetLocator, TouchSequence, until, WebDriver, WebElement } from 'selenium-webdriver';
import { DebugHelper } from './debugger';
import { ElementArrayFinder, ElementFinder } from './element';

@@ -33,3 +34,3 @@ import { ProtractorExpectedConditions } from './expectedConditions';

(locator: Locator): ElementFinder;
all?: (locator: Locator) => ElementArrayFinder;
all: (locator: Locator) => ElementArrayFinder;
}

@@ -153,12 +154,6 @@ /**

* when running element explorer.
* @private {number}
* @public {number}
*/
debuggerServerPort_: number;
debuggerServerPort: number;
/**
* Set to true when we validate that the debug port is open. Since the debug
* port is held open forever once the debugger is attached, it's important
* we only do validation once.
*/
debuggerValidated_: boolean;
/**
* If true, Protractor will interpret any angular apps it comes across as

@@ -170,2 +165,6 @@ * hybrid angular1/angular2 apps.

ng12Hybrid: boolean;
/**
* A helper that manages debugging tests.
*/
debugHelper: DebugHelper;
[key: string]: any;

@@ -217,7 +216,6 @@ constructor(webdriverInstance: WebDriver, opt_baseUrl?: string, opt_rootElement?: string, opt_untrackOutstandingTimeouts?: boolean);

* @returns {!webdriver.promise.Promise.<T>} A promise that will resolve to
* the
* scripts return value.
* the scripts return value.
* @template T
*/
private executeScript_(script, description, ...scriptArgs);
executeScriptWithDescription(script: string | Function, description: string, ...scriptArgs: any[]): wdpromise.Promise<any>;
/**

@@ -395,30 +393,2 @@ * The same as {@code webdriver.WebDriver.prototype.executeAsyncScript},

/**
* Validates that the port is free to use. This will only validate the first
* time it is called. The reason is that on subsequent calls, the port will
* already be bound to the debugger, so it will not be available, but that is
* okay.
*
* @returns {Promise<boolean>} A promise that becomes ready when the
* validation
* is done. The promise will resolve to a boolean which represents whether
* this is the first time that the debugger is called.
*/
private validatePortAvailability_(port);
private dbgCodeExecutor_;
/**
* Helper function to:
* 1) Set up helper functions for debugger clients to call on (e.g.
* getControlFlowText, execute code, get autocompletion).
* 2) Enter process into debugger mode. (i.e. process._debugProcess).
* 3) Invoke the debugger client specified by debuggerClientPath.
*
* @param {string} debuggerClientPath Absolute path of debugger client to use
* @param {Function} onStartFn Function to call when the debugger starts. The
* function takes a single parameter, which represents whether this is the
* first time that the debugger is called.
* @param {number=} opt_debugPort Optional port to use for the debugging
* process
*/
private initDebugger_(debuggerClientPath, onStartFn, opt_debugPort?);
/**
* Beta (unstable) enterRepl function for entering the repl loop from

@@ -462,4 +432,6 @@ * any point in the control flow. Use browser.enterRepl() in your test.

* @param {webdriver.WebDriver} webdriver The configured webdriver instance.
* @param {string=} opt_baseUrl A URL to prepend to relative gets.
* @param {boolean=} opt_untrackOutstandingTimeouts Whether Browser should
* @param {string=} baseUrl A URL to prepend to relative gets.
* @param {string=} rootElement The css selector for the element which is the
* root of the Angular app.
* @param {boolean=} untrackOutstandingTimeouts Whether Browser should
* stop tracking outstanding $timeouts.

@@ -466,0 +438,0 @@ * @returns {Browser} a new Browser instance

@@ -7,7 +7,5 @@ "use strict";

};
// Util from NodeJs
var net = require('net');
var selenium_webdriver_1 = require('selenium-webdriver');
var url = require('url');
var util = require('util');
var debugger_1 = require('./debugger');
var element_1 = require('./element');

@@ -18,3 +16,2 @@ var expectedConditions_1 = require('./expectedConditions');

var plugins_1 = require('./plugins');
var helper = require('./util');
var clientSideScripts = require('./clientsidescripts');

@@ -76,5 +73,5 @@ var webdriver = require('selenium-webdriver');

function buildElementHelper(browser) {
var element = function (locator) {
var element = (function (locator) {
return new element_1.ElementArrayFinder(browser).all(locator).toElementFinder_();
};
});
element.all =

@@ -133,2 +130,3 @@ function (locator) {

this.ng12Hybrid = false;
this.debugHelper = new debugger_1.DebugHelper(this);
this.driver.getCapabilities().then(function (caps) {

@@ -203,7 +201,6 @@ // Internet Explorer does not accept data URLs, which are the default

* @returns {!webdriver.promise.Promise.<T>} A promise that will resolve to
* the
* scripts return value.
* the scripts return value.
* @template T
*/
ProtractorBrowser.prototype.executeScript_ = function (script, description) {
ProtractorBrowser.prototype.executeScriptWithDescription = function (script, description) {
var scriptArgs = [];

@@ -320,3 +317,3 @@ for (var _i = 2; _i < arguments.length; _i++) {

if (_this.trackOutstandingTimeouts_) {
pendingTimeoutsPromise = _this.executeScript_('return window.NG_PENDING_TIMEOUTS', 'Protractor.waitForAngular() - getting pending timeouts' +
pendingTimeoutsPromise = _this.executeScriptWithDescription('return window.NG_PENDING_TIMEOUTS', 'Protractor.waitForAngular() - getting pending timeouts' +
description);

@@ -327,3 +324,3 @@ }

}
var pendingHttpsPromise = _this.executeScript_(clientSideScripts.getPendingHttpRequests, 'Protractor.waitForAngular() - getting pending https' +
var pendingHttpsPromise = _this.executeScriptWithDescription(clientSideScripts.getPendingHttpRequests, 'Protractor.waitForAngular() - getting pending https' +
description, _this.rootEl);

@@ -490,3 +487,3 @@ return selenium_webdriver_1.promise

this.driver.get(this.resetUrl).then(null, deferred.reject);
this.executeScript_('window.name = "' + DEFER_LABEL + '" + window.name;' +
this.executeScriptWithDescription('window.name = "' + DEFER_LABEL + '" + window.name;' +
'window.location.replace("' + destination + '");', msg('reset url'))

@@ -499,3 +496,3 @@ .then(null, deferred.reject);

return _this
.executeScript_('return window.location.href;', msg('get url'))
.executeScriptWithDescription('return window.location.href;', msg('get url'))
.then(function (url) {

@@ -550,3 +547,3 @@ return url !== _this.resetUrl;

].concat(mockModule.args);
self.executeScript_.apply(self, executeScriptArgs)
self.executeScriptWithDescription.apply(self, executeScriptArgs)
.then(null, function (err) {

@@ -561,3 +558,3 @@ throw new Error('Error while running module script ' + name_1 + ': ' +

}
self.executeScript_('angular.resumeBootstrap(arguments[0]);', msg('resume bootstrap'), moduleNames)
self.executeScriptWithDescription('angular.resumeBootstrap(arguments[0]);', msg('resume bootstrap'), moduleNames)
.then(null, deferred.reject);

@@ -599,3 +596,3 @@ }

return this
.executeScript_('return window.location.href', 'Protractor.refresh() - getUrl')
.executeScriptWithDescription('return window.location.href', 'Protractor.refresh() - getUrl')
.then(function (href) {

@@ -630,3 +627,3 @@ return _this.get(href, opt_timeout);

return this
.executeScript_(clientSideScripts.setLocation, 'Protractor.setLocation()', this.rootEl, url)
.executeScriptWithDescription(clientSideScripts.setLocation, 'Protractor.setLocation()', this.rootEl, url)
.then(function (browserErr) {

@@ -651,3 +648,3 @@ if (browserErr) {

this.waitForAngular();
return this.executeScript_(clientSideScripts.getLocationAbsUrl, 'Protractor.getLocationAbsUrl()', this.rootEl);
return this.executeScriptWithDescription(clientSideScripts.getLocationAbsUrl, 'Protractor.getLocationAbsUrl()', this.rootEl);
};

@@ -682,227 +679,2 @@ /**

/**
* Validates that the port is free to use. This will only validate the first
* time it is called. The reason is that on subsequent calls, the port will
* already be bound to the debugger, so it will not be available, but that is
* okay.
*
* @returns {Promise<boolean>} A promise that becomes ready when the
* validation
* is done. The promise will resolve to a boolean which represents whether
* this is the first time that the debugger is called.
*/
ProtractorBrowser.prototype.validatePortAvailability_ = function (port) {
var _this = this;
if (this.debuggerValidated_) {
return webdriver.promise.fulfilled(false);
}
var doneDeferred = webdriver.promise.defer();
// Resolve doneDeferred if port is available.
var tester = net.connect({ port: port }, function () {
doneDeferred.reject('Port ' + port + ' is already in use. Please specify ' +
'another port to debug.');
});
tester.once('error', function (err) {
if (err.code === 'ECONNREFUSED') {
tester
.once('close', function () {
doneDeferred.fulfill(true);
})
.end();
}
else {
doneDeferred.reject('Unexpected failure testing for port ' + port + ': ' +
JSON.stringify(err));
}
});
return doneDeferred.then(function () {
_this.debuggerValidated_ = true;
}, function (err) {
console.error(err);
process.exit(1);
});
};
/**
* Helper function to:
* 1) Set up helper functions for debugger clients to call on (e.g.
* getControlFlowText, execute code, get autocompletion).
* 2) Enter process into debugger mode. (i.e. process._debugProcess).
* 3) Invoke the debugger client specified by debuggerClientPath.
*
* @param {string} debuggerClientPath Absolute path of debugger client to use
* @param {Function} onStartFn Function to call when the debugger starts. The
* function takes a single parameter, which represents whether this is the
* first time that the debugger is called.
* @param {number=} opt_debugPort Optional port to use for the debugging
* process
*/
ProtractorBrowser.prototype.initDebugger_ = function (debuggerClientPath, onStartFn, opt_debugPort) {
var _this = this;
// Patch in a function to help us visualize what's going on in the control
// flow.
webdriver.promise.ControlFlow.prototype.getControlFlowText = function () {
var controlFlowText = this.getSchedule(/* opt_includeStackTraces */ true);
// This filters the entire control flow text, not just the stack trace, so
// unless we maintain a good (i.e. non-generic) set of keywords in
// STACK_SUBSTRINGS_TO_FILTER, we run the risk of filtering out non stack
// trace. The alternative though, which is to reimplement
// webdriver.promise.ControlFlow.prototype.getSchedule() here is much
// hackier, and involves messing with the control flow's internals /
// private
// variables.
return helper.filterStackTrace(controlFlowText);
};
var vm_ = require('vm');
var flow = webdriver.promise.controlFlow();
var context = { require: require };
global.list = function (locator) {
return global.protractor
.browser.findElements(locator)
.then(function (arr) {
var found = [];
for (var i = 0; i < arr.length; ++i) {
arr[i].getText().then(function (text) {
found.push(text);
});
}
return found;
});
};
for (var key in global) {
context[key] = global[key];
}
var sandbox = vm_.createContext(context);
var browserUnderDebug = this;
var debuggerReadyPromise = webdriver.promise.defer();
flow.execute(function () {
process['debugPort'] = opt_debugPort || process['debugPort'];
browserUnderDebug.validatePortAvailability_(process['debugPort'])
.then(function (firstTime) {
onStartFn(firstTime);
var args = [process.pid, process['debugPort']];
if (browserUnderDebug.debuggerServerPort_) {
args.push(browserUnderDebug.debuggerServerPort_);
}
var nodedebug = require('child_process').fork(debuggerClientPath, args);
process.on('exit', function () {
nodedebug.kill('SIGTERM');
});
nodedebug
.on('message', function (m) {
if (m === 'ready') {
debuggerReadyPromise.fulfill();
}
})
.on('exit', function () {
logger.info('Debugger exiting');
// Clear this so that we know it's ok to attach a debugger
// again.
_this.dbgCodeExecutor_ = null;
});
});
});
var pausePromise = flow.execute(function () {
return debuggerReadyPromise.then(function () {
// Necessary for backward compatibility with node < 0.12.0
return browserUnderDebug.executeScript_('', 'empty debugger hook');
});
});
// Helper used only by debuggers at './debugger/modes/*.js' to insert code
// into the control flow.
// In order to achieve this, we maintain a promise at the top of the control
// flow, so that we can insert frames into it.
// To be able to simulate callback/asynchronous code, we poll this object
// for an result at every run of DeferredExecutor.execute.
this.dbgCodeExecutor_ = {
execPromise_: pausePromise,
execPromiseResult_: undefined,
execPromiseError_: undefined,
// A dummy repl server to make use of its completion function.
replServer_: require('repl').start({
input: {
on: function () { },
resume: function () { }
},
output: { write: function () { } },
useGlobal: true
}),
// Execute a function, which could yield a value or a promise,
// and allow its result to be accessed synchronously
execute_: function (execFn_) {
var _this = this;
this.execPromiseResult_ = this.execPromiseError_ = undefined;
this.execPromise_ = this.execPromise_.then(execFn_).then(function (result) {
_this.execPromiseResult_ = result;
}, function (err) {
_this.execPromiseError_ = err;
});
// This dummy command is necessary so that the DeferredExecutor.execute
// break point can find something to stop at instead of moving on to the
// next real command.
this.execPromise_.then(function () {
return browserUnderDebug.executeScript_('', 'empty debugger hook');
});
},
// Execute a piece of code.
// Result is a string representation of the evaluation.
execute: function (code) {
var _this = this;
var execFn_ = function () {
// Run code through vm so that we can maintain a local scope which is
// isolated from the rest of the execution.
var res = vm_.runInContext(code, sandbox);
if (!webdriver.promise.isPromise(res)) {
res = webdriver.promise.fulfilled(res);
}
return res.then(function (res) {
if (res === undefined) {
return undefined;
}
else {
// The '' forces res to be expanded into a string instead of just
// '[Object]'. Then we remove the extra space caused by the ''
// using
// substring.
return util.format.apply(_this, ['', res]).substring(1);
}
});
};
this.execute_(execFn_);
},
// Autocomplete for a line.
// Result is a JSON representation of the autocomplete response.
complete: function (line) {
var _this = this;
var execFn_ = function () {
var deferred = webdriver.promise.defer();
_this.replServer_.complete(line, function (err, res) {
if (err) {
deferred.reject(err);
}
else {
deferred.fulfill(JSON.stringify(res));
}
});
return deferred;
};
this.execute_(execFn_);
},
// Code finished executing.
resultReady: function () {
return !this.execPromise_.isPending();
},
// Get asynchronous results synchronously.
// This will throw if result is not ready.
getResult: function () {
if (!this.resultReady()) {
throw new Error('Result not ready');
}
if (this.execPromiseError_) {
throw this.execPromiseError_;
}
return this.execPromiseResult_;
}
};
return pausePromise;
};
/**
* Beta (unstable) enterRepl function for entering the repl loop from

@@ -937,3 +709,3 @@ * any point in the control flow. Use browser.enterRepl() in your test.

};
this.initDebugger_(debuggerClientPath, onStartFn, opt_debugPort);
this.debugHelper.init(debuggerClientPath, onStartFn, opt_debugPort);
};

@@ -958,3 +730,3 @@ /**

ProtractorBrowser.prototype.pause = function (opt_debugPort) {
if (this.dbgCodeExecutor_) {
if (this.debugHelper.isAttached()) {
logger.info('Encountered browser.pause(), but debugger already attached.');

@@ -980,3 +752,3 @@ return webdriver.promise.fulfilled(true);

};
return this.initDebugger_(debuggerClientPath, onStartFn, opt_debugPort);
this.debugHelper.init(debuggerClientPath, onStartFn, opt_debugPort);
};

@@ -987,4 +759,6 @@ /**

* @param {webdriver.WebDriver} webdriver The configured webdriver instance.
* @param {string=} opt_baseUrl A URL to prepend to relative gets.
* @param {boolean=} opt_untrackOutstandingTimeouts Whether Browser should
* @param {string=} baseUrl A URL to prepend to relative gets.
* @param {string=} rootElement The css selector for the element which is the
* root of the Angular app.
* @param {boolean=} untrackOutstandingTimeouts Whether Browser should
* stop tracking outstanding $timeouts.

@@ -991,0 +765,0 @@ * @returns {Browser} a new Browser instance

@@ -381,2 +381,7 @@ export interface Config {

/**
* If set, Protractor will ignore uncaught exceptions instead of exiting
* without an error code. The exceptions will still be logged as warnings.
*/
ignoreUncaughtExceptions?: boolean;
/**
* Test framework to use. This may be one of: jasmine, mocha or custom.

@@ -476,2 +481,10 @@ * Default value is 'jasmine'

disableEnvironmentOverrides?: boolean;
/**
* Tells Protractor to interpret any angular apps it comes across as hybrid
* angular1/angular2 apps (i.e. apps using ngUpgrade)
* Defaults to `false`
*
* @type {boolean}
*/
ng12Hybrid?: boolean;
seleniumArgs?: Array<any>;

@@ -478,0 +491,0 @@ configDir?: string;

@@ -38,2 +38,3 @@ "use strict";

skipSourceMapSupport: false,
ng12Hybrid: false
};

@@ -40,0 +41,0 @@ }

@@ -33,3 +33,3 @@ var REPL_INITIAL_SUGGESTIONS = [

var expr = 'browser.dbgCodeExecutor_.execute("' + expression + '")';
var expr = 'browser.debugHelper.dbgCodeExecutor.execute("' + expression + '")';
this.evaluate_(expr, callback);

@@ -51,3 +51,3 @@ };

line = line.replace(/"/g, '\\\"');
var expr = 'browser.dbgCodeExecutor_.complete("' + line + '")';
var expr = 'browser.debugHelper.dbgCodeExecutor.complete("' + line + '")';
this.evaluate_(expr, function(err, res) {

@@ -78,3 +78,3 @@ // Result is a JSON representation of the autocomplete response.

maxStringLength: 1000,
expression: 'browser.dbgCodeExecutor_.resultReady()'
expression: 'browser.debugHelper.dbgCodeExecutor.resultReady()'
}

@@ -89,3 +89,3 @@ }, function(err, res) {

maxStringLength: -1,
expression: 'browser.dbgCodeExecutor_.getResult()'
expression: 'browser.debugHelper.dbgCodeExecutor.getResult()'
}

@@ -92,0 +92,0 @@ }, function(err, res) {

@@ -311,3 +311,3 @@ /// <reference types="selenium-webdriver" />

*/
then(fn?: Function, errorFn?: Function): wdpromise.Promise<any[]>;
then(fn?: (value: any) => {} | wdpromise.IThenable<{}>, errorFn?: (error: any) => any): wdpromise.Promise<any[]>;
/**

@@ -488,3 +488,3 @@ * Calls the input function on each ElementFinder represented by the

elementArrayFinder_: ElementArrayFinder;
then: (fn: Function, errorFn: Function) => wdpromise.Promise<any>;
then: (fn: Function, errorFn?: Function) => wdpromise.Promise<any>;
constructor(browser_: ProtractorBrowser, elementArrayFinder: ElementArrayFinder);

@@ -491,0 +491,0 @@ [key: string]: any;

@@ -168,4 +168,3 @@ "use strict";

// For each parent web element, find their children and construct
// a
// list of Promise<List<child_web_element>>
// a list of Promise<List<child_web_element>>
var childrenPromiseList = parentWebElements.map(function (parentWebElement) {

@@ -177,6 +176,4 @@ return locator.findElementsOverride ?

// Resolve the list of Promise<List<child_web_elements>> and merge
// into
// a single list
return selenium_webdriver_1.promise.all(childrenPromiseList)
.then(function (resolved) {
// into a single list
return selenium_webdriver_1.promise.all(childrenPromiseList).then(function (resolved) {
return resolved.reduce(function (childrenList, resolvedE) {

@@ -706,10 +703,11 @@ return childrenList.concat(resolvedE);

*/
this.then = function (fn, errorFn) {
return _this.elementArrayFinder_.then(function (actionResults) {
if (!fn) {
return actionResults[0];
}
return fn(actionResults[0]);
}, errorFn);
};
this.then =
function (fn, errorFn) {
return _this.elementArrayFinder_.then(function (actionResults) {
if (!fn) {
return actionResults[0];
}
return fn(actionResults[0]);
}, errorFn);
};
}

@@ -716,0 +714,0 @@ // This filter verifies that there is only 1 element returned by the

@@ -212,3 +212,5 @@ "use strict";

return elementFinder.getText().then(function (actualText) {
return actualText.indexOf(text) > -1;
// MSEdge does not properly remove newlines, which causes false
// negatives
return actualText.replace(/\r?\n|\r/g, '').indexOf(text) > -1;
});

@@ -215,0 +217,0 @@ };

@@ -17,3 +17,3 @@ var q = require('q');

browser.enterRepl();
browser.executeScript_('', 'empty debugger hook').then(function() {
browser.executeScriptWithDescription('', 'empty debugger hook').then(function() {
resolve({

@@ -20,0 +20,0 @@ failedCount: 0

@@ -175,2 +175,9 @@ "use strict";

var e = (exc instanceof Error) ? exc : new Error(exc);
if (config.ignoreUncaughtExceptions) {
// This can be a sign of a bug in the test framework, that it may
// not be handling WebDriver errors properly. However, we don't
// want these errors to prevent running the tests.
logger.warn('Ignoring uncaught error ' + exc);
return;
}
var errorCode = exitCodes_1.ErrorHandler.parseError(e);

@@ -177,0 +184,0 @@ if (errorCode) {

@@ -211,3 +211,3 @@ "use strict";

if (config.debuggerServerPort) {
browser_.debuggerServerPort_ = config.debuggerServerPort;
browser_.debuggerServerPort = config.debuggerServerPort;
}

@@ -217,2 +217,5 @@ if (config.useAllAngular2AppRoots) {

}
if (config.ng12Hybrid) {
browser_.ng12Hybrid = config.ng12Hybrid;
}
browser_.ready =

@@ -241,3 +244,8 @@ driver.manage().timeouts().setScriptTimeout(config.allScriptsTimeout);

// Copy mock modules, but do not navigate to previous URL.
browser_ = browser_.forkNewDriverInstance(false, true);
var forkBrowser = browser_.forkNewDriverInstance(false, true);
// Replace the items in browser_ but do not create a new object
// since this will break typescript imports
for (var item in forkBrowser) {
browser_[item] = forkBrowser[item];
}
_this.setupGlobals_(browser_);

@@ -244,0 +252,0 @@ };

@@ -308,3 +308,3 @@ // Used to provide better protractor documentation for webdriver. These files

* Used to switch WebDriver's focus to a frame or window (e.g. an alert, an
* iframe, another window).
* iframe, another window).
*

@@ -557,3 +557,3 @@ * See [WebDriver's TargetLocator Docs](http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_TargetLocator.html)

* var foo = element(by.id('foo'));
* expect(foo.getAttribute(class)).toEqual('bar');
* expect(foo.getAttribute('class')).toEqual('bar');
*

@@ -560,0 +560,0 @@ * @param {string} attributeName The name of the attribute to query.

// Same process for importing and compiling at ../spec.ts, except you need to
// pass the `-t ES2015` flag to `tsc`.
import {browser, element, by, By, $, $$, ExpectedConditions} from 'protractor/globals';
import {browser, element, by, By, $, $$, ExpectedConditions} from 'protractor';

@@ -10,5 +10,5 @@ describe('async function', function() {

if ((await todoList.count()) > 1) {
expect(todoList.get(1).getText()).toEqual('build an angular app');
expect((await todoList.get(1).getText())).toEqual('build an angular app');
}
});
});

@@ -15,6 +15,6 @@ {

"dependencies": {
"@types/jasmine": "^2.2.31",
"@types/node": "^6.0.35",
"@types/q": "^0.0.30",
"@types/selenium-webdriver": "~2.53.30",
"@types/jasmine": "^2.5.36",
"@types/node": "^6.0.46",
"@types/q": "^0.0.32",
"@types/selenium-webdriver": "~2.53.31",
"adm-zip": "0.4.7",

@@ -30,3 +30,3 @@ "chalk": "^1.1.3",

"source-map-support": "~0.4.0",
"webdriver-manager": "^10.2.2"
"webdriver-manager": "^10.2.6"
},

@@ -38,3 +38,3 @@ "devDependencies": {

"@types/minimist": "^1.1.28",
"@types/optimist": "0.0.28",
"@types/optimist": "^0.0.29",
"body-parser": "~1.15.2",

@@ -80,3 +80,3 @@ "chai": "~3.5.0",

},
"version": "4.0.9"
"version": "4.0.10"
}

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc