diff --git a/README.md b/README.md index ac89c6a4674..2ac3a65be48 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Here are the avaialable options / env variables: server=3.2|3.3|3.4|3.5 (default 3.4) browser-password= (default 'newpassword') include-import-tests=true|false (default false) +bolt-url= (default localhost:7687) E2E_TEST_ENV=local|null (if the initial set of pw should run or not) (default undefined) BROWSER_URL= (default http://localhost:8080) ``` @@ -43,5 +44,5 @@ BROWSER_URL= (default http://localhost:8080) Download these two chrome extensions: -* [Redux devtools](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en) -* [React devtools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) +- [Redux devtools](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd?hl=en) +- [React devtools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en) diff --git a/cypress.json b/cypress.json index c78bb3043cb..0dbf0e97d51 100644 --- a/cypress.json +++ b/cypress.json @@ -1,7 +1,7 @@ { "animationDistanceThreshold": 5, "baseUrl": null, - "chromeWebSecurity": true, + "chromeWebSecurity": false, "defaultCommandTimeout": 4000, "environmentVariables": {}, "execTimeout": 60000, diff --git a/e2e_tests/cypress.json b/e2e_tests/cypress.json deleted file mode 100644 index 5c34318c214..00000000000 --- a/e2e_tests/cypress.json +++ /dev/null @@ -1 +0,0 @@ -} diff --git a/e2e_tests/integration/0.index.spec.js b/e2e_tests/integration/0.index.spec.js index e43c58f8f90..76deaa68d19 100644 --- a/e2e_tests/integration/0.index.spec.js +++ b/e2e_tests/integration/0.index.spec.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ const Editor = '.ReactCodeMirror textarea' const Carousel = '[data-test-id="carousel"]' @@ -26,8 +26,13 @@ const SubmitQueryButton = '[data-test-id="submitQuery"]' const ClearEditorButton = '[data-test-id="clearEditorContent"]' describe('Neo4j Browser', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('sets new login credentials', () => { - const newPassword = Cypress.env('browser-password') || 'newpassword' + const newPassword = Cypress.config.password cy.setInitialPassword(newPassword) cy.disconnect() }) @@ -37,7 +42,7 @@ describe('Neo4j Browser', () => { cy.get(ClearEditorButton).click() }) it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' + const password = Cypress.config.password cy.connect( 'neo4j', password diff --git a/e2e_tests/integration/bolt.spec.js b/e2e_tests/integration/bolt.spec.js index 48c4f372690..bccc9c561b5 100644 --- a/e2e_tests/integration/bolt.spec.js +++ b/e2e_tests/integration/bolt.spec.js @@ -18,9 +18,14 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ describe('Bolt connections', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('show "no connection" error when not using web workers', () => { cy.executeCommand(':clear') cy.executeCommand(':config useCypherThread: false') @@ -49,7 +54,7 @@ describe('Bolt connections', () => { }) it('users with no role can connect', () => { cy.executeCommand(':clear') - const password = Cypress.env('browser-password') || 'newpassword' + const password = Cypress.config.password cy.connect( 'neo4j', password @@ -62,7 +67,7 @@ describe('Bolt connections', () => { cy.executeCommand(':server connect') // Make sure initial pw set works - cy.setInitialPassword('.', 'pw', 'no-roles', true) + cy.setInitialPassword('.', 'pw', 'no-roles', Cypress.config.boltUrl, true) // Try regular connect cy.executeCommand(':server disconnect') @@ -70,14 +75,5 @@ describe('Bolt connections', () => { 'no-roles', '.' ) - - // We need to reset the local storage value to - // default so other tests can pass - cy.executeCommand(':server disconnect') - cy.connect( - 'neo4j', - password - ) - cy.executeCommand(':server disconnect') }) }) diff --git a/e2e_tests/integration/commands.spec.js b/e2e_tests/integration/commands.spec.js index 6543568af46..86cbbf7a14e 100644 --- a/e2e_tests/integration/commands.spec.js +++ b/e2e_tests/integration/commands.spec.js @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ const commands = [ ':style', @@ -44,6 +44,11 @@ const commands = [ ] describe('Commands', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('can run all simple commands not connected without blowing up', () => { commands.forEach(cmd => { cy.executeCommand(cmd) @@ -52,11 +57,19 @@ describe('Commands', () => { }) it('can show connection error', () => { const password = 'unlikely password' - cy.connect('neo4j', password, undefined, false) + cy.connect( + 'neo4j', + password, + undefined, + false + ) }) it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' - cy.connect('neo4j', password) + const password = Cypress.config.password + cy.connect( + 'neo4j', + password + ) }) it('can run all simple commands while connected without blowing up', () => { commands.forEach(cmd => { diff --git a/e2e_tests/integration/desktop-env.spec.js b/e2e_tests/integration/desktop-env.spec.js new file mode 100644 index 00000000000..42fafdb7705 --- /dev/null +++ b/e2e_tests/integration/desktop-env.spec.js @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2002-2018 "Neo4j, Inc" + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* global Cypress, cy, test, expect, before */ + +let appContextListener + +describe('Neo4j Desktop environment', () => { + before(() => { + cy.visit(Cypress.config.url, { + onBeforeLoad: win => { + win.neo4jDesktopApi = { + getContext: () => Promise.resolve(getContext()), + onContextUpdate: fn => (appContextListener = fn.bind(fn)) + } + } + }) + }) + it('can auto connect', () => { + const frames = cy.get('[data-test-id="frameCommand"]', { timeout: 10000 }) + frames.should('have.length', 2) + + // Auto connected = :play start + frames.first().should('contain', ':play start') + cy.wait(1000) + }) + it('switches connection when that event is triggered', () => { + cy.executeCommand(':clear') + cy.wait(1000).then(() => { + appContextListener({ type: 'GRAPH_ACTIVE', id: 'test' }, getContext()) + }) + + const frames = cy.get('[data-test-id="frameCommand"]', { timeout: 10000 }) + frames.should('have.length', 1) + + frames.first().should('contain', ':server switch success') + + cy.get('[data-test-id="frame"]', { timeout: 10000 }) + .first() + .should('contain', 'Connection updated') + }) +}) + +const getContext = () => ({ + projects: [ + { + graphs: [ + { + status: 'ACTIVE', + connection: { + type: 'REMOTE', + configuration: { + protocols: { + bolt: { + enabled: true, + username: 'neo4j', + password: Cypress.config.password, + host: Cypress.config.boltHost, + port: Cypress.config.boltPort, + tlsLevel: Cypress.config.url.startsWith('https') + ? 'REQUIRED' + : 'OPTIONAL' + }, + http: { + enabled: true, + username: 'neo4j', + password: Cypress.config.password, + host: 'localhost', + port: '7474' + } + } + } + } + } + ] + } + ] +}) diff --git a/e2e_tests/integration/loadcsv.spec.js b/e2e_tests/integration/loadcsv.spec.js index 4a985797e4b..a316f171066 100644 --- a/e2e_tests/integration/loadcsv.spec.js +++ b/e2e_tests/integration/loadcsv.spec.js @@ -18,12 +18,20 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ describe('LOAD CSV', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' - cy.connect('neo4j', password) + const password = Cypress.config.password + cy.connect( + 'neo4j', + password + ) }) it('imports without periodic commit', () => { if (!Cypress.config.includeImportTests) { diff --git a/e2e_tests/integration/multistatements.spec.js b/e2e_tests/integration/multistatements.spec.js index 48f6e0248cf..b82a02a1011 100644 --- a/e2e_tests/integration/multistatements.spec.js +++ b/e2e_tests/integration/multistatements.spec.js @@ -24,6 +24,9 @@ describe('Multi statements', () => { const validQuery = 'RETURN 1; :config; RETURN 2;' before(() => { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') cy.get('[data-test-id="drawerSettings"]').click() cy.get('[data-test-id="enableMultiStatementMode"]').click() cy.get('[data-test-id="drawerSettings"]').click() @@ -34,7 +37,7 @@ describe('Multi statements', () => { cy.get('[data-test-id="drawerSettings"]').click() }) it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' + const password = Cypress.config.password cy.connect( 'neo4j', password diff --git a/e2e_tests/integration/params.spec.js b/e2e_tests/integration/params.spec.js index 0d8c711566c..321ab55ae4c 100644 --- a/e2e_tests/integration/params.spec.js +++ b/e2e_tests/integration/params.spec.js @@ -18,9 +18,14 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ describe(':param in Browser', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('handles :param without web worker', () => { cy.executeCommand(':config userCypherThread: false').then(() => { cy.executeCommand(':clear') @@ -39,7 +44,7 @@ function runTests () { let setParamQ let getParamQ // it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' + const password = Cypress.config.password cy.connect( 'neo4j', password diff --git a/e2e_tests/integration/plan.spec.js b/e2e_tests/integration/plan.spec.js index 2992c3fb0dc..95ccc053210 100644 --- a/e2e_tests/integration/plan.spec.js +++ b/e2e_tests/integration/plan.spec.js @@ -18,11 +18,16 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ describe('Plan output', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' + const password = Cypress.config.password cy.connect( 'neo4j', password diff --git a/e2e_tests/integration/style.spec.js b/e2e_tests/integration/style.spec.js index 93abcb57e71..031a7ac9dc5 100644 --- a/e2e_tests/integration/style.spec.js +++ b/e2e_tests/integration/style.spec.js @@ -18,12 +18,20 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ describe(':style', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' - cy.connect('neo4j', password) + const password = Cypress.config.password + cy.connect( + 'neo4j', + password + ) }) it('print the current style', () => { cy.executeCommand(':clear') @@ -33,12 +41,10 @@ describe(':style', () => { const query = ':style' cy.executeCommand(query) - cy - .get('[data-test-id="frameCommand"]', { timeout: 10000 }) + cy.get('[data-test-id="frameCommand"]', { timeout: 10000 }) .first() .should('contain', query) - cy - .get('[data-test-id="frameContents"]', { timeout: 10000 }) + cy.get('[data-test-id="frameContents"]', { timeout: 10000 }) .first() .should('contain', 'node {') .should('contain', 'relationship {') @@ -48,12 +54,10 @@ describe(':style', () => { cy.executeCommand(':clear') cy.executeCommand(':style') cy.get('[data-test-id="exportGrassButton"]', { timeout: 10000 }) - cy - .get('[data-test-id="styleResetButton"]', { timeout: 10000 }) + cy.get('[data-test-id="styleResetButton"]', { timeout: 10000 }) .first() .click() - cy - .get('[data-test-id="frameContents"]', { timeout: 10000 }) + cy.get('[data-test-id="frameContents"]', { timeout: 10000 }) .first() .should('contain', 'No style generated or set yet') }) diff --git a/e2e_tests/integration/topics.spec.js b/e2e_tests/integration/topics.spec.js index c20edd86608..9b1b0b9166e 100644 --- a/e2e_tests/integration/topics.spec.js +++ b/e2e_tests/integration/topics.spec.js @@ -18,19 +18,22 @@ * along with this program. If not, see . */ -/* global cy, test, expect */ +/* global cy, test, expect, before, Cypress */ describe('Help topics', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it(':help commands has contents', () => { cy.executeCommand(':clear') const query = ':help commands' cy.executeCommand(query) - cy - .get('[data-test-id="frameCommand"]', { timeout: 10000 }) + cy.get('[data-test-id="frameCommand"]', { timeout: 10000 }) .first() .should('contain', query) - cy - .get('[data-test-id="frameContents"]', { timeout: 10000 }) + cy.get('[data-test-id="frameContents"]', { timeout: 10000 }) .first() .should('contain', ':help style') }) @@ -38,12 +41,10 @@ describe('Help topics', () => { cy.executeCommand(':clear') const query = ':help style' cy.executeCommand(query) - cy - .get('[data-test-id="frameCommand"]', { timeout: 10000 }) + cy.get('[data-test-id="frameCommand"]', { timeout: 10000 }) .first() .should('contain', query) - cy - .get('[data-test-id="frameContents"]', { timeout: 10000 }) + cy.get('[data-test-id="frameContents"]', { timeout: 10000 }) .first() .should('contain', 'style command') }) diff --git a/e2e_tests/integration/types.spec.js b/e2e_tests/integration/types.spec.js index 9aa57624966..625b45ad133 100644 --- a/e2e_tests/integration/types.spec.js +++ b/e2e_tests/integration/types.spec.js @@ -18,11 +18,16 @@ * along with this program. If not, see . */ -/* global Cypress, cy, test, expect */ +/* global Cypress, cy, test, expect, before */ describe('Types in Browser', () => { + before(function () { + cy.visit(Cypress.config.url) + .title() + .should('include', 'Neo4j Browser') + }) it('can connect', () => { - const password = Cypress.env('browser-password') || 'newpassword' + const password = Cypress.config.password cy.connect( 'neo4j', password diff --git a/e2e_tests/support/commands.js b/e2e_tests/support/commands.js index fb4b3e5f88e..41786beeca6 100644 --- a/e2e_tests/support/commands.js +++ b/e2e_tests/support/commands.js @@ -10,6 +10,7 @@ Cypress.Commands.add( newPassword, initialPassword = 'neo4j', username = 'neo4j', + boltUrl = Cypress.config.boltUrl, force = false ) => { if (Cypress.env('E2E_TEST_ENV') === 'local' && !force) { @@ -20,7 +21,7 @@ Cypress.Commands.add( cy.get('input[data-test-id="boltaddress"]') .clear() - .type('bolt://localhost:7687') + .type(boltUrl) cy.get('input[data-test-id="username"]') .clear() @@ -53,7 +54,7 @@ Cypress.Commands.add( ( username, password, - host = 'bolt://localhost:7687', + boltUrl = Cypress.config.boltUrl, makeAssertions = true ) => { cy.executeCommand(':server disconnect') @@ -62,7 +63,7 @@ Cypress.Commands.add( cy.get('input[data-test-id="boltaddress"]') .clear() - .type(host) + .type(boltUrl) cy.get('input[data-test-id="username"]') .clear() diff --git a/e2e_tests/support/defaults.js b/e2e_tests/support/defaults.js index 414223ba1e9..cc88c7e2c3e 100644 --- a/e2e_tests/support/defaults.js +++ b/e2e_tests/support/defaults.js @@ -2,3 +2,16 @@ Cypress.config.serverVersion = parseFloat(Cypress.env('server')) || 3.4 Cypress.config.includeImportTests = Cypress.env('include-import-tests') || false +Cypress.config.url = Cypress.env('BROWSER_URL') || 'http://localhost:8080' +Cypress.config.password = Cypress.env('browser-password') || 'newpassword' +Cypress.config.boltHost = Cypress.env('bolt-url') + ? Cypress.env('bolt-url').split(':')[0] + : 'localhost' +Cypress.config.boltPort = Cypress.env('bolt-url') + ? Cypress.env('bolt-url').split(':')[1] + : 7687 +Cypress.config.boltUrl = + 'bolt://' + + (Cypress.env('bolt-url') + ? Cypress.env('bolt-url') + : Cypress.config.boltHost + ':' + Cypress.config.boltPort) diff --git a/e2e_tests/support/index.js b/e2e_tests/support/index.js index 879449ce102..5bbd8d4b81b 100644 --- a/e2e_tests/support/index.js +++ b/e2e_tests/support/index.js @@ -1,14 +1,7 @@ import './commands' import './defaults' -/* global Cypress, cy, before */ - -before(function () { - cy - .visit(Cypress.env('BROWSER_URL') || 'http://localhost:8080') - .title() - .should('include', 'Neo4j Browser') -}) +/* global Cypress */ afterEach(function () { if (this.currentTest.state === 'failed') { diff --git a/package.json b/package.json index 56c3c43bc07..6f29f3974fe 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "coffee-script": "^1.12.7", "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.28.7", - "cypress": "^3.0.1", + "cypress": "3.1.0", "eslint": "^4.6.1", "eslint-config-standard": "^10.2.1", "eslint-config-standard-jsx": "^4.0.1", diff --git a/src/browser/components/DesktopIntegration/helpers.js b/src/browser/components/DesktopIntegration/helpers.js index e059f43b3f3..c745f754b0c 100644 --- a/src/browser/components/DesktopIntegration/helpers.js +++ b/src/browser/components/DesktopIntegration/helpers.js @@ -34,22 +34,10 @@ export const getActiveGraph = (context = {}) => { export const getCredentials = (type, connection) => { if (!connection) return null const { configuration = null } = connection - if ( - !( - configuration && - configuration.constructor && - configuration.constructor === Object - ) - ) { + if (!configuration) { return null } - if ( - !( - configuration.protocols && - configuration.protocols.constructor && - configuration.protocols.constructor === Object - ) - ) { + if (!configuration.protocols) { return null } if (typeof configuration.protocols[type] === 'undefined') { diff --git a/src/browser/modules/App/App.jsx b/src/browser/modules/App/App.jsx index 76552c3292f..720c39602ad 100644 --- a/src/browser/modules/App/App.jsx +++ b/src/browser/modules/App/App.jsx @@ -184,9 +184,10 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { if (!creds) return // No connection. Ignore and let browser show connection lost msgs. const httpsCreds = getActiveCredentials('https', newContext) const httpCreds = getActiveCredentials('http', newContext) - const restApi = httpsCreds.enabled - ? `https://${httpsCreds.host}:${httpsCreds.port}` - : `http://${httpCreds.host}:${httpCreds.port}` + const restApi = + httpsCreds && httpsCreds.enabled + ? `https://${httpsCreds.host}:${httpsCreds.port}` + : `http://${httpCreds.host}:${httpCreds.port}` const connectionCreds = { // Use current connections creds until we get new from API ...stateProps.defaultConnectionData, @@ -202,9 +203,10 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { if (!creds) return // No connection. Ignore and let browser show connection lost msgs. const httpsCreds = getActiveCredentials('https', context) const httpCreds = getActiveCredentials('http', context) - const restApi = httpsCreds.enabled - ? `https://${httpsCreds.host}:${httpsCreds.port}` - : `http://${httpCreds.host}:${httpCreds.port}` + const restApi = + httpsCreds && httpsCreds.enabled + ? `https://${httpsCreds.host}:${httpsCreds.port}` + : `http://${httpCreds.host}:${httpCreds.port}` const connectionCreds = { // Use current connections creds until we get new from API ...stateProps.defaultConnectionData, diff --git a/src/shared/modules/commands/helpers/server.js b/src/shared/modules/commands/helpers/server.js index 78631d60fcd..81c4dac7a53 100644 --- a/src/shared/modules/commands/helpers/server.js +++ b/src/shared/modules/commands/helpers/server.js @@ -23,6 +23,7 @@ import * as connections from 'shared/modules/connections/connectionsDuck' import { add as addFrameAction } from 'shared/modules/stream/streamDuck' import { CONNECTION_ID as DISCOVERY_CONNECTION_ID } from 'shared/modules/discovery/discoveryDuck' import { UnknownCommandError, getErrorMessage } from 'services/exceptions' +import { shouldRetainConnectionCredentials } from 'shared/modules/dbMeta/dbMetaDuck' export function handleServerCommand (action, cmdchar, put, store) { const [serverCmd, props] = splitStringOnFirst( @@ -44,6 +45,9 @@ export function handleServerCommand (action, cmdchar, put, store) { if (serverCmd === 'status') { return handleServerStatusCommand(action) } + if (serverCmd === 'switch') { + return handleServerSwitchCommand(action, props, store) + } return { ...action, type: 'error', @@ -85,3 +89,23 @@ export function connectToConnection (action, connectionName, put, store) { function handleServerStatusCommand (action) { return { ...action, type: 'status' } } + +function handleServerSwitchCommand (action, props, store) { + switch (props) { + case 'success': + const activeConnectionData = connections.getActiveConnectionData( + store.getState() + ) + const storeCredentials = shouldRetainConnectionCredentials( + store.getState() + ) + return { + ...action, + type: 'switch-success', + activeConnectionData, + storeCredentials + } + case 'fail': + return { ...action, type: 'switch-fail' } + } +} diff --git a/yarn.lock b/yarn.lock index 584e53e58cf..70d3c4a4b61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -198,9 +198,9 @@ version "4.14.87" resolved "https://neo.jfrog.io/neo/api/npm/npm/@types/lodash/-/lodash-4.14.87.tgz#55f92183b048c2c64402afe472f8333f4e319a6b" -"@types/minimatch@3.0.1": - version "3.0.1" - resolved "https://neo.jfrog.io/neo/api/npm/npm/@types/minimatch/-/minimatch-3.0.1.tgz#b683eb60be358304ef146f5775db4c0e3696a550" +"@types/minimatch@3.0.3": + version "3.0.3" + resolved "https://neo.jfrog.io/neo/api/npm/npm/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" "@types/mocha@2.2.44": version "2.2.44" @@ -278,13 +278,6 @@ ajv-keywords@^3.1.0: version "3.2.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" -ajv@^4.9.1: - version "4.11.8" - resolved "https://neo.jfrog.io/neo/api/npm/npm/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.0.0, ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://neo.jfrog.io/neo/api/npm/npm/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -487,10 +480,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://neo.jfrog.io/neo/api/npm/npm/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - assert@^1.1.1: version "1.4.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" @@ -521,9 +510,9 @@ async-limiter@~1.0.0: version "1.0.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" -async@2.1.4: - version "2.1.4" - resolved "https://neo.jfrog.io/neo/api/npm/npm/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" +async@2.4.0: + version "2.4.0" + resolved "https://neo.jfrog.io/neo/api/npm/npm/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611" dependencies: lodash "^4.14.0" @@ -573,15 +562,11 @@ autoprefixer@^7.1.1, autoprefixer@^7.1.4: postcss "^6.0.17" postcss-value-parser "^3.2.3" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://neo.jfrog.io/neo/api/npm/npm/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.2.1, aws4@^1.6.0: +aws4@^1.6.0: version "1.7.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" @@ -1417,12 +1402,6 @@ boolify@^1.0.0: version "1.0.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/boolify/-/boolify-1.0.1.tgz#b5c09e17cacd113d11b7bb3ed384cc012994d86b" -boom@2.x.x: - version "2.10.1" - resolved "https://neo.jfrog.io/neo/api/npm/npm/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - boom@4.x.x: version "4.3.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" @@ -1632,9 +1611,9 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cachedir@1.2.0: - version "1.2.0" - resolved "https://neo.jfrog.io/neo/api/npm/npm/cachedir/-/cachedir-1.2.0.tgz#e9a0a25bb21a2b7a0f766f07c41eb7a311919b97" +cachedir@1.3.0: + version "1.3.0" + resolved "https://neo.jfrog.io/neo/api/npm/npm/cachedir/-/cachedir-1.3.0.tgz#5e01928bf2d95b5edd94b0942188246740e0dbc4" dependencies: os-homedir "^1.0.1" @@ -2012,7 +1991,7 @@ colour@~0.7.1: version "0.7.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: +combined-stream@1.0.6, combined-stream@~1.0.5: version "1.0.6" resolved "https://neo.jfrog.io/neo/api/npm/npm/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: @@ -2242,7 +2221,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://neo.jfrog.io/neo/api/npm/npm/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: @@ -2252,12 +2231,6 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://neo.jfrog.io/neo/api/npm/npm/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - cryptiles@3.x.x: version "3.1.2" resolved "https://neo.jfrog.io/neo/api/npm/npm/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" @@ -2440,9 +2413,9 @@ cypher-editor-support@1.1.4: fuzzaldrin "2.1.0" lodash "4.17.4" -cypress@^3.0.1: - version "3.0.1" - resolved "https://neo.jfrog.io/neo/api/npm/npm/cypress/-/cypress-3.0.1.tgz#6a8938ce8a551e4ae1bd5fb2ceab038d4ad39c4d" +cypress@3.1.0: + version "3.1.0" + resolved "https://neo.jfrog.io/neo/api/npm/npm/cypress/-/cypress-3.1.0.tgz#b718ba64289b887c7ab7a7f09245d871a4a409ba" dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/xvfb" "1.2.3" @@ -2452,32 +2425,33 @@ cypress@^3.0.1: "@types/chai-jquery" "1.1.35" "@types/jquery" "3.2.16" "@types/lodash" "4.14.87" - "@types/minimatch" "3.0.1" + "@types/minimatch" "3.0.3" "@types/mocha" "2.2.44" "@types/sinon" "4.0.0" "@types/sinon-chai" "2.7.29" bluebird "3.5.0" - cachedir "1.2.0" + cachedir "1.3.0" chalk "2.4.1" check-more-types "2.24.0" commander "2.11.0" common-tags "1.4.0" debug "3.1.0" + execa "0.10.0" executable "4.1.1" extract-zip "1.6.6" fs-extra "4.0.1" - getos "2.8.4" + getos "3.1.0" glob "7.1.2" is-ci "1.0.10" is-installed-globally "0.1.0" lazy-ass "1.6.0" listr "0.12.0" - lodash "4.17.4" + lodash "4.17.10" log-symbols "2.2.0" minimist "1.2.0" progress "1.1.8" ramda "0.24.1" - request "2.81.0" + request "2.87.0" request-progress "0.3.1" supports-color "5.1.0" tmp "0.0.31" @@ -3228,6 +3202,18 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +execa@0.10.0: + version "0.10.0" + resolved "https://neo.jfrog.io/neo/api/npm/npm/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3349,7 +3335,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.0, extend@~3.0.1: +extend@~3.0.1: version "3.0.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -3625,14 +3611,6 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~2.1.1: - version "2.1.4" - resolved "https://neo.jfrog.io/neo/api/npm/npm/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - form-data@~2.3.1: version "2.3.2" resolved "https://neo.jfrog.io/neo/api/npm/npm/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" @@ -3770,11 +3748,11 @@ get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://neo.jfrog.io/neo/api/npm/npm/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" -getos@2.8.4: - version "2.8.4" - resolved "https://neo.jfrog.io/neo/api/npm/npm/getos/-/getos-2.8.4.tgz#7b8603d3619c28e38cb0fe7a4f63c3acb80d5163" +getos@3.1.0: + version "3.1.0" + resolved "https://neo.jfrog.io/neo/api/npm/npm/getos/-/getos-3.1.0.tgz#db3aa4df15a3295557ce5e81aa9e3e5cdfaa6567" dependencies: - async "2.1.4" + async "2.4.0" getpass@^0.1.1: version "0.1.7" @@ -3908,21 +3886,10 @@ handlebars@^4.0.11, handlebars@^4.0.3: optionalDependencies: uglify-js "^2.6" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://neo.jfrog.io/neo/api/npm/npm/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - har-schema@^2.0.0: version "2.0.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://neo.jfrog.io/neo/api/npm/npm/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://neo.jfrog.io/neo/api/npm/npm/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -4009,15 +3976,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hawk@~3.1.3: - version "3.1.3" - resolved "https://neo.jfrog.io/neo/api/npm/npm/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - hawk@~6.0.2: version "6.0.2" resolved "https://neo.jfrog.io/neo/api/npm/npm/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" @@ -4039,10 +3997,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://neo.jfrog.io/neo/api/npm/npm/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - hoek@4.x.x: version "4.2.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" @@ -4174,14 +4128,6 @@ http-proxy@^1.16.2: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://neo.jfrog.io/neo/api/npm/npm/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.2.0: version "1.2.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -5143,12 +5089,6 @@ json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://neo.jfrog.io/neo/api/npm/npm/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -5171,10 +5111,6 @@ jsonic@^0.3.0: version "0.3.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/jsonic/-/jsonic-0.3.0.tgz#b545da95f54392e58b3dda05f5f2e377a6c9d1bf" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://neo.jfrog.io/neo/api/npm/npm/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - jsprim@^1.2.2: version "1.4.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -5432,14 +5368,14 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash@4.17.10, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: + version "4.17.10" + resolved "https://neo.jfrog.io/neo/api/npm/npm/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + lodash@4.17.4: version "4.17.4" resolved "https://neo.jfrog.io/neo/api/npm/npm/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" -lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: - version "4.17.10" - resolved "https://neo.jfrog.io/neo/api/npm/npm/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - log-symbols@2.2.0, log-symbols@^2.0.0: version "2.2.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" @@ -5668,7 +5604,7 @@ mime-db@~1.33.0: version "1.33.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18: version "2.1.18" resolved "https://neo.jfrog.io/neo/api/npm/npm/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: @@ -6074,7 +6010,7 @@ nwsapi@^2.0.0: version "2.0.4" resolved "https://neo.jfrog.io/neo/api/npm/npm/nwsapi/-/nwsapi-2.0.4.tgz#dc79040a5f77b97716dc79565fc7fc3ef7d50570" -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.2: version "0.8.2" resolved "https://neo.jfrog.io/neo/api/npm/npm/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -6409,10 +6345,6 @@ pend@~1.2.0: version "1.2.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://neo.jfrog.io/neo/api/npm/npm/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - performance-now@^2.1.0: version "2.1.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -7315,10 +7247,6 @@ qs@^6.5.1, qs@~6.5.1: version "6.5.2" resolved "https://neo.jfrog.io/neo/api/npm/npm/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" -qs@~6.4.0: - version "6.4.0" - resolved "https://neo.jfrog.io/neo/api/npm/npm/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - query-string@^4.1.0: version "4.3.4" resolved "https://neo.jfrog.io/neo/api/npm/npm/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -7816,33 +7744,6 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2.81.0: - version "2.81.0" - resolved "https://neo.jfrog.io/neo/api/npm/npm/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - request@2.83.0: version "2.83.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -7870,7 +7771,7 @@ request@2.83.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.83.0: +request@2.87.0, request@^2.83.0: version "2.87.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" dependencies: @@ -8262,12 +8163,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://neo.jfrog.io/neo/api/npm/npm/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - sntp@2.x.x: version "2.1.0" resolved "https://neo.jfrog.io/neo/api/npm/npm/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" @@ -8570,7 +8465,7 @@ stringify-object@^3.2.0: is-obj "^1.0.1" is-regexp "^1.0.0" -stringstream@~0.0.4, stringstream@~0.0.5: +stringstream@~0.0.5: version "0.0.6" resolved "https://neo.jfrog.io/neo/api/npm/npm/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" @@ -8878,7 +8773,7 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.3: psl "^1.1.24" punycode "^1.4.1" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.3: version "2.3.4" resolved "https://neo.jfrog.io/neo/api/npm/npm/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: @@ -9130,7 +9025,7 @@ utils-merge@1.0.1: version "1.0.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0: +uuid@^3.0.1, uuid@^3.1.0: version "3.2.1" resolved "https://neo.jfrog.io/neo/api/npm/npm/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"