From b055391f1231d378f2346c0beaa6bd5e3572cbe6 Mon Sep 17 00:00:00 2001 From: Christian Dupuis Date: Wed, 23 Jan 2019 11:26:27 +0100 Subject: [PATCH] Support parameter prompting from command listeners --- lib/api-helper/goal/chooseAndSetGoals.ts | 5 +- lib/api-helper/goal/executeGoal.ts | 1 + .../machine/handlerRegistrations.ts | 26 +- .../fakeCommandListenerInvocation.ts | 2 + lib/api/context/SdmContext.ts | 1 + lib/api/context/parameterPrompt.ts | 104 +++ lib/api/context/preferenceStore.ts | 2 +- lib/api/goal/support/GoalScheduler.ts | 2 +- lib/api/listener/CommandListener.ts | 18 +- .../machine/SoftwareDeliveryMachineOptions.ts | 11 +- lib/api/registration/ParametersDefinition.ts | 12 +- lib/graphql/query/BranchForName.graphql | 11 +- package-lock.json | 615 ++++++++++-------- package.json | 4 +- test/api/context/parameterPrompt.test.ts | 84 +++ 15 files changed, 613 insertions(+), 285 deletions(-) create mode 100644 lib/api/context/parameterPrompt.ts create mode 100644 test/api/context/parameterPrompt.test.ts diff --git a/lib/api-helper/goal/chooseAndSetGoals.ts b/lib/api-helper/goal/chooseAndSetGoals.ts index 4f107feb8..0080e43f5 100644 --- a/lib/api-helper/goal/chooseAndSetGoals.ts +++ b/lib/api-helper/goal/chooseAndSetGoals.ts @@ -25,6 +25,7 @@ import { AddressChannels, addressChannelsFor, } from "../../api/context/addressChannels"; +import { ParameterPromptFactory } from "../../api/context/parameterPrompt"; import { NoPreferenceStore, PreferenceStore, @@ -83,7 +84,9 @@ export interface ChooseAndSetGoalsRules { enrichGoal?: (goal: SdmGoalMessage) => Promise; - preferencesFactory?: PreferenceStoreFactory; + preferencesFactory?: PreferenceStoreFactory; + + parameterPromptFactory?: ParameterPromptFactory; } /** diff --git a/lib/api-helper/goal/executeGoal.ts b/lib/api-helper/goal/executeGoal.ts index 14fdfe8e3..ca5c5f6f3 100644 --- a/lib/api-helper/goal/executeGoal.ts +++ b/lib/api-helper/goal/executeGoal.ts @@ -28,6 +28,7 @@ import * as _ from "lodash"; import * as path from "path"; import { sprintf } from "sprintf-js"; import { AddressChannels } from "../../api/context/addressChannels"; +import { NoParameterPrompt } from "../../api/context/parameterPrompt"; import { ExecuteGoalResult, isFailure, diff --git a/lib/api-helper/machine/handlerRegistrations.ts b/lib/api-helper/machine/handlerRegistrations.ts index 47e4da159..8aaec529d 100644 --- a/lib/api-helper/machine/handlerRegistrations.ts +++ b/lib/api-helper/machine/handlerRegistrations.ts @@ -57,6 +57,7 @@ import { } from "@atomist/slack-messages"; import { GitHubRepoTargets } from "../../api/command/target/GitHubRepoTargets"; import { isTransformModeSuggestion } from "../../api/command/target/TransformModeSuggestion"; +import { NoParameterPrompt } from "../../api/context/parameterPrompt"; import { NoPreferenceStore } from "../../api/context/preferenceStore"; import { SdmContext } from "../../api/context/SdmContext"; import { CommandListenerInvocation } from "../../api/listener/CommandListener"; @@ -281,6 +282,12 @@ export function eventHandlerRegistrationToEvent(sdm: MachineOrMachineOptions, e: ); } +export class CommandListenerExecutionInterruptError extends Error { + constructor(public readonly message) { + super(message); + } +} + function toOnCommand(c: CommandHandlerRegistration): (sdm: MachineOrMachineOptions) => OnCommand { addParametersDefinedInBuilder(c); return sdm => async (context, parameters) => { @@ -289,12 +296,16 @@ function toOnCommand(c: CommandHandlerRegistration): (sdm: MachineO await c.listener(cli); return Success; } catch (err) { - logger.error("Error executing command '%s': %s", cli.commandName, err.message); - logger.error(err.stack); - return { - code: 1, - message: err.message, - }; + if (err instanceof CommandListenerExecutionInterruptError) { + return Success; + } else { + logger.error("Error executing command '%s': %s", cli.commandName, err.message); + logger.error(err.stack); + return { + code: 1, + message: err.message, + }; + } } }; } @@ -322,14 +333,15 @@ function toCommandListenerInvocation

(c: CommandRegistration

, } } - // TODO do a look up for associated channels const addressChannels = (msg, opts) => context.messageClient.respond(msg, opts); + const promptFor = sdm.parameterPromptFactory ? sdm.parameterPromptFactory(context) : NoParameterPrompt; const preferences = sdm.preferenceStoreFactory ? sdm.preferenceStoreFactory(context) : NoPreferenceStore; return { commandName: c.name, context, parameters, addressChannels, + promptFor, preferences, credentials, ids, diff --git a/lib/api-helper/testsupport/fakeCommandListenerInvocation.ts b/lib/api-helper/testsupport/fakeCommandListenerInvocation.ts index ae0e07f9b..b066d1285 100644 --- a/lib/api-helper/testsupport/fakeCommandListenerInvocation.ts +++ b/lib/api-helper/testsupport/fakeCommandListenerInvocation.ts @@ -15,6 +15,7 @@ */ import { AddressNoChannels } from "../../api/context/addressChannels"; +import { NoParameterPrompt } from "../../api/context/parameterPrompt"; import { NoPreferenceStore } from "../../api/context/preferenceStore"; import { CommandListenerInvocation } from "../../api/listener/CommandListener"; import { fakeContext } from "./fakeContext"; @@ -25,6 +26,7 @@ export function fakeCommandListenerInvocation

(opts: Partial = Record; + +/** + * Factory to create a ParameterPrompt + */ +export type ParameterPromptFactory = (ctx: HandlerContext) => ParameterPrompt; + +/** + * ParameterPrompts let the caller prompt for the provided parameters + */ +export type ParameterPrompt = (parameters: ParametersPromptObject) => Promise; + +/** + * No-op NoParameterPrompt implementation that never prompts for new parameters + * @constructor + */ +export const NoParameterPrompt: ParameterPrompt = async () => ({}); + +export const AtomistContinuationMimeType = "application/x-atomist-continuation+json"; + +/** + * Default ParameterPromptFactory that uses the WebSocket connection to send parameter prompts to the backend. + * @param ctx + */ +export function commandRequestParameterPromptFactory(ctx: HandlerContext): ParameterPrompt { + return async parameters => { + const trigger = (ctx as any as AutomationContextAware).trigger as CommandIncoming; + + const existingParameters = trigger.parameters; + const newParameters = _.cloneDeep(parameters); + + // Find out if - and if - which parameters are actually missing + let missing = false; + const params: any = {}; + for (const parameter in parameters) { + if (!existingParameters.some(p => p.name === parameter)) { + missing = true; + } else { + params[parameter] = existingParameters.find(p => p.name === parameter).value; + delete newParameters[parameter]; + } + } + + // If no parameters are missing we can return the already collected parameters + if (!missing) { + return params; + } + + // Create a continuation message using the existing HandlerResponse and mixing in parameters + // and parameter_specs + const response: HandlerResponse & { parameters: Arg[], parameter_specs: Parameter[] } = { + api_version: "1", + correlation_id: trigger.correlation_id, + team: trigger.team, + command: trigger.command, + source: trigger.source, + parameters: trigger.parameters, + parameter_specs: _.map(newParameters, (v, k) => ({ + ...v, + name: k, + required: v.required !== undefined ? v.required : true, + pattern: v.pattern ? v.pattern.source : undefined, + })), + content_type: AtomistContinuationMimeType, + }; + + await configurationValue("ws.lifecycle").send(response); + throw new CommandListenerExecutionInterruptError( + `Prompting for new parameters: ${_.map(newParameters, (v, k) => k).join(", ")}`); + }; +} diff --git a/lib/api/context/preferenceStore.ts b/lib/api/context/preferenceStore.ts index bbacd4c96..fa49e03de 100644 --- a/lib/api/context/preferenceStore.ts +++ b/lib/api/context/preferenceStore.ts @@ -59,4 +59,4 @@ export const NoPreferenceStore: PreferenceStore = { put: async (key, value) => value, -} +}; diff --git a/lib/api/goal/support/GoalScheduler.ts b/lib/api/goal/support/GoalScheduler.ts index 096e42b03..eb4a35b4e 100644 --- a/lib/api/goal/support/GoalScheduler.ts +++ b/lib/api/goal/support/GoalScheduler.ts @@ -33,4 +33,4 @@ export interface GoalScheduler { * @param gi */ schedule(gi: GoalInvocation): Promise; -} \ No newline at end of file +} diff --git a/lib/api/listener/CommandListener.ts b/lib/api/listener/CommandListener.ts index 18ea01732..766f83918 100644 --- a/lib/api/listener/CommandListener.ts +++ b/lib/api/listener/CommandListener.ts @@ -1,5 +1,5 @@ /* - * Copyright © 2018 Atomist, Inc. + * Copyright © 2019 Atomist, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import { NoParameters, RemoteRepoRef, } from "@atomist/automation-client"; +import { ParametersDefinition } from "../registration/ParametersDefinition"; import { SdmListener } from "./Listener"; import { ParametersInvocation } from "./ParametersInvocation"; @@ -33,6 +34,21 @@ export interface CommandListenerInvocation extends Parame */ ids?: RemoteRepoRef[]; + /** + * Prompt for additional parameters needed during execution of the command listener. + * + * Callers should wait for the returned Promise to resolve. It will resolve with the requested + * parameters if those have already been collected. If not, a parameter prompt request to the backend + * will be sent and the Promise will reject. Once the new parameters are collected, a new + * command invocation will be sent and the command listener will restart. + * + * This requires that any state that gets created before calling promptFor can be re-created when + * re-entering the listener function. Also any action taken before calling promptFor needs to be + * implemented using idempotency patterns. + * @param parameters + */ + promptFor(parameters: ParametersDefinition): Promise; + } export type CommandListener = diff --git a/lib/api/machine/SoftwareDeliveryMachineOptions.ts b/lib/api/machine/SoftwareDeliveryMachineOptions.ts index 12964e88e..674298d16 100644 --- a/lib/api/machine/SoftwareDeliveryMachineOptions.ts +++ b/lib/api/machine/SoftwareDeliveryMachineOptions.ts @@ -27,6 +27,10 @@ import { ProgressLogFactory } from "../../spi/log/ProgressLog"; import { ProjectLoader } from "../../spi/project/ProjectLoader"; import { RepoRefResolver } from "../../spi/repo-ref/RepoRefResolver"; import { AddressChannels } from "../context/addressChannels"; +import { + ParameterPrompt, + ParameterPromptFactory, +} from "../context/parameterPrompt"; import { PreferenceStoreFactory } from "../context/preferenceStore"; import { GoalScheduler } from "../goal/support/GoalScheduler"; import { RepoTargets } from "./RepoTargets"; @@ -81,10 +85,15 @@ export interface SoftwareDeliveryMachineOptions { targets?: Maker; /** - * Optional Strategy to create a new PreferenceStore implementation + * Optional strategy to create a new PreferenceStore implementation */ preferenceStoreFactory?: PreferenceStoreFactory; + /** + * Optional strategy to allow prompting for additional parameters + */ + parameterPromptFactory?: ParameterPromptFactory; + /** * Optional strategy for launching goals in different infrastructure */ diff --git a/lib/api/registration/ParametersDefinition.ts b/lib/api/registration/ParametersDefinition.ts index cf3662551..71f67cc0b 100644 --- a/lib/api/registration/ParametersDefinition.ts +++ b/lib/api/registration/ParametersDefinition.ts @@ -1,5 +1,5 @@ /* - * Copyright © 2018 Atomist, Inc. + * Copyright © 2019 Atomist, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,13 +25,15 @@ export type ParametersDefinition = ParametersListing | ParametersO */ export interface HasDefaultValue { defaultValue?: any; } -export type ParametersObjectValue = (BaseParameter & HasDefaultValue) | MappedParameterOrSecretDeclaration; +export type ParametersObjectValue = (BaseParameter & HasDefaultValue); + +export type MappedParameterOrSecretObjectValue = MappedParameterOrSecretDeclaration; /** - * Object with properties defining parameters. Useful for combination - * via spreads. + * Object with properties defining parameters, secrets and mapped parameters. Useful for combination via spreads. */ -export type ParametersObject = Record; +export type ParametersObject + = Record; export enum DeclarationType { mapped = "mapped", diff --git a/lib/graphql/query/BranchForName.graphql b/lib/graphql/query/BranchForName.graphql index 0aaebf907..f64421251 100644 --- a/lib/graphql/query/BranchForName.graphql +++ b/lib/graphql/query/BranchForName.graphql @@ -1,9 +1,8 @@ query BranchForName($repo: String!, $owner: String!, $branch: String!) { - Branch(name: $branch) { - id - repo(name: $repo, owner: $owner) @required { - id - } + Branch(name: $branch) { + id + repo(name: $repo, owner: $owner) @required { + id } + } } - diff --git a/package-lock.json b/package-lock.json index 0c286effc..fae1ba8ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,12 +5,12 @@ "requires": true, "dependencies": { "@apollographql/apollo-tools": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.2.9.tgz", - "integrity": "sha512-AEIQwPkS0QLbkpb6WyRhV4aOMxuErasp47ABv5niDKOasQH8mrD8JSGKJAHuQxVe4kB8DE9sLRoc5qeQ0KFCHA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.3.0.tgz", + "integrity": "sha512-Tg0NVtCFHMQkcSX/dqT0m+BNnK9/lbjo4YFNX9W5g3EwczlC0edrleUM/dC4wXw71DwGrGwFiZxWLxqY1ocU5A==", "dev": true, "requires": { - "apollo-env": "0.2.5" + "apollo-env": "0.3.0" } }, "@apollographql/graphql-language-service-interface": { @@ -49,14 +49,14 @@ } }, "@atomist/automation-client": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@atomist/automation-client/-/automation-client-1.2.0.tgz", - "integrity": "sha512-1qWefDBgLcDGq2f+X0fiQF/X/NUwllZcUFfv71cScYoy8nrMjYFa/Axzduur0cmk67kx9r+gKHS3ZydqK2iD0Q==", + "version": "1.3.0-master.20190123083033", + "resolved": "https://registry.npmjs.org/@atomist/automation-client/-/automation-client-1.3.0-master.20190123083033.tgz", + "integrity": "sha512-065qytd+ZSQOMcTjU5R0YTKVP47oXbO0dkrEhF4DVCm900/TbSQQwHS1OhSFzIeLP1ai0BXi9vryL34kN/irzQ==", "dev": true, "requires": { - "@atomist/microgrammar": "1.0.1", + "@atomist/microgrammar": "^1.0.3", "@atomist/slack-messages": "1.1.0", - "@atomist/tree-path": "1.0.1", + "@atomist/tree-path": "1.0.2", "@octokit/rest": "^16.3.0", "@typed/curry": "^1.0.1", "@types/app-root-path": "^1.2.4", @@ -179,9 +179,9 @@ } }, "@atomist/microgrammar": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@atomist/microgrammar/-/microgrammar-1.0.1.tgz", - "integrity": "sha512-XJA+QzCSVRb8TV0oxlMHUbyHxQTbXKwh3Z5yus491W2SvBn6GvR9nM7CoDXhNfb2KBGm2TVV2Lx93yOPnqtq5g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@atomist/microgrammar/-/microgrammar-1.0.3.tgz", + "integrity": "sha512-XCtu0nnk5tiDMYsBv+hKNC3zbTIKY8mC4d634y4+XUX38FqXMm9TGSSWGeUL3/jL7uai09Gs3L9JfDUep3838A==", "dev": true }, "@atomist/slack-messages": { @@ -191,13 +191,13 @@ "dev": true }, "@atomist/tree-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@atomist/tree-path/-/tree-path-1.0.1.tgz", - "integrity": "sha512-RAEU7Nt4d8QCMJvlmBjjAq7gvV5qQPfD67W9pVER8ULYo+vFq/rVBS3O3ubGggm0Dd0hA6W/4ecOmgGN+u6Jog==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@atomist/tree-path/-/tree-path-1.0.2.tgz", + "integrity": "sha512-wP0Pw9+yCKjXGhaEmyNu6uEYpkXJZSH88bfGvGYMImfBAJ5MiSjQ9gvlKfyFGqVGkUN8F4XDEruwCwfxpxiQOw==", "dev": true, "requires": { - "@atomist/microgrammar": "1.0.1", - "@types/lodash": "^4.14.116", + "@atomist/microgrammar": "^1.0.3", + "@types/lodash": "^4.14.119", "lodash": "^4.17.10" } }, @@ -215,15 +215,15 @@ } }, "@babel/parser": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", - "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.1.tgz", + "integrity": "sha512-ATz6yX/L8LEnC3dtLQnIx4ydcPxhLcoy9Vl6re00zb2w5lG6itY6Vhnr1KFRPq/FHNsgl/gh2mjNN20f9iJTTA==", "dev": true }, "@babel/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.0.tgz", - "integrity": "sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", + "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -335,12 +335,12 @@ } }, "@oclif/config": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.10.4.tgz", - "integrity": "sha512-anRUBTVhW5B0dRxogOtQPbIFIaqiABc8aQfEk4cBZBUBHF1YHWyxHxaKydi/APNuLX9xcdy2GzPXcBV/V1JIzw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.12.0.tgz", + "integrity": "sha512-RB6A+N7Dq5DcFOQEhPpB8DdXtMQm2VDgdtgBKUdot815tj4gW7nDmRZBEwU85x4Xhep7Dx3tpaXobA6bFlSOWg==", "dev": true, "requires": { - "debug": "^4.1.0", + "debug": "^4.1.1", "tslib": "^1.9.3" }, "dependencies": { @@ -476,15 +476,15 @@ } }, "@oclif/plugin-plugins": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-1.7.3.tgz", - "integrity": "sha512-9aBcrETArBXLaS/21h0kMbiHNApgMF8gntRPcPhJTJ5zgsa29t2KOHRaTXZoy6on+E6Km/wvTiLx564zS0GqSA==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-1.7.6.tgz", + "integrity": "sha512-MKJ/tOc7EHk1Wy/VZskYsIdZiw4FGZ6SqxOpS98Vyw9EUCighUkbLvsUXjzYruD0ZFP+7piQxabjbOI2wBOjLA==", "dev": true, "requires": { "@oclif/color": "^0.0.0", "@oclif/command": "^1.5.4", - "chalk": "^2.4.1", - "cli-ux": "^4.9.3", + "chalk": "^2.4.2", + "cli-ux": "^5.0.0", "debug": "^4.1.0", "fs-extra": "^7.0.1", "http-call": "^5.2.2", @@ -492,9 +492,58 @@ "npm-run-path": "^2.0.2", "semver": "^5.6.0", "tslib": "^1.9.3", - "yarn": "^1.12.3" + "yarn": "^1.13.0" }, "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "clean-stack": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.0.0.tgz", + "integrity": "sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A==", + "dev": true + }, + "cli-ux": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.0.0.tgz", + "integrity": "sha512-oW3MsKNPYG3PT2DUEs+dAMaackpzO0bof6JTdqk2SEch+pww93C+3hpXKvSycMPBEgjGPkJ3tl39VkebrkckAA==", + "dev": true, + "requires": { + "@oclif/command": "^1.5.1", + "@oclif/errors": "^1.2.1", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.0", + "hyperlinker": "^1.0.0", + "indent-string": "^3.2.0", + "is-wsl": "^1.1.0", + "lodash": "^4.17.11", + "natural-orderby": "^1.0.2", + "password-prompt": "^1.0.7", + "semver": "^5.6.0", + "string-width": "^2.1.1", + "strip-ansi": "^5.0.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + } + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -564,28 +613,27 @@ } }, "@octokit/request": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.2.0.tgz", - "integrity": "sha512-4P9EbwKZ4xfyupVMb3KVuHmM+aO2fye3nufjGKz/qDssvdJj9Rlx44O0FdFvUp4kIzToy3AHLTOulEIDAL+dpg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.3.0.tgz", + "integrity": "sha512-5YRqYNZOAaL7+nt7w3Scp6Sz4P2g7wKFP9npx1xdExMomk8/M/ICXVLYVam2wzxeY0cIc6wcKpjC5KI4jiNbGw==", "dev": true, "requires": { - "@octokit/endpoint": "^3.0.0", + "@octokit/endpoint": "^3.1.1", "is-plain-object": "^2.0.4", "node-fetch": "^2.3.0", "universal-user-agent": "^2.0.1" } }, "@octokit/rest": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.3.0.tgz", - "integrity": "sha512-u0HkROLB0nOSfJhkF5FKMg6I12m6cN5S3S73Lwtfgrs9u4LhgUCZN2hC2KDyIaT7nhvNe9Kx0PgxhhD6li6QsA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.13.1.tgz", + "integrity": "sha512-r7Dg0m27todnsiXdvZcZfQm7TCND7a5vC4/IwuLoIcg1mhwk26cWsUSOMzSXOUjxjjun5H2oKzM0vBVtohKypw==", "dev": true, "requires": { - "@octokit/request": "2.2.0", + "@octokit/request": "2.3.0", "before-after-hook": "^1.2.0", "btoa-lite": "^1.0.0", "lodash.get": "^4.4.2", - "lodash.pick": "^4.4.0", "lodash.set": "^4.3.2", "lodash.uniq": "^4.5.0", "octokit-pagination-methods": "^1.1.0", @@ -684,13 +732,6 @@ "integrity": "sha1-p4twMoKzKsVN52j1US7MNWmRncc=", "dev": true }, - "@types/async": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/@types/async/-/async-2.0.50.tgz", - "integrity": "sha512-VMhZMMQgV1zsR+lX/0IBfAk+8Eb7dPVMWiQGFAt3qjo5x7Ml6b77jUo0e1C3ToD+XRDXqtrfw+6AB0uUsPEr3Q==", - "dev": true, - "optional": true - }, "@types/babel-types": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz", @@ -761,26 +802,26 @@ }, "@types/deepmerge": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/@types/deepmerge/-/deepmerge-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/@types/deepmerge/-/deepmerge-2.1.0.tgz", "integrity": "sha512-/0Ct/q5g+SgaACZ+A0ylY3071nEBN7QDnTWiCtaB3fx24UpoAQXf25yNVloOYVUis7jytM1F1WC78+EOwXkQJQ==", "dev": true }, "@types/empower": { "version": "1.2.30", - "resolved": "https://registry.npmjs.org/@types/empower/-/empower-1.2.30.tgz", + "resolved": "http://registry.npmjs.org/@types/empower/-/empower-1.2.30.tgz", "integrity": "sha1-x8/BSzph5Ux0xnTB+8kbot8NE5I=", "dev": true }, "@types/events": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", "dev": true }, "@types/express": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz", - "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", + "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", "dev": true, "requires": { "@types/body-parser": "*", @@ -789,12 +830,11 @@ } }, "@types/express-serve-static-core": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz", - "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==", + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz", + "integrity": "sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA==", "dev": true, "requires": { - "@types/events": "*", "@types/node": "*", "@types/range-parser": "*" } @@ -824,9 +864,9 @@ } }, "@types/graphql": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.0.3.tgz", - "integrity": "sha512-TcFkpEjcQK7w8OcrQcd7iIBPjU0rdyi3ldj6d0iJ4PPSzbWqPBvXj9KSwO14hTOX2dm9RoiH7VuxksJLNYdXUQ==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-14.0.5.tgz", + "integrity": "sha512-bwGYLE0SRy5ZraC91dqI2bxbspfm10kyJ2Yjuvk4OjdGznh7fkoWW+xXZHfFydJaqu9syZi099cpiZw3GlPDiA==", "dev": true }, "@types/handlebars": { @@ -952,7 +992,7 @@ }, "@types/power-assert": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/power-assert/-/power-assert-1.5.0.tgz", + "resolved": "http://registry.npmjs.org/@types/power-assert/-/power-assert-1.5.0.tgz", "integrity": "sha512-KPoeO2vSMGOOL1g8p/d7mvTTz7SCW7RRcpavqxhFwKZoqsDd1nwPGE9QICIt50b348/9MJYuBdwjUK34Y09XJw==", "dev": true, "requires": { @@ -962,7 +1002,7 @@ }, "@types/power-assert-formatter": { "version": "1.4.28", - "resolved": "https://registry.npmjs.org/@types/power-assert-formatter/-/power-assert-formatter-1.4.28.tgz", + "resolved": "http://registry.npmjs.org/@types/power-assert-formatter/-/power-assert-formatter-1.4.28.tgz", "integrity": "sha1-Jbj922MiJZxrkcNTONObD45SQlI=", "dev": true }, @@ -973,9 +1013,9 @@ "dev": true }, "@types/promise-retry": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/promise-retry/-/promise-retry-1.1.2.tgz", - "integrity": "sha512-rnfMx3T3mJBd1T4Jd4EouFTSXivbOIDmamTKPXx9KuwEzYxqPW7SuPAnQ7KmHq52GjKYzQFWz++ICuWa092deQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/promise-retry/-/promise-retry-1.1.3.tgz", + "integrity": "sha512-LxIlEpEX6frE3co3vCO2EUJfHIta1IOmhDlcAsR4GMMv9hev1iTI9VwberVGkePJAuLZs5rMucrV8CziCfuJMw==", "dev": true, "requires": { "@types/retry": "*" @@ -1157,7 +1197,7 @@ }, "@types/strip-ansi": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/@types/strip-ansi/-/strip-ansi-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/@types/strip-ansi/-/strip-ansi-3.0.0.tgz", "integrity": "sha1-m2PUU6a1SqhJGCIHcRoIvo7qSK4=", "dev": true }, @@ -1187,7 +1227,7 @@ }, "@types/valid-url": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/@types/valid-url/-/valid-url-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/@types/valid-url/-/valid-url-1.0.2.tgz", "integrity": "sha1-YPpDXOJL/VuhB7jSqAeWrq86j0U=", "dev": true }, @@ -1239,9 +1279,9 @@ } }, "ajv": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", - "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -1290,12 +1330,12 @@ "dev": true }, "apollo": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/apollo/-/apollo-2.1.8.tgz", - "integrity": "sha512-Q5LWcdxB9FwkveGGEndF9slCA+/KAWpnv3H5BKXXoLVV+4yZapKx6A3F3HaKwqpiWoWsnbZlVO9t9T6kZOhywA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/apollo/-/apollo-2.3.0.tgz", + "integrity": "sha512-6TLH7/D+f4pfAl+ljGuTXgxIpkOyCcnHiNnBzI9a0X6x/DgiuqIAOjoVFLuOFtMWfdnaT90PKbkrDrwfJTGEIQ==", "dev": true, "requires": { - "@apollographql/apollo-tools": "0.2.9", + "@apollographql/apollo-tools": "0.3.0", "@oclif/command": "^1.4.21", "@oclif/config": "^1.6.17", "@oclif/plugin-autocomplete": "^0.1.0", @@ -1303,14 +1343,14 @@ "@oclif/plugin-not-found": "^1.0.9", "@oclif/plugin-plugins": "^1.7.2", "@oclif/plugin-warn-if-update-available": "^1.3.9", - "apollo-codegen-core": "0.30.8", - "apollo-codegen-flow": "0.30.8", - "apollo-codegen-scala": "0.30.8", - "apollo-codegen-swift": "0.30.8", - "apollo-codegen-typescript": "0.30.8", + "apollo-codegen-core": "0.32.0", + "apollo-codegen-flow": "0.32.0", + "apollo-codegen-scala": "0.32.0", + "apollo-codegen-swift": "0.32.0", + "apollo-codegen-typescript": "0.32.0", "apollo-engine-reporting": "0.0.2", - "apollo-env": "0.2.5", - "apollo-language-server": "1.1.8", + "apollo-env": "0.3.0", + "apollo-language-server": "1.3.0", "chalk": "^2.4.1", "cli-ux": "^4.3.0", "env-ci": "^3.0.0", @@ -1329,103 +1369,105 @@ } }, "apollo-cache": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.22.tgz", - "integrity": "sha512-8PoxhQLISj2oHwT7i/r4l+ly4y3RKZls+dtXzAewu3U77P9dNZKhYkRNAhx9iEfsrNoHgXBV8vMp64hb1uYh+g==", + "version": "1.1.25", + "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.1.25.tgz", + "integrity": "sha512-9HhI/tVEHAeGaJJvi1Vpf6PzXUCA0PqNbigi2G3uOc180JjxbcaBvEbKXMEDb/UyTXkFWzI4PiPDuDQFqmIMSA==", "dev": true, "requires": { - "apollo-utilities": "^1.0.27" + "apollo-utilities": "^1.1.2", + "tslib": "^1.9.3" } }, "apollo-cache-inmemory": { - "version": "1.3.12", - "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.3.12.tgz", - "integrity": "sha512-jxWcW64QoYQZ09UH6v3syvCCl3MWr6bsxT3wYYL6ORi8svdJUpnNrHTcv5qXqJYVg/a+NHhfEt+eGjJUG2ytXA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.4.2.tgz", + "integrity": "sha512-fDVmj5j1e3W+inyuSwjIcMgbQ4edcFgmiKTBMFAEKAq0jg33X7FrbDX8JT2t5Vuf75Mva50JDlt5wXdu7C6WuA==", "dev": true, "requires": { - "apollo-cache": "^1.1.22", - "apollo-utilities": "^1.0.27", - "optimism": "^0.6.8" + "apollo-cache": "^1.1.25", + "apollo-utilities": "^1.1.2", + "optimism": "^0.6.9", + "tslib": "^1.9.3" } }, "apollo-client": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.4.8.tgz", - "integrity": "sha512-OAFbCTnGPtaIv0j+EZYzY20d+MD2JNbJ/YXZ4s0/oZlSg87bb0gjcIbccw2lnytipymZcZNr5ArFFeh0saGEwA==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.4.12.tgz", + "integrity": "sha512-E5ClFSB9btJLYibLKwLDSCg+w9tI+25eZgXOM+DClawu7of4d/xhuV/xvpuZpsMP3qwrp0QPacBnfG4tUJs3/w==", "dev": true, "requires": { - "@types/async": "2.0.50", "@types/zen-observable": "^0.8.0", - "apollo-cache": "1.1.22", + "apollo-cache": "1.1.25", "apollo-link": "^1.0.0", "apollo-link-dedup": "^1.0.0", - "apollo-utilities": "1.0.27", + "apollo-utilities": "1.1.2", "symbol-observable": "^1.0.2", + "tslib": "^1.9.3", "zen-observable": "^0.8.0" } }, "apollo-codegen-core": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/apollo-codegen-core/-/apollo-codegen-core-0.30.8.tgz", - "integrity": "sha512-lnGrcSuzNApDADstXKbhI2pc4tZQa2I1CKtvovwitqod0EKYQgGp4qNGvpE7M1sjdu34SHNpYWC5uJBsMRzelw==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/apollo-codegen-core/-/apollo-codegen-core-0.32.0.tgz", + "integrity": "sha512-w+LAXknUaypO5NSmij6uQfshCXnJ+AxLn84L/1KfmTdPfCAadqLJCUeTkFp/N34fgTI6qPudxnRKljNFT5Lu2A==", "dev": true, "requires": { "@babel/generator": "7.1.3", "@babel/parser": "^7.1.3", - "@babel/types": "7.2.0", - "apollo-env": "0.2.5", - "apollo-language-server": "1.1.8", + "@babel/types": "7.2.2", + "apollo-env": "0.3.0", + "apollo-language-server": "1.3.0", "ast-types": "^0.11.6", "common-tags": "^1.5.1", "recast": "^0.16.0" } }, "apollo-codegen-flow": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/apollo-codegen-flow/-/apollo-codegen-flow-0.30.8.tgz", - "integrity": "sha512-sxfZGK0Iln5wjkk4u0aJczRudenvs3WWL6K5UJMzEawAboE782eUoBzlrs2FBuLfBqj0FULh/6XcQf8RVHj79A==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/apollo-codegen-flow/-/apollo-codegen-flow-0.32.0.tgz", + "integrity": "sha512-65xBzA0tTjfPAO3sdPtYPltaKc31gh3tzgdjRoD+a7T1vGh8oiPCyDIdmQ0YJLZPaS5AV1L7gkP3IouTXbsuyw==", "dev": true, "requires": { - "@babel/types": "7.2.0", - "apollo-codegen-core": "0.30.8", - "apollo-env": "0.2.5", + "@babel/types": "7.2.2", + "apollo-codegen-core": "0.32.0", + "apollo-env": "0.3.0", "change-case": "^3.0.1", "inflected": "^2.0.3" } }, "apollo-codegen-scala": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/apollo-codegen-scala/-/apollo-codegen-scala-0.30.8.tgz", - "integrity": "sha512-c0L90N83cotFJFKhixW8OKySBe1KRjFNXYCUv4EBCa3LdvMxRXjP1h5+L0QfOVn/Rtxir7R8Rh+bZb4lPYky2w==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/apollo-codegen-scala/-/apollo-codegen-scala-0.32.0.tgz", + "integrity": "sha512-WkO7T1Ou7l2eKH2u6IeZWQBIiZVpQYY7wuZLsAW/S463dZTxfA9yVePlmlwpKyNsedXOR3vCMSp/Z1y0bPdHdw==", "dev": true, "requires": { - "apollo-codegen-core": "0.30.8", - "apollo-env": "0.2.5", + "apollo-codegen-core": "0.32.0", + "apollo-env": "0.3.0", "change-case": "^3.0.1", "inflected": "^2.0.3" } }, "apollo-codegen-swift": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/apollo-codegen-swift/-/apollo-codegen-swift-0.30.8.tgz", - "integrity": "sha512-bNQKo5v1lIXfrDGXj7/48XyxPqSmNb+uiy1TpVvBTvmqx801GtX+O1ILlX/xvhmI+HF+6zT1+JPrfEvVghSNkA==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/apollo-codegen-swift/-/apollo-codegen-swift-0.32.0.tgz", + "integrity": "sha512-BWmdNhDBM7pzHiL9dFVINr6VeG2KGGQqD+L1l1+7MeZ2h/Az1FWuJh8siEfzIsM39GeS1BDiA1PRKSzKJGhQ6A==", "dev": true, "requires": { - "apollo-codegen-core": "0.30.8", - "apollo-env": "0.2.5", + "apollo-codegen-core": "0.32.0", + "apollo-env": "0.3.0", "change-case": "^3.0.1", "inflected": "^2.0.3" } }, "apollo-codegen-typescript": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/apollo-codegen-typescript/-/apollo-codegen-typescript-0.30.8.tgz", - "integrity": "sha512-mhgALqzYoU8oP9yJacZK9dS9Niww308rkrLhg0ZFyJk8C7MyVwmhKuuoTcPoIL5PKj/Hp6R0eOAmCxuoZNCoeg==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/apollo-codegen-typescript/-/apollo-codegen-typescript-0.32.0.tgz", + "integrity": "sha512-Cqp3RwLuizu+Dnbe3XCPR+zlqKbbFHT1lnHKlFGDx4RGWpO5utxpiHBZB4rmcdYEus2PdvgN7Jnvm6PIjg3C1A==", "dev": true, "requires": { - "@babel/types": "7.2.0", - "apollo-codegen-core": "0.30.8", - "apollo-env": "0.2.5", + "@babel/types": "7.2.2", + "apollo-codegen-core": "0.32.0", + "apollo-env": "0.3.0", "change-case": "^3.0.1", "inflected": "^2.0.3" } @@ -1475,9 +1517,9 @@ } }, "apollo-env": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.2.5.tgz", - "integrity": "sha512-Gc7TEbwCl7jJVutnn8TWfzNSkrrqyoo0DP92BQJFU9pZbJhpidoXf2Sw1YwOJl82rRKH3ujM3C8vdZLOgpFcFA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.3.0.tgz", + "integrity": "sha512-L3oDC+q+fpnGaV2ZrcyClrezUbzzwnxDDoTeTaxUfahrfyyV2vyLI7yzEbi0TP5U4Jbb7uqrJKVeaMFe4vVjJA==", "dev": true, "requires": { "core-js": "^3.0.0-beta.3", @@ -1485,16 +1527,16 @@ } }, "apollo-language-server": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/apollo-language-server/-/apollo-language-server-1.1.8.tgz", - "integrity": "sha512-cOaBcUv3pr3kfqFL5OUv9dRT+xAcTxzyAZ48VhZGB0CvCbYf5vOvNEbfukS55t0bWdp3CR/VZ68sRlqpJXTWOw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/apollo-language-server/-/apollo-language-server-1.3.0.tgz", + "integrity": "sha512-eSeiz35Y63oBxQFvDmbKBj0GKg8mNsdD8NQkmm/X/XXJ8F4MAF6ie/m4QecdgO9V61kzrkMXfdiSaUmMspraJg==", "dev": true, "requires": { - "@apollographql/apollo-tools": "0.2.9", + "@apollographql/apollo-tools": "0.3.0", "@apollographql/graphql-language-service-interface": "^2.0.2", "@endemolshinegroup/cosmiconfig-typescript-loader": "^1.0.0", "apollo-datasource": "^0.2.0", - "apollo-env": "0.2.5", + "apollo-env": "0.3.0", "apollo-link": "^1.2.3", "apollo-link-context": "^1.0.9", "apollo-link-error": "^1.1.1", @@ -1611,12 +1653,13 @@ "dev": true }, "apollo-utilities": { - "version": "1.0.27", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.0.27.tgz", - "integrity": "sha512-nzrMQ89JMpNmYnVGJ4t8zN75gQbql27UDhlxNi+3OModp0Masx5g+fQmQJ5B4w2dpRuYOsdwFLmj3lQbwOKV1Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.1.2.tgz", + "integrity": "sha512-EjDx8vToK+zkWIxc76ZQY/irRX52puNg04xf/w8R0kVTDAgHuVfnFVC01O5vE25kFnIaa5em0pFI0p9b6YMkhQ==", "dev": true, "requires": { - "fast-json-stable-stringify": "^2.0.0" + "fast-json-stable-stringify": "^2.0.0", + "tslib": "^1.9.3" } }, "app-root-path": { @@ -1636,7 +1679,7 @@ "dependencies": { "sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true } @@ -1784,7 +1827,7 @@ }, "axios": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", "requires": { "follow-redirects": "^1.3.0", @@ -1825,7 +1868,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -1838,7 +1881,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -1847,7 +1890,7 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } @@ -1865,9 +1908,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz", - "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz", + "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ==", "dev": true } } @@ -1883,9 +1926,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz", - "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz", + "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ==", "dev": true }, "regenerator-runtime": { @@ -1954,9 +1997,9 @@ } }, "before-after-hook": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.0.tgz", - "integrity": "sha512-cKJpHP2JckjiWgJCSASD7np08Et+wA+rFVvdwNfCciDHd9IWfa9C2hcwY8o2i5yCFc9E+jhAcKUN9KFgPqi3zA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.3.2.tgz", + "integrity": "sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w==", "dev": true }, "bluebird": { @@ -2148,7 +2191,7 @@ }, "callsites": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, @@ -2202,9 +2245,9 @@ } }, "change-case": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz", + "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==", "dev": true, "requires": { "camel-case": "^3.0.0", @@ -2320,7 +2363,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { @@ -2331,7 +2374,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -2628,9 +2671,9 @@ "dev": true }, "core-js": { - "version": "3.0.0-beta.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.7.tgz", - "integrity": "sha512-Tf2uksQ1zuzoLbjWhEej9/iSAtjwtqzuXAGUidO7PNuUN2uPCCnJoR6YmIO3Ibq6vuGNzH6wt+3pLHrl7wEIYw==", + "version": "3.0.0-beta.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.0-beta.10.tgz", + "integrity": "sha512-ATpwQnGp5NQu42Y+D5dz/W0rt7RzkGIvkG/IiL1BKuTb6FLg+VrXGnK6cgw7j2OEFtUKkAZRq+wIbzd3jyJ7fw==", "dev": true }, "core-util-is": { @@ -2687,7 +2730,7 @@ "dependencies": { "node-fetch": { "version": "2.1.2", - "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", "dev": true } @@ -2708,7 +2751,7 @@ }, "d": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { @@ -2996,9 +3039,9 @@ } }, "env-ci": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.1.3.tgz", - "integrity": "sha512-4NudFu3oUCNprsGkt/LmvqAwJlzX9QT8289AavXiDH1pBJuEd4n0ty98yUOWN3uFtjOhOGrmt1/FDKFxCewejw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.2.0.tgz", + "integrity": "sha512-TFjNiDlXrL8/pfHswdvJGEZzJcq3aBPb8Eka83hlGLwuNw9F9BC9S9ETlkfkItLRT9k5JgpGgeP+rL6/3cEbcw==", "dev": true, "requires": { "execa": "^1.0.0", @@ -3719,7 +3762,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, @@ -3756,7 +3799,7 @@ "dependencies": { "graceful-fs": { "version": "4.1.11", - "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, @@ -3774,9 +3817,9 @@ } }, "git-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.0.tgz", - "integrity": "sha512-zoRfnGaUmRfp2tbVF5tynNFLalKDk3CwlTepXt6ZtFDaWP7xY/pzHjI2YrLiaz503tEnzZWURN4QmcfUtEd0YA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", + "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", "dev": true, "requires": { "is-ssh": "^1.3.0", @@ -3784,9 +3827,9 @@ } }, "git-url-parse": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.1.tgz", - "integrity": "sha512-xeGuOVB9RLovbmXeX9Dhq0v7bL1bX+mKnpBgpM9ZmTlMWGHyjqjcupxrEL33w6enAMMDRb3O+qncgq+BWlgb4Q==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", + "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", "dev": true, "requires": { "git-up": "^4.0.0" @@ -3885,9 +3928,9 @@ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "graphql": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.0.2.tgz", - "integrity": "sha512-gUC4YYsaiSJT1h40krG3J+USGlwhzNTXSb4IOZljn9ag5Tj+RkoXrWp+Kh7WyE3t1NCfab5kzCuxBIvOMERMXw==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.1.1.tgz", + "integrity": "sha512-C5zDzLqvfPAgTtP8AUPIt9keDabrdRAqSWjj2OPRKrKxI9Fb65I36s1uCs1UUBFnSWTdO7hyHi7z1ZbwKMKF6Q==", "dev": true, "requires": { "iterall": "^1.2.2" @@ -3961,6 +4004,32 @@ "moment": "2.22.2" }, "dependencies": { + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, "moment": { "version": "2.22.2", "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", @@ -3984,6 +4053,38 @@ "winston": "3.1.0" }, "dependencies": { + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "requires": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "graphql-tag": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.0.tgz", + "integrity": "sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w==", + "dev": true + }, "graphql-tools": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.3.tgz", @@ -4067,9 +4168,9 @@ } }, "graphql-tag": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.0.tgz", - "integrity": "sha512-9FD6cw976TLLf9WYIUPCaaTpniawIjHWZSwIRZSjrfufJamcXbVVYfN2TWvJYbw0Xf2JjYbl1/f2+wDnBVw3/w==", + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.1.tgz", + "integrity": "sha512-jApXqWBzNXQ8jYa/HLkZJaVw9jgwNqZkywa2zfFn16Iv1Zb7ELNHkJaXHR7Quvd5SIGsy6Ny7SUKATgnu05uEg==", "dev": true }, "graphql-tools": { @@ -4328,9 +4429,9 @@ "dev": true }, "hot-shots": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-6.0.1.tgz", - "integrity": "sha512-wsMdwlVA52plZgiLKsDjOZgs+5Tt7EsgUOBjVv2xPsvY8rOXaxaiqGXWcDLdhPBMyQYY8sjflwA60LJ7DjtpVA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-6.1.1.tgz", + "integrity": "sha512-ayS0pzxAFQaKw5dcuOMbonIuBnnVsrbEUC5udVZhZFHCo+97f+eBXlcxqNUrW7UZ1UY0zbq9CKrwthVt5nSLHw==", "dev": true }, "hpkp": { @@ -4419,9 +4520,9 @@ "dev": true }, "immutable-tuple": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/immutable-tuple/-/immutable-tuple-0.4.9.tgz", - "integrity": "sha512-LWbJPZnidF8eczu7XmcnLBsumuyRBkpwIRPCZxlojouhBo5jEBO4toj6n7hMy6IxHU/c+MqDSWkvaTpPlMQcyA==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/immutable-tuple/-/immutable-tuple-0.4.10.tgz", + "integrity": "sha512-45jheDbc3Kr5Cw8EtDD+4woGRUV0utIrJBZT8XH0TPZRfm8tzT0/sLGGzyyCCFqFMG5Pv5Igf3WY/arn6+8V9Q==", "dev": true }, "import-fresh": { @@ -4508,7 +4609,7 @@ }, "into-stream": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "dev": true, "requires": { @@ -4551,7 +4652,7 @@ }, "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { @@ -4699,9 +4800,9 @@ "dev": true }, "is-ssh": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.0.tgz", - "integrity": "sha1-6+oRaaJhTaOSpjdANmw84EnY3/Y=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", "dev": true, "requires": { "protocols": "^1.1.0" @@ -4838,9 +4939,9 @@ "dev": true }, "joi": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.0.tgz", - "integrity": "sha512-0HKd1z8MWogez4GaU0LkY1FgW30vR2Kwy414GISfCU41OYgUC2GWpNe5amsvBZtDqPtt7DohykfOOMIw1Z5hvQ==", + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz", + "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==", "dev": true, "requires": { "hoek": "6.x.x", @@ -5032,7 +5133,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -5045,7 +5146,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -5054,7 +5155,7 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } @@ -5121,12 +5222,6 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true - }, "lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", @@ -5192,7 +5287,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -5205,7 +5300,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -5214,7 +5309,7 @@ }, "supports-color": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } @@ -5259,9 +5354,9 @@ } }, "logform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.0.0.tgz", - "integrity": "sha512-Yk0RJmD9ps/EPR9dLKC88CHzMyLn/H0XS4hLmqOFRRyrHpfH49RaMAuyldJWGWMizpVJBRXBmZk9j/lQ8ZilUg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.0.tgz", + "integrity": "sha512-srZ6qfWCHLX0HVBuWiBC9CPWh61PFrj/akMSQTEqVOgik8fbpg849VU/kepesr6kBZ42Jsk8Duuabim6hAh27w==", "dev": true, "requires": { "colors": "^1.2.1", @@ -5382,9 +5477,9 @@ "dev": true }, "metrics": { - "version": "0.1.20", - "resolved": "https://registry.npmjs.org/metrics/-/metrics-0.1.20.tgz", - "integrity": "sha512-GVQLvEJ7JRP2oHGTYF458ex8p2qPWzZaLw47Uw7YP3RLGZVka5Jgd0xmzYPpZRd2/EmBEM7ZZhJoG0ltJ4IqCg==", + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/metrics/-/metrics-0.1.21.tgz", + "integrity": "sha512-Lg/0Kj7fani6FDmlC99glxpPjK3GHzE50Hp6IVIaMhGc9ZxR2MF0Eo4haOl1C0cGWpRkViv45P0hdvRJghkJtQ==", "dev": true, "requires": { "events": "^2.0.0" @@ -5439,7 +5534,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -5475,7 +5570,7 @@ "dependencies": { "commander": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, @@ -5533,7 +5628,7 @@ "dependencies": { "source-map": { "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { @@ -5554,6 +5649,12 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "natural-orderby": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-1.1.1.tgz", + "integrity": "sha512-WM3K4I9eKgn8tXcx5iR4/UYXFCnKOWUvKPkWRzGS/WIHleqoVBeL+8hArQsULl0unH87c2Kgg/usM2UMAuz8gw==", + "dev": true + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -5572,7 +5673,7 @@ }, "next-tick": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, @@ -5763,7 +5864,7 @@ }, "opn": { "version": "3.0.3", - "resolved": "http://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", "dev": true, "requires": { @@ -5771,9 +5872,9 @@ } }, "optimism": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.6.8.tgz", - "integrity": "sha512-bN5n1KCxSqwBDnmgDnzMtQTHdL+uea2HYFx1smvtE+w2AMl0Uy31g0aXnP/Nt85OINnMJPRpJyfRQLTCqn5Weg==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.6.9.tgz", + "integrity": "sha512-xoQm2lvXbCA9Kd7SCx6y713Y7sZ6fUc5R6VYpoL5M6svKJbTuvtNopexK8sO8K4s0EOUYHuPN2+yAEsNyRggkQ==", "dev": true, "requires": { "immutable-tuple": "^0.4.9" @@ -5941,7 +6042,7 @@ }, "p-cancelable": { "version": "0.4.1", - "resolved": "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true }, @@ -5953,7 +6054,7 @@ }, "p-is-promise": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", "dev": true }, @@ -6019,9 +6120,9 @@ } }, "parse-path": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.0.tgz", - "integrity": "sha512-F2VzhusH0Z2Dgp8SMrFMkYz2sI40deaax2AEmK1UYOf2NY77b0yJzqZ6iUjXwUHJ4VVvJNuV3S+oVEwcPjsxSQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", + "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", "dev": true, "requires": { "is-ssh": "^1.3.0", @@ -6029,9 +6130,9 @@ } }, "parse-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.0.tgz", - "integrity": "sha512-ePfnXkes247DaA0IBTU1YE6/SxM09/Y+QJm/Ne4E9VYY4H+g5/qJ+TG0p5flEqh3qnb+XXbZuob2kqrqIBJpPA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", + "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", "dev": true, "requires": { "is-ssh": "^1.3.0", @@ -6139,7 +6240,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -6213,7 +6314,7 @@ "dependencies": { "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -6496,9 +6597,9 @@ } }, "protocols": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.6.tgz", - "integrity": "sha1-+LsmPqG1/Xp2BNJri+Ob13Z4v4o=", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", "dev": true }, "proxy-addr": { @@ -6570,7 +6671,7 @@ }, "query-string": { "version": "5.1.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "requires": { @@ -6630,7 +6731,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -6644,23 +6745,17 @@ } }, "recast": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.16.1.tgz", - "integrity": "sha512-ZUQm94F3AHozRaTo4Vz6yIgkSEZIL7p+BsWeGZ23rx+ZVRoqX+bvBA8br0xmCOU0DSR4qYGtV7Y5HxTsC4V78A==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.16.2.tgz", + "integrity": "sha512-O/7qXi51DPjRVdbrpNzoBQH5dnAPQNbfoOFyRiUwreTMJfIHYOEBzwuH+c0+/BTSJ3CQyKs6ILSWXhESH6Op3A==", "dev": true, "requires": { - "ast-types": "0.11.6", + "ast-types": "0.11.7", "esprima": "~4.0.0", "private": "~0.1.5", "source-map": "~0.6.1" }, "dependencies": { - "ast-types": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.6.tgz", - "integrity": "sha512-nHiuV14upVGl7MWwFUYbzJ6YlfwWS084CU9EA8HajfYQjMSli5TQi3UTRygGF58LFWVkXxS1rbgRhROEqlQkXg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6993,7 +7088,7 @@ }, "slice-ansi": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, @@ -7212,7 +7307,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -7255,7 +7350,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -7690,9 +7785,9 @@ } }, "universal-user-agent": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.2.tgz", - "integrity": "sha512-nOwvHWLH3dBazyuzbECPA5uVFNd7AlgviXRHgR4yf48QqitIvpdncRrxMbZNMpPPEfgz30I9ubd1XmiJiqsTrg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.3.tgz", + "integrity": "sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g==", "dev": true, "requires": { "os-name": "^3.0.0" @@ -7870,7 +7965,7 @@ }, "whatwg-fetch": { "version": "2.0.4", - "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", "dev": true }, @@ -8030,7 +8125,7 @@ }, "yargs": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "dev": true, "requires": { @@ -8103,9 +8198,9 @@ } }, "yarn": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.12.3.tgz", - "integrity": "sha512-8f5rWNDvkhAmCxmn8C0LsNWMxTYVk4VGKiq0sIB6HGZjaZTHsGIH87SUmVDUEd2Wk54bqKoUlbVWgQFCQhRkVw==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.13.0.tgz", + "integrity": "sha512-Unfw2eefv8imt4ZMPhvFVP44WCz38huDxkHs+Yqrx4wBTK75Tr0mh3V4rh+2Nw5iQq0rcM/VafotCZo9qTb5DA==", "dev": true }, "yn": { @@ -8115,9 +8210,9 @@ "dev": true }, "zen-observable": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.11.tgz", - "integrity": "sha512-N3xXQVr4L61rZvGMpWe8XoCGX8vhU35dPyQ4fm5CY/KDlG0F75un14hjbckPXTDuKUY6V0dqR2giT6xN8Y4GEQ==", + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.13.tgz", + "integrity": "sha512-fa+6aDUVvavYsefZw0zaZ/v3ckEtMgCFi30sn91SEZea4y/6jQp05E3omjkX91zV6RVdn15fqnFZ6RKjRGbp2g==", "dev": true }, "zen-observable-ts": { diff --git a/package.json b/package.json index 5c93cf051..08db2a4fd 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,11 @@ "stack-trace": "0.0.10" }, "peerDependencies": { - "@atomist/automation-client": ">=1.2.0", + "@atomist/automation-client": ">=1.3.0", "@atomist/slack-messages": ">=1.1.0" }, "devDependencies": { - "@atomist/automation-client": "^1.2.0", + "@atomist/automation-client": "1.3.0-master.20190123083033", "@atomist/slack-messages": "^1.1.0", "@types/mocha": "^5.2.5", "@types/power-assert": "^1.4.29", diff --git a/test/api/context/parameterPrompt.test.ts b/test/api/context/parameterPrompt.test.ts new file mode 100644 index 000000000..55ce79e01 --- /dev/null +++ b/test/api/context/parameterPrompt.test.ts @@ -0,0 +1,84 @@ +/* + * Copyright © 2019 Atomist, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { WebSocketLifecycle } from "@atomist/automation-client/lib/internal/transport/websocket/WebSocketLifecycle"; +import * as assert from "assert"; +import { CommandListenerExecutionInterruptError } from "../../../lib/api-helper/machine/handlerRegistrations"; +import { commandRequestParameterPromptFactory } from "../../../lib/api/context/parameterPrompt"; + +describe("parameterPrompt", () => { + + describe("commandRequestParameterPromptFactory", () => { + + after(() => { + delete (global as any).__runningAutomationClient; + }); + + it("should correct find already existing parameters", async () => { + const ctx = { + trigger: { + parameters: [ + { name: "foo", value: "bar" }, + { name: "some", value: "other" }, + ], + }, + }; + + const params = await commandRequestParameterPromptFactory(ctx as any)({ foo: { required: true } }) as any; + assert.strictEqual(params.foo, ctx.trigger.parameters[0].value); + }); + + it("should ask for missing parameters", async () => { + const wsMock: WebSocketLifecycle = { + send: msg => { + assert(msg.parameter_specs.length === 2,); + assert.strictEqual(msg.parameter_specs[0].name, "bar"); + assert.strictEqual(msg.parameter_specs[1].name, "test"); + }, + } as any; + + (global as any).__runningAutomationClient = { + configuration: { + ws: { + lifecycle: wsMock, + }, + }, + }; + + const ctx = { + trigger: { + parameters: [ + { name: "foo", value: "bar" }, + { name: "some", value: "other" }, + ], + }, + }; + + try { + await commandRequestParameterPromptFactory(ctx as any)({ + bar: { required: true }, + test: { required: true }, + foo: { required: true }, + }) as any; + assert.fail(); + } catch (e) { + assert(e instanceof CommandListenerExecutionInterruptError); + } + }); + + }); + +});