diff --git a/docs/support_files/api_reference.md b/docs/support_files/api_reference.md index 330ee7cae..9d24594a3 100644 --- a/docs/support_files/api_reference.md +++ b/docs/support_files/api_reference.md @@ -6,34 +6,35 @@ The function passed to `defineSupportCode` is called with an object as the first --- -#### `addTransform({captureGroupRegexps, typeName, transformer})` +#### `defineParameterType({regexp, typeName, transformer})` Add a new transform to convert a capture group into something else. -* `captureGroupRegexps`: An array of regular expressions to apply the transformer to -* `transformer`: A function which transforms the captured group from a string into what is passed to the step definition +* `regexp`: A regular expression (or array of regular expressions) that match the parameter * `typeName`: string used to refer to this type in cucumber expressions +* `transformer`: An optional function which transforms the captured argument from a string into what is passed to the step definition. + If no transform function is specified, the captured argument is left as a string. The built in transforms are: ```javascript // Float { - captureGroupRegexps: ['-?\\d*\\.?\\d+'], + regexp: /-?\d*\.?\d+/, transformer: parseFloat, typeName: 'float' } -// Int +// Integer { - captureGroupRegexps: ['-?\\d+'], + regexp: /-?\d+/, transformer: parseInt, typeName: 'int' } // String in double quotes { - captureGroupRegexps: ['"[^"]*"'], + regexp: /"[^"]+"/, transformer: JSON.parse, typeName: 'stringInDoubleQuotes' } diff --git a/features/custom_parameter.feature b/features/custom_parameter.feature new file mode 100644 index 000000000..28e16973c --- /dev/null +++ b/features/custom_parameter.feature @@ -0,0 +1,69 @@ +Feature: Custom Parameter + + Users can register their own parameters to be used in Cucumber expressions. + Custom parameters can be used to match certain patterns, and optionally to + transform the matched value into a custom type. + + Background: + Given a file named "features/passing_steps.feature" with: + """ + Feature: a feature + Scenario: a scenario + Given a passing step + """ + + Scenario: custom parameter + Given a file named "features/step_definitions/passing_steps.js" with: + """ + import assert from 'assert' + import {defineSupportCode} from 'cucumber' + defineSupportCode(({Given, defineParameterType}) => { + defineParameterType({ + regexp: /passing|failing|undefined|pending/, + transformer: s => s.toUpperCase(), + typeName: 'status' + }) + Given('a {status} step', function(status) { + assert.equal(status, 'PASSING') + }) + }) + """ + When I run cucumber.js + Then the step "a passing step" has status "passed" + + Scenario: custom parameter without transformer + Given a file named "features/step_definitions/passing_steps.js" with: + """ + import assert from 'assert' + import {defineSupportCode} from 'cucumber' + defineSupportCode(({Given, defineParameterType}) => { + defineParameterType({ + regexp: /passing|failing|undefined|pending/, + typeName: 'status' + }) + Given('a {status} step', function(status) { + assert.equal(status, 'passing') + }) + }) + """ + When I run cucumber.js + Then the step "a passing step" has status "passed" + + Scenario: custom parameter (legacy API) + Given a file named "features/step_definitions/passing_steps.js" with: + """ + import assert from 'assert' + import {defineSupportCode} from 'cucumber' + defineSupportCode(({Given, addTransform}) => { + addTransform({ + captureGroupRegexps: /passing|failing|undefined|pending/, + transformer: s => s.toUpperCase(), + typeName: 'status' + }) + Given('a {status} step', function(status) { + assert.equal(status, 'PASSING') + }) + }) + """ + When I run cucumber.js + Then the step "a passing step" has status "passed" diff --git a/features/dryrun_mode.feature b/features/dryrun_mode.feature index 0234a6d91..aadb60fb3 100644 --- a/features/dryrun_mode.feature +++ b/features/dryrun_mode.feature @@ -29,7 +29,7 @@ Feature: Dryrun mode defineSupportCode(({Given}) => { Given('a step', function() { }); - Given('an? step', function() { }); + Given('a(n) step', function() { }); }) """ When I run cucumber.js with `--dry-run` diff --git a/features/step_definition_snippets.feature b/features/step_definition_snippets.feature index 1a6ee58fa..5d9aae782 100644 --- a/features/step_definition_snippets.feature +++ b/features/step_definition_snippets.feature @@ -9,9 +9,12 @@ Feature: step definition snippets """ When I run cucumber-js Then it fails - And it suggests a "Given" step definition snippet with 1 parameter for: + And the output contains the text: """ - 'a step numbered {arg1:int}' + Given('a step numbered {int}', function (int, callback) { + // Write code here that turns the phrase above into concrete actions + callback(null, 'pending'); + }); """ Scenario: quoted strings @@ -23,9 +26,12 @@ Feature: step definition snippets """ When I run cucumber-js Then it fails - And it suggests a "Given" step definition snippet with 1 parameter for: + And the output contains the text: """ - 'a step with {arg1:stringInDoubleQuotes}' + Given('a step with {stringInDoubleQuotes}', function (stringInDoubleQuotes, callback) { + // Write code here that turns the phrase above into concrete actions + callback(null, 'pending'); + }); """ Scenario: multiple quoted strings @@ -37,9 +43,12 @@ Feature: step definition snippets """ When I run cucumber-js Then it fails - And it suggests a "Given" step definition snippet with 2 parameters for: + And the output contains the text: """ - 'a step with {arg1:stringInDoubleQuotes} and {arg2:stringInDoubleQuotes}' + Given('a step with {stringInDoubleQuotes} and {stringInDoubleQuotes}', function (stringInDoubleQuotes, stringInDoubleQuotes2, callback) { + // Write code here that turns the phrase above into concrete actions + callback(null, 'pending'); + }); """ Scenario: background step @@ -53,7 +62,10 @@ Feature: step definition snippets """ When I run cucumber-js Then it fails - And it suggests a "Given" step definition snippet with 1 parameter for: + And the output contains the text: """ - 'a step with {arg1:stringInDoubleQuotes}' + Given('a step with {stringInDoubleQuotes}', function (stringInDoubleQuotes, callback) { + // Write code here that turns the phrase above into concrete actions + callback(null, 'pending'); + }); """ diff --git a/features/step_definitions/cli_steps.js b/features/step_definitions/cli_steps.js index 98453a195..425c97203 100644 --- a/features/step_definitions/cli_steps.js +++ b/features/step_definitions/cli_steps.js @@ -80,21 +80,4 @@ defineSupportCode(function({When, Then}) { const expectedOutput = 'Usage: cucumber.js' expect(actualOutput).to.include(expectedOutput) }) - - Then(/^it suggests a "([^"]*)" step definition snippet(?: with (\d+) parameters?(?: named "([^"]*)")?)? for:$/, function (step, parameterCount, parameterName, regExp) { - const parameters = [] - if (parameterName) { - parameters.push(parameterName) - } - else if (parameterCount) { - const count = parseInt(parameterCount) - for (let i = 1; i <= count; i += 1) { - parameters.push('arg' + i) - } - } - parameters.push('callback') - const expectedOutput = step + '(' + regExp + ', function (' + parameters.join(', ') + ') {\n' - const actualOutput = normalizeText(this.lastRun.output) - expect(actualOutput).to.include(expectedOutput) - }) }) diff --git a/features/step_definitions/json_output_steps.js b/features/step_definitions/json_output_steps.js index 0f8b884c1..0d1e2e8f9 100644 --- a/features/step_definitions/json_output_steps.js +++ b/features/step_definitions/json_output_steps.js @@ -60,13 +60,13 @@ defineSupportCode(({Then}) => { expect(step.result.status).to.eql(status) }) - Then('the step {arg1:stringInDoubleQuotes} has the attachment', function (name, table) { + Then('the step {stringInDoubleQuotes} has the attachment', function (name, table) { const step = findStep(this.lastRun.jsonOutput, _.identity, ['name', name]) const attachment = _.mapKeys(table.hashes()[0], (v, k) => _.snakeCase(k)) expect(step.embeddings[0]).to.eql(attachment) }) - Then('the {arg1:stringInDoubleQuotes} hook has the attachment', function (keyword, table) { + Then('the {stringInDoubleQuotes} hook has the attachment', function (keyword, table) { const hook = findStep(this.lastRun.jsonOutput, _.identity, ['keyword', keyword]) const attachment = _.mapKeys(table.hashes()[0], (v, k) => _.snakeCase(k)) expect(hook.embeddings[0]).to.eql(attachment) diff --git a/package.json b/package.json index be730ab0c..ba4fd17e6 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "cli-table": "^0.3.1", "colors": "^1.1.2", "commander": "^2.9.0", - "cucumber-expressions": "^1.0.3", + "cucumber-expressions": "^3.0.0", "cucumber-tag-expressions": "^1.0.0", "duration": "^0.2.0", "figures": "2.0.0", diff --git a/src/formatter/builder.js b/src/formatter/builder.js index cf3dd439c..3b9d08740 100644 --- a/src/formatter/builder.js +++ b/src/formatter/builder.js @@ -47,7 +47,7 @@ export default class FormatterBuilder { } return new StepDefinitionSnippetBuilder({ snippetSyntax: new Syntax(snippetInterface), - transformLookup: supportCodeLibrary.transformLookup + parameterTypeRegistry: supportCodeLibrary.parameterTypeRegistry }) } diff --git a/src/formatter/step_definition_snippet_builder/index.js b/src/formatter/step_definition_snippet_builder/index.js index b0b9c3d42..eae51d8d2 100644 --- a/src/formatter/step_definition_snippet_builder/index.js +++ b/src/formatter/step_definition_snippet_builder/index.js @@ -5,16 +5,16 @@ import DocString from '../../models/step_arguments/doc_string' import KeywordType from '../../keyword_type' export default class StepDefinitionSnippetBuilder { - constructor({snippetSyntax, transformLookup}) { + constructor({snippetSyntax, parameterTypeRegistry}) { this.snippetSyntax = snippetSyntax - this.cucumberExpressionGenerator = new CucumberExpressionGenerator(transformLookup) + this.cucumberExpressionGenerator = new CucumberExpressionGenerator(parameterTypeRegistry) } build(step) { const functionName = this.getFunctionName(step) const generatedExpression = this.cucumberExpressionGenerator.generateExpression(step.name, true) const pattern = generatedExpression.source - const parameters = this.getParameters(step, generatedExpression.transforms) + const parameters = this.getParameters(step, generatedExpression.parameterNames) const comment = 'Write code here that turns the phrase above into concrete actions' return this.snippetSyntax.build(functionName, pattern, parameters, comment) } @@ -27,20 +27,14 @@ export default class StepDefinitionSnippetBuilder { } } - getParameters(step, expressionTranforms) { + getParameters(step, expressionParameterNames) { return _.concat( - this.getPatternMatchingGroupParameters(expressionTranforms), + expressionParameterNames, this.getStepArgumentParameters(step), 'callback' ) } - getPatternMatchingGroupParameters(expressionTranforms) { - return _.times(expressionTranforms.length, function (n) { - return `arg${n + 1}` - }) - } - getStepArgumentParameters(step) { return step.arguments.map(function (arg) { if (arg instanceof DataTable) { diff --git a/src/formatter/step_definition_snippet_builder/index_spec.js b/src/formatter/step_definition_snippet_builder/index_spec.js index 657691e6e..c8a686cdb 100644 --- a/src/formatter/step_definition_snippet_builder/index_spec.js +++ b/src/formatter/step_definition_snippet_builder/index_spec.js @@ -2,7 +2,7 @@ import DataTable from '../../models/step_arguments/data_table' import DocString from '../../models/step_arguments/doc_string' import KeywordType from '../../keyword_type' import StepDefinitionSnippetBuilder from './' -import TransformLookupBuilder from '../../support_code_library/transform_lookup_builder' +import TransformLookupBuilder from '../../support_code_library/parameter_type_registry_builder' describe('StepDefinitionSnippetBuilder', function () { beforeEach(function () { @@ -10,7 +10,7 @@ describe('StepDefinitionSnippetBuilder', function () { this.transformsLookup = TransformLookupBuilder.build() this.snippetBuilder = new StepDefinitionSnippetBuilder({ snippetSyntax: this.snippetSyntax, - transformLookup: this.transformsLookup + parameterTypeRegistry: this.transformsLookup }) }) @@ -74,8 +74,8 @@ describe('StepDefinitionSnippetBuilder', function () { }) it('replaces the quoted string with a capture group and adds a parameter', function() { - expect(this.snippetSyntax.build.firstCall.args[1]).to.eql('abc {arg1:stringInDoubleQuotes} ghi') - expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['arg1', 'callback']) + expect(this.snippetSyntax.build.firstCall.args[1]).to.eql('abc {stringInDoubleQuotes} ghi') + expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['stringInDoubleQuotes', 'callback']) }) }) @@ -86,8 +86,8 @@ describe('StepDefinitionSnippetBuilder', function () { }) it('replaces the quoted strings with capture groups and adds parameters', function() { - expect(this.snippetSyntax.build.firstCall.args[1]).to.eql('abc {arg1:stringInDoubleQuotes} ghi {arg2:stringInDoubleQuotes} mno') - expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['arg1', 'arg2', 'callback']) + expect(this.snippetSyntax.build.firstCall.args[1]).to.eql('abc {stringInDoubleQuotes} ghi {stringInDoubleQuotes} mno') + expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['stringInDoubleQuotes', 'stringInDoubleQuotes2', 'callback']) }) }) @@ -98,8 +98,8 @@ describe('StepDefinitionSnippetBuilder', function () { }) it('replaces the number with a capture group and adds a parameter', function() { - expect(this.snippetSyntax.build.firstCall.args[1]).to.eql('abc {arg1:int} def') - expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['arg1', 'callback']) + expect(this.snippetSyntax.build.firstCall.args[1]).to.eql('abc {int} def') + expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['int', 'callback']) }) }) @@ -133,7 +133,7 @@ describe('StepDefinitionSnippetBuilder', function () { }) it('puts the table argument after the capture groups', function() { - expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['arg1', 'arg2', 'table', 'callback']) + expect(this.snippetSyntax.build.firstCall.args[2]).to.eql(['stringInDoubleQuotes', 'stringInDoubleQuotes2', 'table', 'callback']) }) }) }) diff --git a/src/models/step_definition.js b/src/models/step_definition.js index 52c6325f1..39cc09815 100644 --- a/src/models/step_definition.js +++ b/src/models/step_definition.js @@ -22,8 +22,8 @@ export default class StepDefinition { return this.buildInvalidCodeLengthMessage(parameters.length, parameters.length + 1) } - getInvocationParameters({step, transformLookup}) { - const cucumberExpression = this.getCucumberExpression(transformLookup) + getInvocationParameters({step, parameterTypeRegistry}) { + const cucumberExpression = this.getCucumberExpression(parameterTypeRegistry) const stepNameParameters = _.map(cucumberExpression.match(step.name), 'transformedValue') const stepArgumentParameters = step.arguments.map(function(arg) { if (arg instanceof DataTable) { @@ -37,11 +37,11 @@ export default class StepDefinition { return stepNameParameters.concat(stepArgumentParameters) } - getCucumberExpression(transformLookup) { + getCucumberExpression(parameterTypeRegistry) { if (typeof(this.pattern) === 'string') { - return new CucumberExpression(this.pattern, [], transformLookup) + return new CucumberExpression(this.pattern, [], parameterTypeRegistry) } else { - return new RegularExpression(this.pattern, [], transformLookup) + return new RegularExpression(this.pattern, [], parameterTypeRegistry) } } @@ -49,8 +49,8 @@ export default class StepDefinition { return [parameters.length, parameters.length + 1] } - matchesStepName({stepName, transformLookup}) { - const cucumberExpression = this.getCucumberExpression(transformLookup) + matchesStepName({stepName, parameterTypeRegistry}) { + const cucumberExpression = this.getCucumberExpression(parameterTypeRegistry) return Boolean(cucumberExpression.match(stepName)) } } diff --git a/src/runtime/scenario_runner.js b/src/runtime/scenario_runner.js index edd12e10b..919828cb5 100644 --- a/src/runtime/scenario_runner.js +++ b/src/runtime/scenario_runner.js @@ -39,7 +39,7 @@ export default class ScenarioRunner { scenarioResult: this.scenarioResult, step, stepDefinition, - transformLookup: this.supportCodeLibrary.transformLookup, + parameterTypeRegistry: this.supportCodeLibrary.parameterTypeRegistry, world: this.world }) } @@ -103,7 +103,7 @@ export default class ScenarioRunner { const stepDefinitions = this.supportCodeLibrary.stepDefinitions.filter((stepDefinition) => { return stepDefinition.matchesStepName({ stepName: step.name, - transformLookup: this.supportCodeLibrary.transformLookup + parameterTypeRegistry: this.supportCodeLibrary.parameterTypeRegistry }) }) if (stepDefinitions.length === 0) { diff --git a/src/runtime/scenario_runner_spec.js b/src/runtime/scenario_runner_spec.js index 5a0ff02e7..42b9c01f6 100644 --- a/src/runtime/scenario_runner_spec.js +++ b/src/runtime/scenario_runner_spec.js @@ -26,7 +26,7 @@ describe('ScenarioRunner', function () { beforeHookDefinitions: [], defaultTimeout: 5000, stepDefinitions: [], - transformLookup: {}, + parameterTypeRegistry: {}, World() {} } this.options = {} diff --git a/src/runtime/step_runner.js b/src/runtime/step_runner.js index 61ddb8d2c..ba759ca7c 100644 --- a/src/runtime/step_runner.js +++ b/src/runtime/step_runner.js @@ -6,9 +6,9 @@ import UserCodeRunner from '../user_code_runner' const {beginTiming, endTiming} = Time -async function run({attachmentManager, defaultTimeout, scenarioResult, step, stepDefinition, transformLookup, world}) { +async function run({attachmentManager, defaultTimeout, scenarioResult, step, stepDefinition, parameterTypeRegistry, world}) { beginTiming() - const parameters = stepDefinition.getInvocationParameters({scenarioResult, step, transformLookup}) + const parameters = stepDefinition.getInvocationParameters({scenarioResult, step, parameterTypeRegistry}) const timeoutInMilliseconds = stepDefinition.options.timeout || defaultTimeout let error, result diff --git a/src/support_code_library/builder.js b/src/support_code_library/builder.js index 04e63a221..ff2efa73e 100644 --- a/src/support_code_library/builder.js +++ b/src/support_code_library/builder.js @@ -1,9 +1,8 @@ import _ from 'lodash' import arity from 'util-arity' import isGenerator from 'is-generator' -import {Transform} from 'cucumber-expressions' import path from 'path' -import TransformLookupBuilder from './transform_lookup_builder' +import TransformLookupBuilder from './parameter_type_registry_builder' import * as helpers from './helpers' function build({cwd, fns}) { @@ -13,7 +12,7 @@ function build({cwd, fns}) { defaultTimeout: 5000, listeners: [], stepDefinitions: [], - transformLookup: TransformLookupBuilder.build(), + parameterTypeRegistry: TransformLookupBuilder.build(), World({attach, parameters}) { this.attach = attach this.parameters = parameters @@ -21,15 +20,8 @@ function build({cwd, fns}) { } let definitionFunctionWrapper = null const fnArgument = { - addTransform({captureGroupRegexps, transformer, typeName}) { - const transform = new Transform( - typeName, - function() {}, - captureGroupRegexps, - transformer - ) - options.transformLookup.addTransform(transform) - }, + addTransform: helpers.addTransform(options.parameterTypeRegistry), + defineParameterType: helpers.defineParameterType(options.parameterTypeRegistry), After: helpers.defineHook(cwd, options.afterHookDefinitions), Before: helpers.defineHook(cwd, options.beforeHookDefinitions), defineStep: helpers.defineStep(cwd, options.stepDefinitions), diff --git a/src/support_code_library/builder_spec.js b/src/support_code_library/builder_spec.js index f39b8bdc2..7cb0bbbc3 100644 --- a/src/support_code_library/builder_spec.js +++ b/src/support_code_library/builder_spec.js @@ -1,4 +1,4 @@ -import {TransformLookup} from 'cucumber-expressions' +import {ParameterTypeRegistry} from 'cucumber-expressions' import SupportCodeLibraryBuilder from './builder' describe('SupportCodeLibraryBuilder', function () { @@ -14,7 +14,7 @@ describe('SupportCodeLibraryBuilder', function () { expect(this.options.defaultTimeout).to.eql(5000) expect(this.options.listeners).to.eql([]) expect(this.options.stepDefinitions).to.eql([]) - expect(this.options.transformLookup).to.be.instanceOf(TransformLookup) + expect(this.options.parameterTypeRegistry).to.be.instanceOf(ParameterTypeRegistry) const worldInstance = new this.options.World({ attach: this.attachFn, parameters: {some: 'data'} diff --git a/src/support_code_library/helpers.js b/src/support_code_library/helpers.js index 88643a334..c7dcda851 100644 --- a/src/support_code_library/helpers.js +++ b/src/support_code_library/helpers.js @@ -1,4 +1,6 @@ +import util from 'util' import _ from 'lodash' +import {ParameterType} from 'cucumber-expressions' import {formatLocation} from '../formatter/utils' import HookDefinition from '../models/hook_definition' import path from 'path' @@ -70,3 +72,27 @@ export function registerHandler(cwd, collection) { collection.push(listener) } } + +export function addTransform(parameterTypeRegistry) { + return util.deprecate(({captureGroupRegexps, transformer, typeName}) => { + const parameter = new ParameterType( + typeName, + null, + captureGroupRegexps, + transformer + ) + parameterTypeRegistry.defineParameterType(parameter) + }, 'addTransform is deprecated and will be removed in a future version. Please use defineParameterType instead.') +} + +export function defineParameterType(parameterTypeRegistry) { + return ({regexp, transformer, typeName}) => { + const parameter = new ParameterType( + typeName, + null, + regexp, + transformer + ) + parameterTypeRegistry.defineParameterType(parameter) + } +} diff --git a/src/support_code_library/parameter_type_registry_builder.js b/src/support_code_library/parameter_type_registry_builder.js new file mode 100644 index 000000000..7c37f1e62 --- /dev/null +++ b/src/support_code_library/parameter_type_registry_builder.js @@ -0,0 +1,15 @@ +import {ParameterType, ParameterTypeRegistry} from 'cucumber-expressions' + +function build() { + const parameterTypeRegistry = new ParameterTypeRegistry() + const stringInDoubleQuotesParameterType = new ParameterType( + 'stringInDoubleQuotes', + null, + /"[^"]+"/, + JSON.parse + ) + parameterTypeRegistry.defineParameterType(stringInDoubleQuotesParameterType) + return parameterTypeRegistry +} + +export default {build} diff --git a/src/support_code_library/transform_lookup_builder.js b/src/support_code_library/transform_lookup_builder.js deleted file mode 100644 index 266521469..000000000 --- a/src/support_code_library/transform_lookup_builder.js +++ /dev/null @@ -1,15 +0,0 @@ -import {Transform, TransformLookup} from 'cucumber-expressions' - -function build() { - const transformLookup = new TransformLookup() - const stringInDoubleQuotesTransform = new Transform( - 'stringInDoubleQuotes', - function() {}, - '"[^"]*"', - JSON.parse - ) - transformLookup.addTransform(stringInDoubleQuotesTransform) - return transformLookup -} - -export default {build} diff --git a/yarn.lock b/yarn.lock index b988a57f0..c22425888 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1097,15 +1097,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.6: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-stream@~1.5.0, concat-stream@~1.5.1: +concat-stream@^1.4.6, concat-stream@~1.5.0, concat-stream@~1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" dependencies: @@ -1203,9 +1195,9 @@ crypto-browserify@^3.0.0: public-encrypt "^4.0.0" randombytes "^2.0.0" -cucumber-expressions@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-1.0.3.tgz#ea96ab5600f441f192f1c90540555baa1ae83580" +cucumber-expressions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cucumber-expressions/-/cucumber-expressions-3.0.0.tgz#4cf424813dae396cc9dab714b8104b459befc32c" cucumber-tag-expressions@^1.0.0: version "1.0.0" @@ -1231,18 +1223,12 @@ debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" -debug@2.2.0, debug@~2.2.0: +debug@2.2.0, debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" -debug@^2.1.1, debug@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" - dependencies: - ms "0.7.2" - decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2009,7 +1995,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2606,10 +2592,6 @@ ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - mute-stream@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" @@ -3007,7 +2989,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.0, readable-stream@^2.1.5, readable-stream@^2.2.2: +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.0, readable-stream@^2.1.5: version "2.2.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" dependencies: @@ -3663,7 +3645,7 @@ type-detect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" -typedarray@^0.0.6, typedarray@~0.0.5: +typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"