diff --git a/plugins/auth-memory/.babelrc b/plugins/auth-memory/.babelrc index 2b2ff907..d0ee6570 100644 --- a/plugins/auth-memory/.babelrc +++ b/plugins/auth-memory/.babelrc @@ -1,13 +1,7 @@ { - "presets": [ - [ - "env", - { - "targets": { - "node": "6" - } - } - ], - "flow" - ] -} \ No newline at end of file + "presets": [["env", { + "targets": { + "node": "6" + } + }], "flow"] + } diff --git a/plugins/auth-memory/.eslintignore b/plugins/auth-memory/.eslintignore index e51f1b8f..a28a5e38 100644 --- a/plugins/auth-memory/.eslintignore +++ b/plugins/auth-memory/.eslintignore @@ -1,7 +1,12 @@ node_modules coverage/ lib/ -.nyc_output -tests-report/ flow-typed/ -fixtures/ \ No newline at end of file +fixtures/ +.flowconfig +.prettierrc +.yarnrc +jest* +.vscode/ +.circleci/ +.eslintrc \ No newline at end of file diff --git a/plugins/auth-memory/.eslintrc b/plugins/auth-memory/.eslintrc new file mode 100644 index 00000000..f2b2c22f --- /dev/null +++ b/plugins/auth-memory/.eslintrc @@ -0,0 +1,46 @@ +{ + "plugins": [ + "flowtype", + "jest" + ], + "extends": [ + "eslint:recommended", + "google", + "plugin:flowtype/recommended", + "plugin:jest/recommended", + "plugin:prettier/recommended" + ], + "parser": "babel-eslint", + "parserOptions": { + "sourceType": "module", + "ecmaVersion": 7, + "ecmaFeatures": { + "impliedStrict": true, + "jsx": true + } + }, + "env": { + "browser": true, + "node": true, + "es6": true, + "jest": true + }, + "globals": { + "__APP_VERSION__": true + }, + "rules": { + "prettier/prettier": ["error", null, "@prettier"], + "no-useless-escape": 2, + "handle-callback-err": 2, + "no-fallthrough": 2, + "no-new-require": 2, + "max-len": [2, 160], + "camelcase": 0, + "require-jsdoc": 0, + "valid-jsdoc": 0, + "prefer-spread": 1, + "prefer-rest-params": 1, + "linebreak-style": 0, + "quote-props":["error", "as-needed"] + } +} diff --git a/plugins/auth-memory/.eslintrc.yml b/plugins/auth-memory/.eslintrc.yml deleted file mode 100644 index b1382c07..00000000 --- a/plugins/auth-memory/.eslintrc.yml +++ /dev/null @@ -1,83 +0,0 @@ -extends: ['plugin:prettier/recommended'] -parser: 'babel-eslint' -parserOptions: - ecmaVersion: 2018 - sourceType: module -env: - node: true - browser: true - es6: true - mocha: true - jest: true -rules: - prettier/prettier: ['error', { 'singleQuote': true }] - strict: 0 - # useful to have in node.js, - # if you're sure you don't need to handle error, rename it to "_err" - handle-callback-err: 2 - - padded-blocks: 0 - switch-colon-spacing: 0 - - # just to make sure we don't forget to remove them when releasing - no-debugger: 2 - - # add "falls through" for those - no-fallthrough: 2 - - # enforce use curly always - # curly: 1 - - # just warnings about whitespace weirdness here - eol-last: 1 - no-irregular-whitespace: 1 - no-mixed-spaces-and-tabs: [1, smart-tabs] - no-trailing-spaces: 1 - - # probably always an error, tell me if it's not - no-new-require: 2 - - # single most important rule here, without it linting won't even - # make any sense - no-undef: 2 - - # in practice, those are always errors - no-unreachable: 2 - - # useful for code clean-up - no-unused-vars: [2, {"vars": "all", "args": "none"}] - - max-len: [1, 120] - - # camelcase is standard, but this should be 1 and then 2 soon - camelcase: 0 - - # jsdoc is mandatory - require-jsdoc: 0 - valid-jsdoc: 0 - - # this feature is cool but not supported by Node 4, disable via comments - prefer-spread: 1 - prefer-rest-params: 1 - - # encorage use es6 - no-var: 2 - - # configuration that should be upgraded progresivelly - no-constant-condition: 2 - no-empty: 2 - - # loop over objects http://eslint.org/docs/rules/guard-for-in - guard-for-in: 2 - - # this must be used within classes - no-invalid-this: 2 - - # All object must be uppercase - new-cap: 2 - - # readbility is important, no multiple inline declarations - one-var: 0 - - # console not allowed unless for testing - no-console: [2, {"allow": ["log", "warn"]}] diff --git a/plugins/auth-memory/.flowconfig b/plugins/auth-memory/.flowconfig index 75dd13ee..cdc96bcb 100644 --- a/plugins/auth-memory/.flowconfig +++ b/plugins/auth-memory/.flowconfig @@ -8,4 +8,4 @@ node_modules/@verdaccio/types/lib/ [lints] [options] -suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe \ No newline at end of file +suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe diff --git a/plugins/auth-memory/.gitignore b/plugins/auth-memory/.gitignore index b2597f52..ef42355c 100644 --- a/plugins/auth-memory/.gitignore +++ b/plugins/auth-memory/.gitignore @@ -1,15 +1,11 @@ npm-debug.log .DS_Store -package-lock.json + _storage/ lib/ node_modules/ coverage/ -# Istanbul -.nyc* -tests-report - # IDE .vscode/* .idea/ @@ -17,4 +13,3 @@ tests-report *.tar *.gz *.tmp-* -coverage/ \ No newline at end of file diff --git a/plugins/auth-memory/.prettierrc b/plugins/auth-memory/.prettierrc new file mode 100644 index 00000000..1a23632d --- /dev/null +++ b/plugins/auth-memory/.prettierrc @@ -0,0 +1,12 @@ +{ + "useTabs": false, + "printWidth": 160, + "tabWidth": 2, + "singleQuote": true, + "requirePragma": true, + "bracketSpacing": true, + "jsxBracketSameLine": false, + "trailingComma": "es5", + "semi": true, + "parser": "flow" +} diff --git a/plugins/auth-memory/flow-typed/npm/http-errors_v1.x.x.js b/plugins/auth-memory/flow-typed/npm/http-errors_v1.x.x.js new file mode 100644 index 00000000..981638d6 --- /dev/null +++ b/plugins/auth-memory/flow-typed/npm/http-errors_v1.x.x.js @@ -0,0 +1,59 @@ +// flow-typed signature: 573c576fe34eb3c3c65dd7a9c90a46d2 +// flow-typed version: b43dff3e0e/http-errors_v1.x.x/flow_>=v0.25.x + +declare module 'http-errors' { + declare class SpecialHttpError extends HttpError { + constructor(): SpecialHttpError; + } + declare class HttpError extends Error { + expose: bool; + message: string; + status: number; + statusCode: number; + } + declare module.exports: { + (status?: number, message?: string, props?: Object): HttpError; + HttpError: typeof HttpError; + BadRequest: typeof SpecialHttpError; + Unauthorized: typeof SpecialHttpError; + PaymentRequired: typeof SpecialHttpError; + Forbidden: typeof SpecialHttpError; + NotFound: typeof SpecialHttpError; + MethodNotAllowed: typeof SpecialHttpError; + NotAcceptable: typeof SpecialHttpError; + ProxyAuthenticationRequired: typeof SpecialHttpError; + RequestTimeout: typeof SpecialHttpError; + Conflict: typeof SpecialHttpError; + Gone: typeof SpecialHttpError; + LengthRequired: typeof SpecialHttpError; + PreconditionFailed: typeof SpecialHttpError; + PayloadTooLarge: typeof SpecialHttpError; + URITooLong: typeof SpecialHttpError; + UnsupportedMediaType: typeof SpecialHttpError; + RangeNotStatisfiable: typeof SpecialHttpError; + ExpectationFailed: typeof SpecialHttpError; + ImATeapot: typeof SpecialHttpError; + MisdirectedRequest: typeof SpecialHttpError; + UnprocessableEntity: typeof SpecialHttpError; + Locked: typeof SpecialHttpError; + FailedDependency: typeof SpecialHttpError; + UnorderedCollection: typeof SpecialHttpError; + UpgradeRequired: typeof SpecialHttpError; + PreconditionRequired: typeof SpecialHttpError; + TooManyRequests: typeof SpecialHttpError; + RequestHeaderFieldsTooLarge: typeof SpecialHttpError; + UnavailableForLegalReasons: typeof SpecialHttpError; + InternalServerError: typeof SpecialHttpError; + NotImplemented: typeof SpecialHttpError; + BadGateway: typeof SpecialHttpError; + ServiceUnavailable: typeof SpecialHttpError; + GatewayTimeout: typeof SpecialHttpError; + HTTPVersionNotSupported: typeof SpecialHttpError; + VariantAlsoNegotiates: typeof SpecialHttpError; + InsufficientStorage: typeof SpecialHttpError; + LoopDetected: typeof SpecialHttpError; + BandwidthLimitExceeded: typeof SpecialHttpError; + NotExtended: typeof SpecialHttpError; + NetworkAuthenticationRequired: typeof SpecialHttpError; + } +} diff --git a/plugins/auth-memory/flow-typed/npm/jest_v23.x.x.js b/plugins/auth-memory/flow-typed/npm/jest_v23.x.x.js new file mode 100644 index 00000000..23b66b07 --- /dev/null +++ b/plugins/auth-memory/flow-typed/npm/jest_v23.x.x.js @@ -0,0 +1,1108 @@ +// flow-typed signature: f5a484315a3dea13d273645306e4076a +// flow-typed version: 7c5d14b3d4/jest_v23.x.x/flow_>=v0.39.x + +type JestMockFn, TReturn> = { + (...args: TArguments): TReturn, + /** + * An object for introspecting mock calls + */ + mock: { + /** + * An array that represents all calls that have been made into this mock + * function. Each call is represented by an array of arguments that were + * passed during the call. + */ + calls: Array, + /** + * An array that contains all the object instances that have been + * instantiated from this mock function. + */ + instances: Array + }, + /** + * Resets all information stored in the mockFn.mock.calls and + * mockFn.mock.instances arrays. Often this is useful when you want to clean + * up a mock's usage data between two assertions. + */ + mockClear(): void, + /** + * Resets all information stored in the mock. This is useful when you want to + * completely restore a mock back to its initial state. + */ + mockReset(): void, + /** + * Removes the mock and restores the initial implementation. This is useful + * when you want to mock functions in certain test cases and restore the + * original implementation in others. Beware that mockFn.mockRestore only + * works when mock was created with jest.spyOn. Thus you have to take care of + * restoration yourself when manually assigning jest.fn(). + */ + mockRestore(): void, + /** + * Accepts a function that should be used as the implementation of the mock. + * The mock itself will still record all calls that go into and instances + * that come from itself -- the only difference is that the implementation + * will also be executed when the mock is called. + */ + mockImplementation( + fn: (...args: TArguments) => TReturn + ): JestMockFn, + /** + * Accepts a function that will be used as an implementation of the mock for + * one call to the mocked function. Can be chained so that multiple function + * calls produce different results. + */ + mockImplementationOnce( + fn: (...args: TArguments) => TReturn + ): JestMockFn, + /** + * Accepts a string to use in test result output in place of "jest.fn()" to + * indicate which mock function is being referenced. + */ + mockName(name: string): JestMockFn, + /** + * Just a simple sugar function for returning `this` + */ + mockReturnThis(): void, + /** + * Accepts a value that will be returned whenever the mock function is called. + */ + mockReturnValue(value: TReturn): JestMockFn, + /** + * Sugar for only returning a value once inside your mock + */ + mockReturnValueOnce(value: TReturn): JestMockFn, + /** + * Sugar for jest.fn().mockImplementation(() => Promise.resolve(value)) + */ + mockResolvedValue(value: TReturn): JestMockFn>, + /** + * Sugar for jest.fn().mockImplementationOnce(() => Promise.resolve(value)) + */ + mockResolvedValueOnce(value: TReturn): JestMockFn>, + /** + * Sugar for jest.fn().mockImplementation(() => Promise.reject(value)) + */ + mockRejectedValue(value: TReturn): JestMockFn>, + /** + * Sugar for jest.fn().mockImplementationOnce(() => Promise.reject(value)) + */ + mockRejectedValueOnce(value: TReturn): JestMockFn> +}; + +type JestAsymmetricEqualityType = { + /** + * A custom Jasmine equality tester + */ + asymmetricMatch(value: mixed): boolean +}; + +type JestCallsType = { + allArgs(): mixed, + all(): mixed, + any(): boolean, + count(): number, + first(): mixed, + mostRecent(): mixed, + reset(): void +}; + +type JestClockType = { + install(): void, + mockDate(date: Date): void, + tick(milliseconds?: number): void, + uninstall(): void +}; + +type JestMatcherResult = { + message?: string | (() => string), + pass: boolean +}; + +type JestMatcher = (actual: any, expected: any) => JestMatcherResult; + +type JestPromiseType = { + /** + * Use rejects to unwrap the reason of a rejected promise so any other + * matcher can be chained. If the promise is fulfilled the assertion fails. + */ + rejects: JestExpectType, + /** + * Use resolves to unwrap the value of a fulfilled promise so any other + * matcher can be chained. If the promise is rejected the assertion fails. + */ + resolves: JestExpectType +}; + +/** + * Jest allows functions and classes to be used as test names in test() and + * describe() + */ +type JestTestName = string | Function; + +/** + * Plugin: jest-styled-components + */ + +type JestStyledComponentsMatcherValue = + | string + | JestAsymmetricEqualityType + | RegExp + | typeof undefined; + +type JestStyledComponentsMatcherOptions = { + media?: string; + modifier?: string; + supports?: string; +} + +type JestStyledComponentsMatchersType = { + toHaveStyleRule( + property: string, + value: JestStyledComponentsMatcherValue, + options?: JestStyledComponentsMatcherOptions + ): void, +}; + +/** + * Plugin: jest-enzyme + */ +type EnzymeMatchersType = { + toBeChecked(): void, + toBeDisabled(): void, + toBeEmpty(): void, + toBeEmptyRender(): void, + toBePresent(): void, + toContainReact(element: React$Element): void, + toExist(): void, + toHaveClassName(className: string): void, + toHaveHTML(html: string): void, + toHaveProp: ((propKey: string, propValue?: any) => void) & ((props: Object) => void), + toHaveRef(refName: string): void, + toHaveState: ((stateKey: string, stateValue?: any) => void) & ((state: Object) => void), + toHaveStyle: ((styleKey: string, styleValue?: any) => void) & ((style: Object) => void), + toHaveTagName(tagName: string): void, + toHaveText(text: string): void, + toIncludeText(text: string): void, + toHaveValue(value: any): void, + toMatchElement(element: React$Element): void, + toMatchSelector(selector: string): void +}; + +// DOM testing library extensions https://github.com/kentcdodds/dom-testing-library#custom-jest-matchers +type DomTestingLibraryType = { + toBeInTheDOM(): void, + toHaveTextContent(content: string): void, + toHaveAttribute(name: string, expectedValue?: string): void +}; + +// Jest JQuery Matchers: https://github.com/unindented/custom-jquery-matchers +type JestJQueryMatchersType = { + toExist(): void, + toHaveLength(len: number): void, + toHaveId(id: string): void, + toHaveClass(className: string): void, + toHaveTag(tag: string): void, + toHaveAttr(key: string, val?: any): void, + toHaveProp(key: string, val?: any): void, + toHaveText(text: string | RegExp): void, + toHaveData(key: string, val?: any): void, + toHaveValue(val: any): void, + toHaveCss(css: {[key: string]: any}): void, + toBeChecked(): void, + toBeDisabled(): void, + toBeEmpty(): void, + toBeHidden(): void, + toBeSelected(): void, + toBeVisible(): void, + toBeFocused(): void, + toBeInDom(): void, + toBeMatchedBy(sel: string): void, + toHaveDescendant(sel: string): void, + toHaveDescendantWithText(sel: string, text: string | RegExp): void +}; + + +// Jest Extended Matchers: https://github.com/jest-community/jest-extended +type JestExtendedMatchersType = { + /** + * Note: Currently unimplemented + * Passing assertion + * + * @param {String} message + */ + // pass(message: string): void; + + /** + * Note: Currently unimplemented + * Failing assertion + * + * @param {String} message + */ + // fail(message: string): void; + + /** + * Use .toBeEmpty when checking if a String '', Array [] or Object {} is empty. + */ + toBeEmpty(): void; + + /** + * Use .toBeOneOf when checking if a value is a member of a given Array. + * @param {Array.<*>} members + */ + toBeOneOf(members: any[]): void; + + /** + * Use `.toBeNil` when checking a value is `null` or `undefined`. + */ + toBeNil(): void; + + /** + * Use `.toSatisfy` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean`. + * @param {Function} predicate + */ + toSatisfy(predicate: (n: any) => boolean): void; + + /** + * Use `.toBeArray` when checking if a value is an `Array`. + */ + toBeArray(): void; + + /** + * Use `.toBeArrayOfSize` when checking if a value is an `Array` of size x. + * @param {Number} x + */ + toBeArrayOfSize(x: number): void; + + /** + * Use `.toIncludeAllMembers` when checking if an `Array` contains all of the same members of a given set. + * @param {Array.<*>} members + */ + toIncludeAllMembers(members: any[]): void; + + /** + * Use `.toIncludeAnyMembers` when checking if an `Array` contains any of the members of a given set. + * @param {Array.<*>} members + */ + toIncludeAnyMembers(members: any[]): void; + + /** + * Use `.toSatisfyAll` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean` for all values in an array. + * @param {Function} predicate + */ + toSatisfyAll(predicate: (n: any) => boolean): void; + + /** + * Use `.toBeBoolean` when checking if a value is a `Boolean`. + */ + toBeBoolean(): void; + + /** + * Use `.toBeTrue` when checking a value is equal (===) to `true`. + */ + toBeTrue(): void; + + /** + * Use `.toBeFalse` when checking a value is equal (===) to `false`. + */ + toBeFalse(): void; + + /** + * Use .toBeDate when checking if a value is a Date. + */ + toBeDate(): void; + + /** + * Use `.toBeFunction` when checking if a value is a `Function`. + */ + toBeFunction(): void; + + /** + * Use `.toHaveBeenCalledBefore` when checking if a `Mock` was called before another `Mock`. + * + * Note: Required Jest version >22 + * Note: Your mock functions will have to be asynchronous to cause the timestamps inside of Jest to occur in a differentJS event loop, otherwise the mock timestamps will all be the same + * + * @param {Mock} mock + */ + toHaveBeenCalledBefore(mock: JestMockFn): void; + + /** + * Use `.toBeNumber` when checking if a value is a `Number`. + */ + toBeNumber(): void; + + /** + * Use `.toBeNaN` when checking a value is `NaN`. + */ + toBeNaN(): void; + + /** + * Use `.toBeFinite` when checking if a value is a `Number`, not `NaN` or `Infinity`. + */ + toBeFinite(): void; + + /** + * Use `.toBePositive` when checking if a value is a positive `Number`. + */ + toBePositive(): void; + + /** + * Use `.toBeNegative` when checking if a value is a negative `Number`. + */ + toBeNegative(): void; + + /** + * Use `.toBeEven` when checking if a value is an even `Number`. + */ + toBeEven(): void; + + /** + * Use `.toBeOdd` when checking if a value is an odd `Number`. + */ + toBeOdd(): void; + + /** + * Use `.toBeWithin` when checking if a number is in between the given bounds of: start (inclusive) and end (exclusive). + * + * @param {Number} start + * @param {Number} end + */ + toBeWithin(start: number, end: number): void; + + /** + * Use `.toBeObject` when checking if a value is an `Object`. + */ + toBeObject(): void; + + /** + * Use `.toContainKey` when checking if an object contains the provided key. + * + * @param {String} key + */ + toContainKey(key: string): void; + + /** + * Use `.toContainKeys` when checking if an object has all of the provided keys. + * + * @param {Array.} keys + */ + toContainKeys(keys: string[]): void; + + /** + * Use `.toContainAllKeys` when checking if an object only contains all of the provided keys. + * + * @param {Array.} keys + */ + toContainAllKeys(keys: string[]): void; + + /** + * Use `.toContainAnyKeys` when checking if an object contains at least one of the provided keys. + * + * @param {Array.} keys + */ + toContainAnyKeys(keys: string[]): void; + + /** + * Use `.toContainValue` when checking if an object contains the provided value. + * + * @param {*} value + */ + toContainValue(value: any): void; + + /** + * Use `.toContainValues` when checking if an object contains all of the provided values. + * + * @param {Array.<*>} values + */ + toContainValues(values: any[]): void; + + /** + * Use `.toContainAllValues` when checking if an object only contains all of the provided values. + * + * @param {Array.<*>} values + */ + toContainAllValues(values: any[]): void; + + /** + * Use `.toContainAnyValues` when checking if an object contains at least one of the provided values. + * + * @param {Array.<*>} values + */ + toContainAnyValues(values: any[]): void; + + /** + * Use `.toContainEntry` when checking if an object contains the provided entry. + * + * @param {Array.} entry + */ + toContainEntry(entry: [string, string]): void; + + /** + * Use `.toContainEntries` when checking if an object contains all of the provided entries. + * + * @param {Array.>} entries + */ + toContainEntries(entries: [string, string][]): void; + + /** + * Use `.toContainAllEntries` when checking if an object only contains all of the provided entries. + * + * @param {Array.>} entries + */ + toContainAllEntries(entries: [string, string][]): void; + + /** + * Use `.toContainAnyEntries` when checking if an object contains at least one of the provided entries. + * + * @param {Array.>} entries + */ + toContainAnyEntries(entries: [string, string][]): void; + + /** + * Use `.toBeExtensible` when checking if an object is extensible. + */ + toBeExtensible(): void; + + /** + * Use `.toBeFrozen` when checking if an object is frozen. + */ + toBeFrozen(): void; + + /** + * Use `.toBeSealed` when checking if an object is sealed. + */ + toBeSealed(): void; + + /** + * Use `.toBeString` when checking if a value is a `String`. + */ + toBeString(): void; + + /** + * Use `.toEqualCaseInsensitive` when checking if a string is equal (===) to another ignoring the casing of both strings. + * + * @param {String} string + */ + toEqualCaseInsensitive(string: string): void; + + /** + * Use `.toStartWith` when checking if a `String` starts with a given `String` prefix. + * + * @param {String} prefix + */ + toStartWith(prefix: string): void; + + /** + * Use `.toEndWith` when checking if a `String` ends with a given `String` suffix. + * + * @param {String} suffix + */ + toEndWith(suffix: string): void; + + /** + * Use `.toInclude` when checking if a `String` includes the given `String` substring. + * + * @param {String} substring + */ + toInclude(substring: string): void; + + /** + * Use `.toIncludeRepeated` when checking if a `String` includes the given `String` substring the correct number of times. + * + * @param {String} substring + * @param {Number} times + */ + toIncludeRepeated(substring: string, times: number): void; + + /** + * Use `.toIncludeMultiple` when checking if a `String` includes all of the given substrings. + * + * @param {Array.} substring + */ + toIncludeMultiple(substring: string[]): void; +}; + +interface JestExpectType { + not: + & JestExpectType + & EnzymeMatchersType + & DomTestingLibraryType + & JestJQueryMatchersType + & JestStyledComponentsMatchersType + & JestExtendedMatchersType, + /** + * If you have a mock function, you can use .lastCalledWith to test what + * arguments it was last called with. + */ + lastCalledWith(...args: Array): void, + /** + * toBe just checks that a value is what you expect. It uses === to check + * strict equality. + */ + toBe(value: any): void, + /** + * Use .toBeCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toBeCalledWith(...args: Array): void, + /** + * Using exact equality with floating point numbers is a bad idea. Rounding + * means that intuitive things fail. + */ + toBeCloseTo(num: number, delta: any): void, + /** + * Use .toBeDefined to check that a variable is not undefined. + */ + toBeDefined(): void, + /** + * Use .toBeFalsy when you don't care what a value is, you just want to + * ensure a value is false in a boolean context. + */ + toBeFalsy(): void, + /** + * To compare floating point numbers, you can use toBeGreaterThan. + */ + toBeGreaterThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeGreaterThanOrEqual. + */ + toBeGreaterThanOrEqual(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThan. + */ + toBeLessThan(number: number): void, + /** + * To compare floating point numbers, you can use toBeLessThanOrEqual. + */ + toBeLessThanOrEqual(number: number): void, + /** + * Use .toBeInstanceOf(Class) to check that an object is an instance of a + * class. + */ + toBeInstanceOf(cls: Class<*>): void, + /** + * .toBeNull() is the same as .toBe(null) but the error messages are a bit + * nicer. + */ + toBeNull(): void, + /** + * Use .toBeTruthy when you don't care what a value is, you just want to + * ensure a value is true in a boolean context. + */ + toBeTruthy(): void, + /** + * Use .toBeUndefined to check that a variable is undefined. + */ + toBeUndefined(): void, + /** + * Use .toContain when you want to check that an item is in a list. For + * testing the items in the list, this uses ===, a strict equality check. + */ + toContain(item: any): void, + /** + * Use .toContainEqual when you want to check that an item is in a list. For + * testing the items in the list, this matcher recursively checks the + * equality of all fields, rather than checking for object identity. + */ + toContainEqual(item: any): void, + /** + * Use .toEqual when you want to check that two objects have the same value. + * This matcher recursively checks the equality of all fields, rather than + * checking for object identity. + */ + toEqual(value: any): void, + /** + * Use .toHaveBeenCalled to ensure that a mock function got called. + */ + toHaveBeenCalled(): void, + toBeCalled(): void; + /** + * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact + * number of times. + */ + toHaveBeenCalledTimes(number: number): void, + toBeCalledTimes(number: number): void; + /** + * + */ + toHaveBeenNthCalledWith(nthCall: number, ...args: Array): void; + nthCalledWith(nthCall: number, ...args: Array): void; + /** + * + */ + toHaveReturned(): void; + toReturn(): void; + /** + * + */ + toHaveReturnedTimes(number: number): void; + toReturnTimes(number: number): void; + /** + * + */ + toHaveReturnedWith(value: any): void; + toReturnWith(value: any): void; + /** + * + */ + toHaveLastReturnedWith(value: any): void; + lastReturnedWith(value: any): void; + /** + * + */ + toHaveNthReturnedWith(nthCall: number, value: any): void; + nthReturnedWith(nthCall: number, value: any): void; + /** + * Use .toHaveBeenCalledWith to ensure that a mock function was called with + * specific arguments. + */ + toHaveBeenCalledWith(...args: Array): void, + toBeCalledWith(...args: Array): void, + /** + * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called + * with specific arguments. + */ + toHaveBeenLastCalledWith(...args: Array): void, + lastCalledWith(...args: Array): void, + /** + * Check that an object has a .length property and it is set to a certain + * numeric value. + */ + toHaveLength(number: number): void, + /** + * + */ + toHaveProperty(propPath: string, value?: any): void, + /** + * Use .toMatch to check that a string matches a regular expression or string. + */ + toMatch(regexpOrString: RegExp | string): void, + /** + * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object. + */ + toMatchObject(object: Object | Array): void, + /** + * Use .toStrictEqual to check that a javascript object matches a subset of the properties of an object. + */ + toStrictEqual(value: any): void, + /** + * This ensures that an Object matches the most recent snapshot. + */ + toMatchSnapshot(propertyMatchers?: {[key: string]: JestAsymmetricEqualityType}, name?: string): void, + /** + * This ensures that an Object matches the most recent snapshot. + */ + toMatchSnapshot(name: string): void, + + toMatchInlineSnapshot(snapshot?: string): void, + toMatchInlineSnapshot(propertyMatchers?: {[key: string]: JestAsymmetricEqualityType}, snapshot?: string): void, + /** + * Use .toThrow to test that a function throws when it is called. + * If you want to test that a specific error gets thrown, you can provide an + * argument to toThrow. The argument can be a string for the error message, + * a class for the error, or a regex that should match the error. + * + * Alias: .toThrowError + */ + toThrow(message?: string | Error | Class | RegExp): void, + toThrowError(message?: string | Error | Class | RegExp): void, + /** + * Use .toThrowErrorMatchingSnapshot to test that a function throws a error + * matching the most recent snapshot when it is called. + */ + toThrowErrorMatchingSnapshot(): void, + toThrowErrorMatchingInlineSnapshot(snapshot?: string): void, +} + +type JestObjectType = { + /** + * Disables automatic mocking in the module loader. + * + * After this method is called, all `require()`s will return the real + * versions of each module (rather than a mocked version). + */ + disableAutomock(): JestObjectType, + /** + * An un-hoisted version of disableAutomock + */ + autoMockOff(): JestObjectType, + /** + * Enables automatic mocking in the module loader. + */ + enableAutomock(): JestObjectType, + /** + * An un-hoisted version of enableAutomock + */ + autoMockOn(): JestObjectType, + /** + * Clears the mock.calls and mock.instances properties of all mocks. + * Equivalent to calling .mockClear() on every mocked function. + */ + clearAllMocks(): JestObjectType, + /** + * Resets the state of all mocks. Equivalent to calling .mockReset() on every + * mocked function. + */ + resetAllMocks(): JestObjectType, + /** + * Restores all mocks back to their original value. + */ + restoreAllMocks(): JestObjectType, + /** + * Removes any pending timers from the timer system. + */ + clearAllTimers(): void, + /** + * The same as `mock` but not moved to the top of the expectation by + * babel-jest. + */ + doMock(moduleName: string, moduleFactory?: any): JestObjectType, + /** + * The same as `unmock` but not moved to the top of the expectation by + * babel-jest. + */ + dontMock(moduleName: string): JestObjectType, + /** + * Returns a new, unused mock function. Optionally takes a mock + * implementation. + */ + fn, TReturn>( + implementation?: (...args: TArguments) => TReturn + ): JestMockFn, + /** + * Determines if the given function is a mocked function. + */ + isMockFunction(fn: Function): boolean, + /** + * Given the name of a module, use the automatic mocking system to generate a + * mocked version of the module for you. + */ + genMockFromModule(moduleName: string): any, + /** + * Mocks a module with an auto-mocked version when it is being required. + * + * The second argument can be used to specify an explicit module factory that + * is being run instead of using Jest's automocking feature. + * + * The third argument can be used to create virtual mocks -- mocks of modules + * that don't exist anywhere in the system. + */ + mock( + moduleName: string, + moduleFactory?: any, + options?: Object + ): JestObjectType, + /** + * Returns the actual module instead of a mock, bypassing all checks on + * whether the module should receive a mock implementation or not. + */ + requireActual(moduleName: string): any, + /** + * Returns a mock module instead of the actual module, bypassing all checks + * on whether the module should be required normally or not. + */ + requireMock(moduleName: string): any, + /** + * Resets the module registry - the cache of all required modules. This is + * useful to isolate modules where local state might conflict between tests. + */ + resetModules(): JestObjectType, + /** + * Exhausts the micro-task queue (usually interfaced in node via + * process.nextTick). + */ + runAllTicks(): void, + /** + * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(), + * setInterval(), and setImmediate()). + */ + runAllTimers(): void, + /** + * Exhausts all tasks queued by setImmediate(). + */ + runAllImmediates(): void, + /** + * Executes only the macro task queue (i.e. all tasks queued by setTimeout() + * or setInterval() and setImmediate()). + */ + advanceTimersByTime(msToRun: number): void, + /** + * Executes only the macro task queue (i.e. all tasks queued by setTimeout() + * or setInterval() and setImmediate()). + * + * Renamed to `advanceTimersByTime`. + */ + runTimersToTime(msToRun: number): void, + /** + * Executes only the macro-tasks that are currently pending (i.e., only the + * tasks that have been queued by setTimeout() or setInterval() up to this + * point) + */ + runOnlyPendingTimers(): void, + /** + * Explicitly supplies the mock object that the module system should return + * for the specified module. Note: It is recommended to use jest.mock() + * instead. + */ + setMock(moduleName: string, moduleExports: any): JestObjectType, + /** + * Indicates that the module system should never return a mocked version of + * the specified module from require() (e.g. that it should always return the + * real module). + */ + unmock(moduleName: string): JestObjectType, + /** + * Instructs Jest to use fake versions of the standard timer functions + * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick, + * setImmediate and clearImmediate). + */ + useFakeTimers(): JestObjectType, + /** + * Instructs Jest to use the real versions of the standard timer functions. + */ + useRealTimers(): JestObjectType, + /** + * Creates a mock function similar to jest.fn but also tracks calls to + * object[methodName]. + */ + spyOn(object: Object, methodName: string, accessType?: "get" | "set"): JestMockFn, + /** + * Set the default timeout interval for tests and before/after hooks in milliseconds. + * Note: The default timeout interval is 5 seconds if this method is not called. + */ + setTimeout(timeout: number): JestObjectType +}; + +type JestSpyType = { + calls: JestCallsType +}; + +/** Runs this function after every test inside this context */ +declare function afterEach( + fn: (done: () => void) => ?Promise, + timeout?: number +): void; +/** Runs this function before every test inside this context */ +declare function beforeEach( + fn: (done: () => void) => ?Promise, + timeout?: number +): void; +/** Runs this function after all tests have finished inside this context */ +declare function afterAll( + fn: (done: () => void) => ?Promise, + timeout?: number +): void; +/** Runs this function before any tests have started inside this context */ +declare function beforeAll( + fn: (done: () => void) => ?Promise, + timeout?: number +): void; + +/** A context for grouping tests together */ +declare var describe: { + /** + * Creates a block that groups together several related tests in one "test suite" + */ + (name: JestTestName, fn: () => void): void, + + /** + * Only run this describe block + */ + only(name: JestTestName, fn: () => void): void, + + /** + * Skip running this describe block + */ + skip(name: JestTestName, fn: () => void): void +}; + +/** An individual test unit */ +declare var it: { + /** + * An individual test unit + * + * @param {JestTestName} Name of Test + * @param {Function} Test + * @param {number} Timeout for the test, in milliseconds. + */ + ( + name: JestTestName, + fn?: (done: () => void) => ?Promise, + timeout?: number + ): void, + /** + * each runs this test against array of argument arrays per each run + * + * @param {table} table of Test + */ + each( + table: Array> + ): ( + name: JestTestName, + fn?: (...args: Array) => ?Promise + ) => void, + /** + * Only run this test + * + * @param {JestTestName} Name of Test + * @param {Function} Test + * @param {number} Timeout for the test, in milliseconds. + */ + only( + name: JestTestName, + fn?: (done: () => void) => ?Promise, + timeout?: number + ): { + each( + table: Array> + ): ( + name: JestTestName, + fn?: (...args: Array) => ?Promise + ) => void, + }, + /** + * Skip running this test + * + * @param {JestTestName} Name of Test + * @param {Function} Test + * @param {number} Timeout for the test, in milliseconds. + */ + skip( + name: JestTestName, + fn?: (done: () => void) => ?Promise, + timeout?: number + ): void, + /** + * Run the test concurrently + * + * @param {JestTestName} Name of Test + * @param {Function} Test + * @param {number} Timeout for the test, in milliseconds. + */ + concurrent( + name: JestTestName, + fn?: (done: () => void) => ?Promise, + timeout?: number + ): void +}; +declare function fit( + name: JestTestName, + fn: (done: () => void) => ?Promise, + timeout?: number +): void; +/** An individual test unit */ +declare var test: typeof it; +/** A disabled group of tests */ +declare var xdescribe: typeof describe; +/** A focused group of tests */ +declare var fdescribe: typeof describe; +/** A disabled individual test */ +declare var xit: typeof it; +/** A disabled individual test */ +declare var xtest: typeof it; + +type JestPrettyFormatColors = { + comment: { close: string, open: string }, + content: { close: string, open: string }, + prop: { close: string, open: string }, + tag: { close: string, open: string }, + value: { close: string, open: string }, +}; + +type JestPrettyFormatIndent = string => string; +type JestPrettyFormatRefs = Array; +type JestPrettyFormatPrint = any => string; +type JestPrettyFormatStringOrNull = string | null; + +type JestPrettyFormatOptions = {| + callToJSON: boolean, + edgeSpacing: string, + escapeRegex: boolean, + highlight: boolean, + indent: number, + maxDepth: number, + min: boolean, + plugins: JestPrettyFormatPlugins, + printFunctionName: boolean, + spacing: string, + theme: {| + comment: string, + content: string, + prop: string, + tag: string, + value: string, + |}, +|}; + +type JestPrettyFormatPlugin = { + print: ( + val: any, + serialize: JestPrettyFormatPrint, + indent: JestPrettyFormatIndent, + opts: JestPrettyFormatOptions, + colors: JestPrettyFormatColors, + ) => string, + test: any => boolean, +}; + +type JestPrettyFormatPlugins = Array; + +/** The expect function is used every time you want to test a value */ +declare var expect: { + /** The object that you want to make assertions against */ + (value: any): + & JestExpectType + & JestPromiseType + & EnzymeMatchersType + & DomTestingLibraryType + & JestJQueryMatchersType + & JestStyledComponentsMatchersType + & JestExtendedMatchersType, + + /** Add additional Jasmine matchers to Jest's roster */ + extend(matchers: { [name: string]: JestMatcher }): void, + /** Add a module that formats application-specific data structures. */ + addSnapshotSerializer(pluginModule: JestPrettyFormatPlugin): void, + assertions(expectedAssertions: number): void, + hasAssertions(): void, + any(value: mixed): JestAsymmetricEqualityType, + anything(): any, + arrayContaining(value: Array): Array, + objectContaining(value: Object): Object, + /** Matches any received string that contains the exact expected string. */ + stringContaining(value: string): string, + stringMatching(value: string | RegExp): string, + not: { + arrayContaining: (value: $ReadOnlyArray) => Array, + objectContaining: (value: {}) => Object, + stringContaining: (value: string) => string, + stringMatching: (value: string | RegExp) => string, + }, +}; + +// TODO handle return type +// http://jasmine.github.io/2.4/introduction.html#section-Spies +declare function spyOn(value: mixed, method: string): Object; + +/** Holds all functions related to manipulating test runner */ +declare var jest: JestObjectType; + +/** + * The global Jasmine object, this is generally not exposed as the public API, + * using features inside here could break in later versions of Jest. + */ +declare var jasmine: { + DEFAULT_TIMEOUT_INTERVAL: number, + any(value: mixed): JestAsymmetricEqualityType, + anything(): any, + arrayContaining(value: Array): Array, + clock(): JestClockType, + createSpy(name: string): JestSpyType, + createSpyObj( + baseName: string, + methodNames: Array + ): { [methodName: string]: JestSpyType }, + objectContaining(value: Object): Object, + stringMatching(value: string): string +}; diff --git a/plugins/auth-memory/package.json b/plugins/auth-memory/package.json index fc6c7e41..d1ebf071 100644 --- a/plugins/auth-memory/package.json +++ b/plugins/auth-memory/package.json @@ -6,30 +6,36 @@ "author": "Verdaccio community ", "repository": { "type": "git", - "url": "git://github.com/dgaya/sinopia-memory.git" + "url": "git://github.com/verdaccio/verdaccio-auth-memory.git" }, "devDependencies": { - "@commitlint/cli": "7.0.0", - "@commitlint/config-conventional": "7.0.1", - "@verdaccio/types": "3.4.1", + "@commitlint/cli": "7.2.0", + "@commitlint/config-conventional": "7.1.2", + "@commitlint/travis-cli": "7.2.0", + "@verdaccio/types": "4.1.1", "babel-cli": "6.26.0", "babel-core": "6.26.3", "babel-eslint": "8.2.6", - "babel-jest": "23.4.0", + "babel-jest": "23.6.0", "babel-plugin-flow-runtime": "0.17.0", + "babel-plugin-transform-async-to-generator": "6.24.1", "babel-preset-env": "1.7.0", "babel-preset-flow": "6.23.0", "codecov": "3.0.4", "cross-env": "5.2.0", - "eslint": "5.2.0", - "eslint-config-prettier": "2.9.0", - "eslint-plugin-prettier": "2.6.2", - "flow-bin": "0.77.0", + "eslint": "5.6.1", + "eslint-config-google": "0.10.0", + "eslint-config-prettier": "3.1.0", + "eslint-plugin-flowtype": "2.50.3", + "eslint-plugin-jest": "21.24.1", + "eslint-plugin-prettier": "3.0.0", + "flow-bin": "0.82.0", + "flow-runtime": "0.17.0", "husky": "0.14.3", - "in-publish": "2.0.0", - "jest": "23.4.1", + "jest": "23.6.0", "lint-staged": "7.2.0", - "prettier": "1.13.7" + "prettier": "1.14.3", + "standard-version": "4.4.0" }, "keywords": [ "verdaccio", @@ -37,9 +43,6 @@ "plugin", "memory" ], - "publishConfig": { - "registry": "https://registry.npmjs.org/" - }, "license": "MIT", "bugs": { "url": "https://github.com/verdaccio/verdaccio-auth-memory/issues" @@ -52,14 +55,19 @@ }, "homepage": "https://github.com/verdaccio/verdaccio-auth-memory", "scripts": { - "commitmsg": "commitlint -e $GIT_PARAMS", - "coverage": "codecov", + "release": "standard-version -a -s", + "pretest": "npm run lint", "test": "jest", - "lint": "npm run flow && npm run js-lint", - "js-lint": "eslint .", - "flow": "flow", - "build": "babel src/ --out-dir lib/ --copy-files --ignore ___tests___", "precommit": "lint-staged", - "prepublish": "in-publish && npm run lint && npm run build || not-in-publish" + "format": "prettier --single-quote --trailing-comma none --write \"{src,test}/**/*.js\"", + "lint": "npm run flow && eslint .", + "flow": "flow", + "prepublish": "npm run build", + "coverage": "codecov", + "commitmsg": "commitlint -e $GIT_PARAMS", + "build": "babel src/ --out-dir lib/ --copy-files" + }, + "dependencies": { + "http-errors": "1.7.1" } } diff --git a/plugins/auth-memory/src/Memory.js b/plugins/auth-memory/src/Memory.js new file mode 100644 index 00000000..3888cb3c --- /dev/null +++ b/plugins/auth-memory/src/Memory.js @@ -0,0 +1,110 @@ +// @flow + +import type { Callback, PackageAccess, IPluginAuth, RemoteUser, Logger } from '@verdaccio/types'; +import type { VerdaccioMemoryConfig, Users, UserMemory } from '../types'; + +import httpError from 'http-errors'; + +export default class Memory implements IPluginAuth { + _logger: Logger; + _users: Users; + _config: {}; + _app_config: any; + + constructor(config: VerdaccioMemoryConfig, appOptions: any) { + this._users = appOptions.users || {}; + this._config = config; + this._logger = appOptions.logger; + this._app_config = appOptions.config; + } + + authenticate(user: string, password: string, done: Callback) { + const userCredentials = this._users[user]; + + if (!userCredentials) { + return done(null, false); + } + + if (password !== userCredentials.password) { + const err = httpError(401, "i don't like your password"); + + return done(err); + } + + // authentication succeeded! + // return all usergroups this user has access to; + return done(null, [user]); + } + + adduser(user: string, password: string, done: Callback) { + if (this._users[user]) { + return done(null, true); + } + + if (this._app_config.max_users) { + if (Object.keys(this._users).length >= this._app_config.max_users) { + const err = httpError(409, 'maximum amount of users reached'); + + return done(err); + } + } + + this._users[user] = { name: user, password: password }; + + done(null, user); + } + + changePassword(username: string, password: string, newPassword: string, cb: Callback) { + const user: UserMemory = this._users[username]; + + if (user && user.password === password) { + user.password = newPassword; + this._users[username] = user; + + cb(null, user); + } else { + const err = httpError(404, 'user not found'); + + return cb(err); + } + } + + allow_access(user: RemoteUser, pkg: PackageAccess, cb: Callback) { + if (pkg.access.includes('$all') || pkg.access.includes('$anonymous')) { + return cb(null, true); + } + + if (!user.name) { + const err = httpError(403, 'not allowed to access package'); + return cb(err); + } + + if (pkg.access.includes(user.name) || pkg.access.includes('$authenticated')) { + return cb(null, true); + } + + const err = httpError(403, 'not allowed to access package'); + + return cb(err); + } + + allow_publish(user: RemoteUser, pkg: PackageAccess, cb: Callback) { + if (pkg.publish.includes('$all') || pkg.publish.includes('$anonymous')) { + return cb(null, true); + } + + if (!user.name) { + const err = httpError(403, 'not allowed to publish package'); + + return cb(err); + } + + if (pkg.publish.includes(user.name) || pkg.publish.includes('$authenticated')) { + return cb(null, true); + } + + const err = httpError(403, 'not allowed to publish package'); + + return cb(err); + } +} diff --git a/plugins/auth-memory/src/__tests__/test.js b/plugins/auth-memory/src/__tests__/test.js deleted file mode 100644 index 657fc89b..00000000 --- a/plugins/auth-memory/src/__tests__/test.js +++ /dev/null @@ -1,183 +0,0 @@ -import Memory from '../index'; - -describe('Memory Auth', function() { - describe('add_user', () => { - it('should adds users with default configurartion', done => { - const auth = new Memory({}, {}); - auth.adduser('test', 'secret', (error, user) => { - expect(error).toBeNull(); - expect(user).toEqual('test'); - done(); - }); - }); - it('checks if user already exists', done => { - const config = { - users: { - test: { - password: 'xxxx-yyyy-zzzz' - } - } - }; - - const appConfig = { - max_users: 2 - }; - const auth = new Memory(config, appConfig); - auth.adduser('test', 'secret', (err, user) => { - expect(err).toBeNull(); - expect(user).toBeTruthy(); - done(); - }); - }); - it('checks max_user limit', done => { - const config = { users: { test: { password: 'xxxx-yyyy-zzzz' } } }; - const appConfig = { max_users: 1 }; - const auth = new Memory(config, appConfig); - auth.adduser('sam', 'secret', (error, user) => { - expect(error.message).toEqual('maximum amount of users reached'); - expect(error.status).toEqual(409); - expect(user).toBeUndefined(); - done(); - }); - }); - }); - - describe('authenticate', () => { - let auth = new Memory({}, {}); - beforeEach(done => { - auth.adduser('test', 'secret', () => { - done(); - }); - }); - it('validates existing users', done => { - auth.authenticate('test', 'secret', (error, groups) => { - expect(error).toBeNull(); - expect(groups).toEqual(['test']); - done(); - }); - }); - it('fails if wrong password', done => { - auth.authenticate('test', 'wrongpassword', (error, user) => { - expect(user).toBeUndefined(); - expect(error.message).toEqual('Unauthorized access'); - expect(error.status).toEqual(401); - done(); - }); - }); - it('fails if user does not exist', done => { - auth.authenticate('test12', 'wrongpassword', (error, user) => { - expect(user).toBeFalsy(); - expect(error).toBeNull(); - done(); - }); - }); - }); - - describe('allow_access', () => { - let auth = new Memory({}, {}); - it('allows access for $all', done => { - const pkg = { - access: '$all' - }; - auth.allow_access({}, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows access for $anonymous', done => { - const pkg = { access: '$anonymous' }; - auth.allow_access({}, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows access for specified user', done => { - const pkg = { access: 'verdaccioNpm' }; - auth.allow_access({ name: 'verdaccioNpm' }, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows access for authenticated user', done => { - const pkg = { access: '$authenticated' }; - auth.allow_access({ name: 'verdaccioNpm' }, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows access for specified user but user not available', done => { - const pkg = { access: 'verdaccioNpm' }; - auth.allow_access({}, pkg, (error, permission) => { - expect(error.message).toEqual('not allowed to access package'); - expect(permission).toBeUndefined(); - done(); - }); - }); - it('allows access for someuser but other user is trying to access', done => { - const pkg = { access: 'verdaccioNpm' }; - const user = { name: 'otherVerdaccioNpm' }; - auth.allow_access(user, pkg, (error, permission) => { - expect(error.message).toEqual('not allowed to access package'); - expect(permission).toBeUndefined(); - done(); - }); - }); - }); - - describe('allow_publish', () => { - let auth = new Memory({}, {}); - it('allows publish for $all', done => { - const pkg = { publish: '$all' }; - auth.allow_publish({}, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows publish for $anonymous', done => { - const pkg = { publish: '$anonymous' }; - auth.allow_publish({}, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows publish for specified user', done => { - const pkg = { publish: 'verdaccioNpm' }; - auth.allow_publish({ name: 'verdaccioNpm' }, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows publish for authenticated user', done => { - const pkg = { publish: '$authenticated' }; - auth.allow_publish({ name: 'verdaccioNpm' }, pkg, (error, permission) => { - expect(error).toBeNull(); - expect(permission).toBeTruthy(); - done(); - }); - }); - it('allows publish for specified user but user not available', done => { - const pkg = { publish: 'verdaccioNpm' }; - auth.allow_publish({}, pkg, (error, permission) => { - expect(error.message).toEqual('not allowed to publish package'); - expect(permission).toBeUndefined(); - done(); - }); - }); - it('allows publish for someuser but other user is trying to publish', done => { - const pkg = { publish: 'verdaccioNpm' }; - const user = { name: 'otherVerdaccioNpm' }; - auth.allow_publish(user, pkg, (error, permission) => { - expect(error.message).toEqual('not allowed to publish package'); - expect(permission).toBeUndefined(); - done(); - }); - }); - }); -}); diff --git a/plugins/auth-memory/src/index.js b/plugins/auth-memory/src/index.js index 4acb9821..0e8e0511 100644 --- a/plugins/auth-memory/src/index.js +++ b/plugins/auth-memory/src/index.js @@ -1,124 +1,8 @@ // @flow -import type { RemoteUser, Callback, PackageAccess } from '@verdaccio/types'; -import type { verdaccioConfigAuthMemory, VerdaccioConfigApp } from '../types'; -/** - * Verdaccio auth memory - */ -export default class Memory { - // flow types - config: Object; - verdaccioConfig: Object; - users: Object; - max_users: number; - constructor( - config: verdaccioConfigAuthMemory, - verdaccioConfig: VerdaccioConfigApp - ) { - this.config = config; - this.verdaccioConfig = verdaccioConfig; - this.users = config.users || {}; - this.max_users = verdaccioConfig.max_users || Infinity; - } - authenticate(user: string, password: string, done: Callback): Callback { - const { users } = this; - const userCredentials = users[user]; +import Memory from './Memory'; +import type { VerdaccioMemoryConfig } from '../types'; - if (!userCredentials) { - return done(null, false); - } - - if (password !== userCredentials.password) { - const error = Error('Unauthorized access'); - // $FlowFixMe - error.status = 401; - return done(error); - } - - // authentication succeeded! - // return all usergroups this user has access to; - return done(null, [user]); - } - - adduser(user: RemoteUser, password: string, done: Callback): Callback { - const { users, max_users } = this; - if (users[user]) { - return done(null, true); - } - - if (max_users && Object.keys(users).length >= max_users) { - let error = Error('maximum amount of users reached'); - // $FlowFixMe - error.status = 409; - return done(error); - } - - this.users[user] = { name: user, password }; - - return done(null, user); - } - - allow_access(user: RemoteUser, pkg: PackageAccess, done: Callback): Callback { - if ( - String(pkg.access).includes('$all') || - String(pkg.access).includes('$anonymous') - ) { - return done(null, true); - } - - const { name } = user; - - if (!name) { - const error = Error('not allowed to access package'); - // $FlowFixMe - error.status = 403; - return done(error); - } - - if ( - String(pkg.access).includes(name) || - String(pkg.access).includes('$authenticated') - ) { - return done(null, true); - } - - const error = Error('not allowed to access package'); - // $FlowFixMe - error.status = 403; - return done(error); - } - - allow_publish( - user: RemoteUser, - pkg: PackageAccess, - done: Callback - ): Callback { - if ( - String(pkg.publish).includes('$all') || - String(pkg.publish).includes('$anonymous') - ) { - return done(null, true); - } - - const { name } = user; - - if (!name) { - const error = Error('not allowed to publish package'); - // $FlowFixMe - error.status = 403; - return done(error); - } - - if ( - String(pkg.publish).includes(name) || - String(pkg.publish).includes('$authenticated') - ) { - return done(null, true); - } - - const error = Error('not allowed to publish package'); - // $FlowFixMe - error.status = 403; - return done(error); - } +export default function(config: VerdaccioMemoryConfig, stuff: any) { + return new Memory(config, stuff); } diff --git a/plugins/auth-memory/test/index.spec.js b/plugins/auth-memory/test/index.spec.js new file mode 100644 index 00000000..7998827f --- /dev/null +++ b/plugins/auth-memory/test/index.spec.js @@ -0,0 +1,274 @@ +// @flow + +import Memory from '../src/index'; +import type { Callback } from '@verdaccio/types'; + +describe('Memory', function() { + let auth; + let logger = { + child: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + fatal: jest.fn() + }; + + beforeEach(function() { + auth = new Memory( + // $FlowFixMe + {}, + { + config: {}, + logger + } + ); + }); + + describe('#adduser', function() { + test('adds users', function(done) { + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toEqual('test'); + done(); + }); + }); + + test('login existing users', function(done) { + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toEqual('test'); + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toBe(true); + done(); + }); + }); + }); + + test('max users reached', function(done) { + const auth = new Memory( + // $FlowFixMe + {}, + { + config: { + max_users: -1 + }, + logger + } + ); + auth.adduser('test', 'secret', function(err, user) { + expect(err).not.toBeNull(); + expect(err.message).toMatch(/maximum amount of users reached/); + done(); + }); + }); + }); + + describe('replace user', function() { + beforeAll(function(done) { + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + done(); + }); + }); + + test('replaces password', function(done) { + auth.adduser('test', 'new_secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toEqual('test'); + auth.authenticate('test', 'new_secret', function(err, groups) { + expect(err).toBeNull(); + done(); + }); + }); + }); + }); + + describe('#allow_access', function() { + beforeEach(function(done) { + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toBeTruthy(); + done(); + }); + }); + + const accessBy = (roles: Array, done: Callback) => { + auth.allow_access( + { + name: 'test', + groups: [], + real_groups: [] + }, + { access: roles, publish: [], proxy: [] }, + function(err, groups) { + expect(err).toBeNull(); + expect(groups).toBe(true); + done(); + } + ); + }; + + test('should be allowed to access as $all to the package', function(done) { + accessBy(['$all'], done); + }); + + test('should be allowed to access as $anonymous to the package', function(done) { + accessBy(['$anonymous'], done); + }); + + test('should be allowed to access as $authenticated to the package', function(done) { + accessBy(['$authenticated'], done); + }); + + test('should be allowed to access as test to the package', function(done) { + accessBy(['test'], done); + }); + + test('should not to be allowed to access any package', function(done) { + // $FlowFixMe + auth.allow_access({}, { access: [], publish: [], proxy: [], }, function(err, groups) { + expect(err).not.toBeNull(); + expect(err.message).toMatch(/not allowed to access package/); + done(); + }); + }); + + test('should not to be allowed to access the anyOtherUser package', function(done) { + // $FlowFixMe + auth.allow_access({}, { access: ['anyOtherUser'], publish: [], proxy: [], }, function(err, groups) { + expect(err).not.toBeNull(); + expect(err.message).toMatch(/not allowed to access package/); + done(); + }); + }); + }); + + describe('#allow_publish', function() { + beforeEach(function(done) { + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toBeTruthy(); + done(); + }); + }); + + const accessBy = (roles: Array, done: Callback) => { + auth.allow_publish( + { + name: 'test', + groups: [], + real_groups: [] + }, + { publish: roles, proxy: [], access: [] }, + function(err, groups) { + expect(err).toBeNull(); + expect(groups).toBe(true); + done(); + } + ); + }; + + test('should be allowed to access as $all to the package', function(done) { + accessBy(['$all'], done); + }); + + test('should be allowed to access as $anonymous to the package', function(done) { + accessBy(['$anonymous'], done); + }); + + test('should be allowed to access as $authenticated to the package', function(done) { + accessBy(['$authenticated'], done); + }); + + test('should be allowed to access as test to the package', function(done) { + accessBy(['test'], done); + }); + + test('should not to be allowed to access any package', function(done) { + // $FlowFixMe + auth.allow_publish({}, { publish: [], proxy: [], access: [] }, function(err, groups) { + expect(err).not.toBeNull(); + expect(err.message).toMatch(/not allowed to publish package/); + done(); + }); + }); + + test('should not to be allowed to access the anyOtherUser package', function(done) { + // $FlowFixMe + auth.allow_publish({}, { publish: ['anyOtherUser'], proxy: [], access: [] }, function(err, groups) { + expect(err).not.toBeNull(); + expect(err.message).toMatch(/not allowed to publish package/); + done(); + }); + }); + }); + + describe('#changePassword', function() { + let auth; + + beforeEach(function(done) { + auth = new Memory( + // $FlowFixMe + {}, + { + config: {}, + logger + } + ); + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toBeTruthy(); + done(); + }); + }); + + test('should change password', function(done) { + auth.changePassword('test', 'secret', 'newSecret', function(err, user) { + expect(err).toBeNull(); + expect(user.password).toEqual('newSecret'); + done(); + }); + }); + + test('should fail change password with user not found', function(done) { + auth.changePassword('NOTFOUND', 'secret', 'newSecret', function(err, user) { + expect(err).not.toBeNull(); + expect(err.message).toMatch(/user not found/); + done(); + }); + }); + }); + + describe('#authenticate', function() { + beforeEach(function(done) { + auth.adduser('test', 'secret', function(err, user) { + expect(err).toBeNull(); + expect(user).toBeTruthy(); + done(); + }); + }); + + test('validates existing users', function(done) { + auth.authenticate('test', 'secret', function(err, groups) { + expect(err).toBeNull(); + expect(groups).toBeDefined(); + done(); + }); + }); + + test('fails if wrong password', function(done) { + auth.authenticate('test', 'no-secret', function(err, groups) { + expect(err).not.toBeNull(); + done(); + }); + }); + + test('fails if user doesnt exist', function(done) { + auth.authenticate('john', 'secret', function(err, groups) { + expect(err).toBeNull(); + expect(groups).toBeFalsy(); + done(); + }); + }); + }); +}); diff --git a/plugins/auth-memory/types/index.js b/plugins/auth-memory/types/index.js index e7c75792..d2323e54 100644 --- a/plugins/auth-memory/types/index.js +++ b/plugins/auth-memory/types/index.js @@ -1,14 +1,17 @@ +// @flow + import type { Config } from '@verdaccio/types'; -export interface VerdaccioConfigAuthMemory extends Config { - [users: string]: { - [name: string]: { - name: string, - password: string - } - }; -} +export type UserMemory = { + name: string, + password: string +}; + +export type Users = { + [key: string]: UserMemory +}; -export interface VerdaccioConfigApp extends Config { - max_users: number; +export interface VerdaccioMemoryConfig extends Config { + max_users?: number; + users: Users; } diff --git a/plugins/auth-memory/yarn.lock b/plugins/auth-memory/yarn.lock index 4262eeb6..32917716 100644 --- a/plugins/auth-memory/yarn.lock +++ b/plugins/auth-memory/yarn.lock @@ -8,6 +8,12 @@ dependencies: "@babel/highlight" "7.0.0-beta.44" +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + dependencies: + "@babel/highlight" "^7.0.0" + "@babel/code-frame@^7.0.0-beta.35": version "7.0.0-beta.54" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.54.tgz#0024f96fdf7028a21d68e273afd4e953214a1ead" @@ -60,6 +66,14 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" @@ -92,28 +106,28 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" -"@commitlint/cli@7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-7.0.0.tgz#3bf86d8ab2fbd5074c3114b7ba3f4b41b775f3dc" +"@commitlint/cli@7.2.0", "@commitlint/cli@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-7.2.0.tgz#04fb5ba1d28bba100a7f71d51d35aa9a8fd5faba" dependencies: - "@commitlint/format" "^7.0.0" - "@commitlint/lint" "^7.0.0" - "@commitlint/load" "^7.0.0" - "@commitlint/read" "^7.0.0" + "@commitlint/format" "^7.2.0" + "@commitlint/lint" "^7.2.0" + "@commitlint/load" "^7.2.0" + "@commitlint/read" "^7.1.2" babel-polyfill "6.26.0" chalk "2.3.1" get-stdin "5.0.1" lodash.merge "4.6.1" lodash.pick "4.4.0" - meow "^5.0.0" + meow "5.0.0" -"@commitlint/config-conventional@7.0.1": - version "7.0.1" - resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-7.0.1.tgz#276977f8ee60d8c56d7fdd43296af76dfee9b5f7" +"@commitlint/config-conventional@7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-7.1.2.tgz#5b5e45924c9abd8f9a8d83eb1f66e24e5f66916f" -"@commitlint/ensure@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-7.0.0.tgz#3d5210bb988416844926895a782a55815731779d" +"@commitlint/ensure@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-7.2.0.tgz#03cfab7135f57f62b73698f441a516886a84a1f6" dependencies: lodash.camelcase "4.3.0" lodash.kebabcase "4.1.1" @@ -121,41 +135,41 @@ lodash.startcase "4.4.0" lodash.upperfirst "4.3.1" -"@commitlint/execute-rule@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-7.0.0.tgz#cbc65314fa9ebb9cd2c5b8cdd4dca6185b3aca4c" +"@commitlint/execute-rule@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-7.1.2.tgz#b504e800c5f7c0fbfa24a261b04c549aa2726254" dependencies: babel-runtime "6.26.0" -"@commitlint/format@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/format/-/format-7.0.0.tgz#3be1fdf0c3c41feb98e275b4f605c598c509b920" +"@commitlint/format@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/format/-/format-7.2.0.tgz#7eeec3543ed2754a2fc4c21c46da540b7232ec2e" dependencies: babel-runtime "^6.23.0" chalk "^2.0.1" -"@commitlint/is-ignored@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-7.0.0.tgz#d328a2976274c9f106e319b1cac75dd848360fc9" +"@commitlint/is-ignored@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-7.2.0.tgz#483beee993997f3cefc2120e1e2f029e113bee48" dependencies: semver "5.5.0" -"@commitlint/lint@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-7.0.0.tgz#aede9e15f551b822af7d9da55df4881ad38390d9" +"@commitlint/lint@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-7.2.0.tgz#2ef51c32b6cea4aba0d6d88768375ca641882f38" dependencies: - "@commitlint/is-ignored" "^7.0.0" - "@commitlint/parse" "^7.0.0" - "@commitlint/rules" "^7.0.0" + "@commitlint/is-ignored" "^7.2.0" + "@commitlint/parse" "^7.1.2" + "@commitlint/rules" "^7.2.0" babel-runtime "^6.23.0" lodash.topairs "4.3.0" -"@commitlint/load@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-7.0.0.tgz#d924f4c5c06d8845b16a50b563829a7fffa230a8" +"@commitlint/load@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/load/-/load-7.2.0.tgz#b8428ac8cbcd4984666a238f8a7bd25195bab017" dependencies: - "@commitlint/execute-rule" "^7.0.0" - "@commitlint/resolve-extends" "^7.0.0" + "@commitlint/execute-rule" "^7.1.2" + "@commitlint/resolve-extends" "^7.1.2" babel-runtime "^6.23.0" cosmiconfig "^4.0.0" lodash.merge "4.6.1" @@ -164,29 +178,29 @@ lodash.topairs "4.3.0" resolve-from "4.0.0" -"@commitlint/message@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/message/-/message-7.0.0.tgz#6fb22563e31901ff5da4391db1346fda7115fa53" +"@commitlint/message@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/message/-/message-7.1.2.tgz#b8e7ed3914896f8490b5897c4f6b8923105b55fd" -"@commitlint/parse@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-7.0.0.tgz#ed024cc4d8f0874421a8dd6d16674233b68592d4" +"@commitlint/parse@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-7.1.2.tgz#d63b246cebd5a2cf326b0356421f9ec5f227a2d4" dependencies: conventional-changelog-angular "^1.3.3" conventional-commits-parser "^2.1.0" -"@commitlint/read@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/read/-/read-7.0.0.tgz#c9bf222e37e04c33c1e25b498657fef68377e2c8" +"@commitlint/read@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/read/-/read-7.1.2.tgz#6a1fcb192e54e311eee280e5070627981d8d7bf3" dependencies: - "@commitlint/top-level" "^7.0.0" + "@commitlint/top-level" "^7.1.2" "@marionebl/sander" "^0.6.0" babel-runtime "^6.23.0" git-raw-commits "^1.3.0" -"@commitlint/resolve-extends@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-7.0.0.tgz#34937525ea3bc037365c530bce9b1c73ef4eb74d" +"@commitlint/resolve-extends@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-7.1.2.tgz#886f589f1c2ce87c42f2786696b68fac7e356978" dependencies: babel-runtime "6.26.0" lodash.merge "4.6.1" @@ -195,25 +209,33 @@ resolve-from "^4.0.0" resolve-global "^0.1.0" -"@commitlint/rules@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-7.0.0.tgz#9a710891c350c10d6f62debb820fee4fdef1e026" +"@commitlint/rules@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-7.2.0.tgz#44ab5dadead1668f6a2790fbdfe70e456346866c" dependencies: - "@commitlint/ensure" "^7.0.0" - "@commitlint/message" "^7.0.0" - "@commitlint/to-lines" "^7.0.0" + "@commitlint/ensure" "^7.2.0" + "@commitlint/message" "^7.1.2" + "@commitlint/to-lines" "^7.1.2" babel-runtime "^6.23.0" -"@commitlint/to-lines@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-7.0.0.tgz#adb229368e2b6c7a657c909754fb40ec47363ce2" +"@commitlint/to-lines@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-7.1.2.tgz#2277347e50eac2a8d38ab6ab2c70f01b84c5f115" -"@commitlint/top-level@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-7.0.0.tgz#ff28580ab8c1431290e37b1d507e0ef370c38d99" +"@commitlint/top-level@^7.1.2": + version "7.1.2" + resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-7.1.2.tgz#58f78043546bce0c1bfba36291bc4a812b6426b3" dependencies: find-up "^2.1.0" +"@commitlint/travis-cli@7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@commitlint/travis-cli/-/travis-cli-7.2.0.tgz#813103eb8182f67d18a0b5ce6e03d463548de2e3" + dependencies: + "@commitlint/cli" "^7.2.0" + babel-runtime "6.26.0" + execa "0.9.0" + "@marionebl/sander@^0.6.0": version "0.6.1" resolved "https://registry.npmjs.org/@marionebl/sander/-/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b" @@ -228,9 +250,9 @@ dependencies: any-observable "^0.3.0" -"@verdaccio/types@3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@verdaccio/types/-/types-3.4.1.tgz#be18fb695bcd014c94c89b7805ace36dc9da2636" +"@verdaccio/types@4.1.1": + version "4.1.1" + resolved "https://registry.npmjs.org/@verdaccio/types/-/types-4.1.1.tgz#21080670b54b50efd9857beb3955d4357e02aa82" JSONStream@^1.0.4: version "1.3.3" @@ -276,7 +298,7 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.0.1, ajv@^6.5.0: +ajv@^6.0.1: version "6.5.2" resolved "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" dependencies: @@ -285,6 +307,15 @@ ajv@^6.0.1, ajv@^6.5.0: json-schema-traverse "^0.4.1" uri-js "^4.2.1" +ajv@^6.5.3: + version "6.5.4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -452,7 +483,7 @@ async@^1.4.0: version "1.5.2" resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.4: +async@^2.1.4, async@^2.5.0: version "2.6.1" resolved "https://registry.npmjs.org/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" dependencies: @@ -652,9 +683,9 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-jest@23.4.0, babel-jest@^23.4.0: - version "23.4.0" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-23.4.0.tgz#22c34c392e2176f6a4c367992a7fcff69d2e8557" +babel-jest@23.6.0, babel-jest@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" dependencies: babel-plugin-istanbul "^4.1.6" babel-preset-jest "^23.2.0" @@ -715,7 +746,7 @@ babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" -babel-plugin-transform-async-to-generator@^6.22.0: +babel-plugin-transform-async-to-generator@6.24.1, babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" dependencies: @@ -1150,6 +1181,13 @@ callsites@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + camelcase-keys@^4.0.0: version "4.2.0" resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" @@ -1162,6 +1200,10 @@ camelcase@^1.0.2: version "1.2.1" resolved "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + camelcase@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" @@ -1217,9 +1259,9 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" chokidar@^1.6.1: version "1.7.0" @@ -1292,6 +1334,14 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^4.0.0: version "4.1.0" resolved "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -1344,6 +1394,10 @@ commander@^2.11.0, commander@^2.14.1, commander@^2.9.0: version "2.16.0" resolved "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + compare-func@^1.3.1: version "1.3.2" resolved "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" @@ -1363,18 +1417,136 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +concat-stream@^1.4.10: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -conventional-changelog-angular@^1.3.3: +conventional-changelog-angular@^1.3.3, conventional-changelog-angular@^1.6.6: version "1.6.6" resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" dependencies: compare-func "^1.3.1" q "^1.5.1" -conventional-commits-parser@^2.1.0: +conventional-changelog-atom@^0.2.8: + version "0.2.8" + resolved "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz#8037693455990e3256f297320a45fa47ee553a14" + dependencies: + q "^1.5.1" + +conventional-changelog-codemirror@^0.3.8: + version "0.3.8" + resolved "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz#a1982c8291f4ee4d6f2f62817c6b2ecd2c4b7b47" + dependencies: + q "^1.5.1" + +conventional-changelog-core@^2.0.11: + version "2.0.11" + resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz#19b5fbd55a9697773ed6661f4e32030ed7e30287" + dependencies: + conventional-changelog-writer "^3.0.9" + conventional-commits-parser "^2.1.7" + dateformat "^3.0.0" + get-pkg-repo "^1.0.0" + git-raw-commits "^1.3.6" + git-remote-origin-url "^2.0.0" + git-semver-tags "^1.3.6" + lodash "^4.2.1" + normalize-package-data "^2.3.5" + q "^1.5.1" + read-pkg "^1.1.0" + read-pkg-up "^1.0.1" + through2 "^2.0.0" + +conventional-changelog-ember@^0.3.12: + version "0.3.12" + resolved "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz#b7d31851756d0fcb49b031dffeb6afa93b202400" + dependencies: + q "^1.5.1" + +conventional-changelog-eslint@^1.0.9: + version "1.0.9" + resolved "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz#b13cc7e4b472c819450ede031ff1a75c0e3d07d3" + dependencies: + q "^1.5.1" + +conventional-changelog-express@^0.3.6: + version "0.3.6" + resolved "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz#4a6295cb11785059fb09202180d0e59c358b9c2c" + dependencies: + q "^1.5.1" + +conventional-changelog-jquery@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" + dependencies: + q "^1.4.1" + +conventional-changelog-jscs@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" + dependencies: + q "^1.4.1" + +conventional-changelog-jshint@^0.3.8: + version "0.3.8" + resolved "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz#9051c1ac0767abaf62a31f74d2fe8790e8acc6c8" + dependencies: + compare-func "^1.3.1" + q "^1.5.1" + +conventional-changelog-preset-loader@^1.1.8: + version "1.1.8" + resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz#40bb0f142cd27d16839ec6c74ee8db418099b373" + +conventional-changelog-writer@^3.0.9: + version "3.0.9" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz#4aecdfef33ff2a53bb0cf3b8071ce21f0e994634" + dependencies: + compare-func "^1.3.1" + conventional-commits-filter "^1.1.6" + dateformat "^3.0.0" + handlebars "^4.0.2" + json-stringify-safe "^5.0.1" + lodash "^4.2.1" + meow "^4.0.0" + semver "^5.5.0" + split "^1.0.0" + through2 "^2.0.0" + +conventional-changelog@^1.1.0: + version "1.1.24" + resolved "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz#3d94c29c960f5261c002678315b756cdd3d7d1f0" + dependencies: + conventional-changelog-angular "^1.6.6" + conventional-changelog-atom "^0.2.8" + conventional-changelog-codemirror "^0.3.8" + conventional-changelog-core "^2.0.11" + conventional-changelog-ember "^0.3.12" + conventional-changelog-eslint "^1.0.9" + conventional-changelog-express "^0.3.6" + conventional-changelog-jquery "^0.1.0" + conventional-changelog-jscs "^0.1.0" + conventional-changelog-jshint "^0.3.8" + conventional-changelog-preset-loader "^1.1.8" + +conventional-commits-filter@^1.1.1, conventional-commits-filter@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz#4389cd8e58fe89750c0b5fb58f1d7f0cc8ad3831" + dependencies: + is-subset "^0.1.1" + modify-values "^1.0.0" + +conventional-commits-parser@^2.1.0, conventional-commits-parser@^2.1.1, conventional-commits-parser@^2.1.7: version "2.1.7" resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e" dependencies: @@ -1386,6 +1558,18 @@ conventional-commits-parser@^2.1.0: through2 "^2.0.0" trim-off-newlines "^1.0.0" +conventional-recommended-bump@^1.0.0: + version "1.2.1" + resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz#1b7137efb5091f99fe009e2fe9ddb7cc490e9375" + dependencies: + concat-stream "^1.4.10" + conventional-commits-filter "^1.1.1" + conventional-commits-parser "^2.1.1" + git-raw-commits "^1.3.0" + git-semver-tags "^1.3.0" + meow "^3.3.0" + object-assign "^4.0.1" + convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -1484,6 +1668,10 @@ date-fns@^1.27.2: version "1.29.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1496,6 +1684,12 @@ debug@^3.1.0: dependencies: ms "2.0.0" +debug@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz#f9bb36d439b8d1f0dd52d8fb6b46e4ebb8c1cd5b" + dependencies: + ms "^2.1.1" + decamelize-keys@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -1503,7 +1697,7 @@ decamelize-keys@^1.0.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1: +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1575,6 +1769,10 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -1611,6 +1809,13 @@ dot-prop@^3.0.0: dependencies: is-obj "^1.0.0" +dotgitignore@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/dotgitignore/-/dotgitignore-1.0.3.tgz#a442cbde7dc20dff51cdb849e4c5a64568c07923" + dependencies: + find-up "^2.1.0" + minimatch "^3.0.4" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1631,7 +1836,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.10.0, es-abstract@^1.5.1: +es-abstract@^1.5.1: version "1.12.0" resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -1664,18 +1869,31 @@ escodegen@^1.9.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz#5ecd65174d486c22dff389fe036febf502d468a3" +eslint-config-google@0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.10.0.tgz#09adb5b1514aa99618ad0515e0cce59b8ca82d90" + +eslint-config-prettier@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-3.1.0.tgz#2c26d2cdcfa3a05f0642cd7e6e4ef3316cdabfa2" dependencies: - get-stdin "^5.0.1" + get-stdin "^6.0.0" -eslint-plugin-prettier@2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.2.tgz#71998c60aedfa2141f7bfcbf9d1c459bf98b4fad" +eslint-plugin-flowtype@2.50.3: + version "2.50.3" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.3.tgz#61379d6dce1d010370acd6681740fd913d68175f" + dependencies: + lodash "^4.17.10" + +eslint-plugin-jest@21.24.1: + version "21.24.1" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-21.24.1.tgz#aaf3c34e816f07add83d1e9c20696fdc31fac8dc" + +eslint-plugin-prettier@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.0.tgz#f6b823e065f8c36529918cdb766d7a0e975ec30c" dependencies: - fast-diff "^1.1.1" - jest-docblock "^21.0.0" + prettier-linter-helpers "^1.0.0" eslint-scope@3.7.1: version "3.7.1" @@ -1699,15 +1917,15 @@ eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" -eslint@5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-5.2.0.tgz#3901ae249195d473e633c4acbc370068b1c964dc" +eslint@5.6.1: + version "5.6.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-5.6.1.tgz#348134e32ccc09abb2df1bf282b3f6eed8c7b480" dependencies: - ajv "^6.5.0" - babel-code-frame "^6.26.0" + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" chalk "^2.1.0" cross-spawn "^6.0.5" - debug "^3.1.0" + debug "^4.0.1" doctrine "^2.1.0" eslint-scope "^4.0.0" eslint-utils "^1.3.1" @@ -1719,11 +1937,11 @@ eslint@5.2.0: functional-red-black-tree "^1.0.1" glob "^7.1.2" globals "^11.7.0" - ignore "^4.0.2" + ignore "^4.0.6" imurmurhash "^0.1.4" - inquirer "^5.2.0" + inquirer "^6.1.0" is-resolvable "^1.1.0" - js-yaml "^3.11.0" + js-yaml "^3.12.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" lodash "^4.17.5" @@ -1734,10 +1952,9 @@ eslint@5.2.0: path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" - regexpp "^1.1.0" + regexpp "^2.0.0" require-uncached "^1.0.3" - semver "^5.5.0" - string.prototype.matchall "^2.0.0" + semver "^5.5.1" strip-ansi "^4.0.0" strip-json-comments "^2.0.1" table "^4.0.3" @@ -1784,9 +2001,9 @@ exec-sh@^0.2.0: dependencies: merge "^1.2.0" -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" +execa@0.9.0, execa@^0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -1796,9 +2013,9 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -1840,14 +2057,14 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^23.4.0: - version "23.4.0" - resolved "https://registry.npmjs.org/expect/-/expect-23.4.0.tgz#6da4ecc99c1471253e7288338983ad1ebadb60c3" +expect@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" dependencies: ansi-styles "^3.2.0" - jest-diff "^23.2.0" + jest-diff "^23.6.0" jest-get-type "^22.1.0" - jest-matcher-utils "^23.2.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" @@ -1868,12 +2085,12 @@ extend@~3.0.1: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" -external-editor@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" + chardet "^0.7.0" + iconv-lite "^0.4.24" tmp "^0.0.33" extglob@^0.3.1: @@ -1911,7 +2128,7 @@ fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" -fast-diff@^1.1.1: +fast-diff@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" @@ -1929,7 +2146,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -figures@^1.7.0: +figures@^1.5.0, figures@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" dependencies: @@ -2005,14 +2222,18 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -flow-bin@0.77.0: - version "0.77.0" - resolved "https://registry.npmjs.org/flow-bin/-/flow-bin-0.77.0.tgz#4e5c93929f289a0c28e08fb361a9734944a11297" +flow-bin@0.82.0: + version "0.82.0" + resolved "https://registry.npmjs.org/flow-bin/-/flow-bin-0.82.0.tgz#fbec84c0d6cab7877565eca8214d655f3aefb8db" flow-config-parser@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/flow-config-parser/-/flow-config-parser-0.3.0.tgz#704916efba88cd2518ab4d8f933079571276138f" +flow-runtime@0.17.0: + version "0.17.0" + resolved "https://registry.npmjs.org/flow-runtime/-/flow-runtime-0.17.0.tgz#ff57dd22bd7b0682c7beff20c3590f6a4a8286e3" + for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2045,6 +2266,12 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +fs-access@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + dependencies: + null-check "^1.0.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -2095,10 +2322,28 @@ get-own-enumerable-property-symbols@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" -get-stdin@5.0.1, get-stdin@^5.0.1: +get-pkg-repo@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" + dependencies: + hosted-git-info "^2.1.4" + meow "^3.3.0" + normalize-package-data "^2.3.0" + parse-github-repo-url "^1.3.0" + through2 "^2.0.0" + +get-stdin@5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -2113,7 +2358,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-raw-commits@^1.3.0: +git-raw-commits@^1.3.0, git-raw-commits@^1.3.6: version "1.3.6" resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff" dependencies: @@ -2123,6 +2368,26 @@ git-raw-commits@^1.3.0: split2 "^2.0.0" through2 "^2.0.0" +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^1.3.0, git-semver-tags@^1.3.6: + version "1.3.6" + resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz#357ea01f7280794fe0927f2806bee6414d2caba5" + dependencies: + meow "^4.0.0" + semver "^5.5.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + dependencies: + ini "^1.3.2" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -2180,6 +2445,16 @@ growly@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" +handlebars@^4.0.2: + version "4.0.12" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" + dependencies: + async "^2.5.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + handlebars@^4.0.3: version "4.0.11" resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" @@ -2215,10 +2490,6 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" -has-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2273,6 +2544,16 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +http-errors@1.7.1: + version "1.7.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.1.tgz#6a4ffe5d35188e1c39f872534690585852e1f027" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -2293,7 +2574,13 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@^0.4.17, iconv-lite@^0.4.4: +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: @@ -2305,9 +2592,9 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.2.tgz#0a8dd228947ec78c2d7f736b1642a9f7317c1905" +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" import-local@^1.0.0: version "1.0.0" @@ -2320,10 +2607,6 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -in-publish@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -2341,33 +2624,33 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -inquirer@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" +inquirer@^6.1.0: + version "6.2.0" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^2.1.0" + external-editor "^3.0.0" figures "^2.0.0" - lodash "^4.3.0" + lodash "^4.17.10" mute-stream "0.0.7" run-async "^2.2.0" - rxjs "^5.5.2" + rxjs "^6.1.0" string-width "^2.1.0" strip-ansi "^4.0.0" through "^2.3.6" -invariant@^2.2.0, invariant@^2.2.2: +invariant@^2.2.0, invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -2597,6 +2880,10 @@ is-stream@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-subset@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" + is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" @@ -2705,15 +2992,15 @@ istanbul-reports@^1.3.0: dependencies: handlebars "^4.0.3" -jest-changed-files@^23.4.0: - version "23.4.0" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.0.tgz#f1b304f98c235af5d9a31ec524262c5e4de3c6ff" +jest-changed-files@^23.4.2: + version "23.4.2" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83" dependencies: throat "^4.0.0" -jest-cli@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-23.4.1.tgz#c1ffd33254caee376990aa2abe2963e0de4ca76b" +jest-cli@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz#61ab917744338f443ef2baa282ddffdd658a5da4" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -2726,19 +3013,19 @@ jest-cli@^23.4.1: istanbul-lib-coverage "^1.2.0" istanbul-lib-instrument "^1.10.1" istanbul-lib-source-maps "^1.2.4" - jest-changed-files "^23.4.0" - jest-config "^23.4.1" + jest-changed-files "^23.4.2" + jest-config "^23.6.0" jest-environment-jsdom "^23.4.0" jest-get-type "^22.1.0" - jest-haste-map "^23.4.1" + jest-haste-map "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" - jest-resolve-dependencies "^23.4.1" - jest-runner "^23.4.1" - jest-runtime "^23.4.1" - jest-snapshot "^23.4.1" + jest-resolve-dependencies "^23.6.0" + jest-runner "^23.6.0" + jest-runtime "^23.6.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.4.0" + jest-validate "^23.6.0" jest-watcher "^23.4.0" jest-worker "^23.2.0" micromatch "^2.3.11" @@ -2752,36 +3039,33 @@ jest-cli@^23.4.1: which "^1.2.12" yargs "^11.0.0" -jest-config@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-23.4.1.tgz#3172fa21f0507d7f8a088ed1dbe4157057f201e9" +jest-config@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" dependencies: babel-core "^6.0.0" - babel-jest "^23.4.0" + babel-jest "^23.6.0" chalk "^2.0.1" glob "^7.1.1" jest-environment-jsdom "^23.4.0" jest-environment-node "^23.4.0" jest-get-type "^22.1.0" - jest-jasmine2 "^23.4.1" + jest-jasmine2 "^23.6.0" jest-regex-util "^23.3.0" - jest-resolve "^23.4.1" + jest-resolve "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.4.0" - pretty-format "^23.2.0" + jest-validate "^23.6.0" + micromatch "^2.3.11" + pretty-format "^23.6.0" -jest-diff@^23.2.0: - version "23.2.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-23.2.0.tgz#9f2cf4b51e12c791550200abc16b47130af1062a" +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^22.1.0" - pretty-format "^23.2.0" - -jest-docblock@^21.0.0: - version "21.2.0" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" + pretty-format "^23.6.0" jest-docblock@^23.2.0: version "23.2.0" @@ -2789,12 +3073,12 @@ jest-docblock@^23.2.0: dependencies: detect-newline "^2.1.0" -jest-each@^23.4.0: - version "23.4.0" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-23.4.0.tgz#2fa9edd89daa1a4edc9ff9bf6062a36b71345143" +jest-each@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" dependencies: chalk "^2.0.1" - pretty-format "^23.2.0" + pretty-format "^23.6.0" jest-environment-jsdom@^23.4.0: version "23.4.0" @@ -2815,47 +3099,49 @@ jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" -jest-haste-map@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.4.1.tgz#43a174ba7ac079ae1dd74eaf5a5fe78989474dd2" +jest-haste-map@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz#2e3eb997814ca696d62afdb3f2529f5bbc935e16" dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" + invariant "^2.2.4" jest-docblock "^23.2.0" jest-serializer "^23.0.1" jest-worker "^23.2.0" micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.4.1.tgz#fa192262430d418e827636e4a98423e5e7ff0fce" +jest-jasmine2@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" dependencies: + babel-traverse "^6.0.0" chalk "^2.0.1" co "^4.6.0" - expect "^23.4.0" + expect "^23.6.0" is-generator-fn "^1.0.0" - jest-diff "^23.2.0" - jest-each "^23.4.0" - jest-matcher-utils "^23.2.0" + jest-diff "^23.6.0" + jest-each "^23.6.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" - jest-snapshot "^23.4.1" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - pretty-format "^23.2.0" + pretty-format "^23.6.0" -jest-leak-detector@^23.2.0: - version "23.2.0" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.2.0.tgz#c289d961dc638f14357d4ef96e0431ecc1aa377d" +jest-leak-detector@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz#e4230fd42cf381a1a1971237ad56897de7e171de" dependencies: - pretty-format "^23.2.0" + pretty-format "^23.6.0" -jest-matcher-utils@^23.2.0: - version "23.2.0" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.2.0.tgz#4d4981f23213e939e3cedf23dc34c747b5ae1913" +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" - pretty-format "^23.2.0" + pretty-format "^23.6.0" jest-message-util@^23.4.0: version "23.4.0" @@ -2875,42 +3161,42 @@ jest-regex-util@^23.3.0: version "23.3.0" resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" -jest-resolve-dependencies@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.1.tgz#a1d85247e2963f8b3859f6b0ec61b741b359378e" +jest-resolve-dependencies@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz#b4526af24c8540d9a3fab102c15081cf509b723d" dependencies: jest-regex-util "^23.3.0" - jest-snapshot "^23.4.1" + jest-snapshot "^23.6.0" -jest-resolve@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.4.1.tgz#7f3c17104732a2c0c940a01256025ed745814982" +jest-resolve@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" dependencies: browser-resolve "^1.11.3" chalk "^2.0.1" realpath-native "^1.0.0" -jest-runner@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-23.4.1.tgz#d41fd1459b95d35d6df685f1468c09e617c8c260" +jest-runner@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz#3894bd219ffc3f3cb94dc48a4170a2e6f23a5a38" dependencies: exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^23.4.1" + jest-config "^23.6.0" jest-docblock "^23.2.0" - jest-haste-map "^23.4.1" - jest-jasmine2 "^23.4.1" - jest-leak-detector "^23.2.0" + jest-haste-map "^23.6.0" + jest-jasmine2 "^23.6.0" + jest-leak-detector "^23.6.0" jest-message-util "^23.4.0" - jest-runtime "^23.4.1" + jest-runtime "^23.6.0" jest-util "^23.4.0" jest-worker "^23.2.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.4.1.tgz#c1822eba5eb19294debe6b25b2760d0a8c532fd1" +jest-runtime@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz#059e58c8ab445917cd0e0d84ac2ba68de8f23082" dependencies: babel-core "^6.0.0" babel-plugin-istanbul "^4.1.6" @@ -2919,14 +3205,14 @@ jest-runtime@^23.4.1: exit "^0.1.2" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.1.11" - jest-config "^23.4.1" - jest-haste-map "^23.4.1" + jest-config "^23.6.0" + jest-haste-map "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" - jest-resolve "^23.4.1" - jest-snapshot "^23.4.1" + jest-resolve "^23.6.0" + jest-snapshot "^23.6.0" jest-util "^23.4.0" - jest-validate "^23.4.0" + jest-validate "^23.6.0" micromatch "^2.3.11" realpath-native "^1.0.0" slash "^1.0.0" @@ -2938,20 +3224,19 @@ jest-serializer@^23.0.1: version "23.0.1" resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165" -jest-snapshot@^23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.4.1.tgz#090de9acae927f6a3af3005bda40d912b83e9c96" +jest-snapshot@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" dependencies: - babel-traverse "^6.0.0" babel-types "^6.0.0" chalk "^2.0.1" - jest-diff "^23.2.0" - jest-matcher-utils "^23.2.0" + jest-diff "^23.6.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" - jest-resolve "^23.4.1" + jest-resolve "^23.6.0" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^23.2.0" + pretty-format "^23.6.0" semver "^5.5.0" jest-util@^23.4.0: @@ -2967,7 +3252,7 @@ jest-util@^23.4.0: slash "^1.0.0" source-map "^0.6.0" -jest-validate@^23.0.0, jest-validate@^23.4.0: +jest-validate@^23.0.0: version "23.4.0" resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-23.4.0.tgz#d96eede01ef03ac909c009e9c8e455197d48c201" dependencies: @@ -2976,6 +3261,15 @@ jest-validate@^23.0.0, jest-validate@^23.4.0: leven "^2.1.0" pretty-format "^23.2.0" +jest-validate@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^23.6.0" + jest-watcher@^23.4.0: version "23.4.0" resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz#d2e28ce74f8dad6c6afc922b92cabef6ed05c91c" @@ -2990,22 +3284,22 @@ jest-worker@^23.2.0: dependencies: merge-stream "^1.0.1" -jest@23.4.1: - version "23.4.1" - resolved "https://registry.npmjs.org/jest/-/jest-23.4.1.tgz#39550c72f3237f63ae1b434d8d122cdf6fa007b6" +jest@23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz#ad5835e923ebf6e19e7a1d7529a432edfee7813d" dependencies: import-local "^1.0.0" - jest-cli "^23.4.1" + jest-cli "^23.6.0" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" -js-yaml@^3.11.0, js-yaml@^3.7.0, js-yaml@^3.9.0: +js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -3079,7 +3373,7 @@ json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -3234,6 +3528,15 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +load-json-file@^2.0.0: + version "2.0.0" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -3311,7 +3614,7 @@ lodash.upperfirst@4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1: version "4.17.10" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -3368,7 +3671,7 @@ map-cache@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" -map-obj@^1.0.0: +map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -3392,33 +3695,48 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -meow@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" +meow@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" dependencies: camelcase-keys "^4.0.0" decamelize-keys "^1.0.0" loud-rejection "^1.0.0" - minimist "^1.1.3" minimist-options "^3.0.1" normalize-package-data "^2.3.4" read-pkg-up "^3.0.0" redent "^2.0.0" trim-newlines "^2.0.0" + yargs-parser "^10.0.0" -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" dependencies: camelcase-keys "^4.0.0" decamelize-keys "^1.0.0" loud-rejection "^1.0.0" + minimist "^1.1.3" minimist-options "^3.0.1" normalize-package-data "^2.3.4" read-pkg-up "^3.0.0" redent "^2.0.0" trim-newlines "^2.0.0" - yargs-parser "^10.0.0" merge-stream@^1.0.1: version "1.0.1" @@ -3531,10 +3849,18 @@ mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -3610,7 +3936,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: version "2.4.0" resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: @@ -3669,6 +3995,10 @@ npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" +null-check@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -3821,6 +4151,10 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +parse-github-repo-url@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -3885,6 +4219,12 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -3895,7 +4235,7 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" -pify@^2.0.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -3945,9 +4285,15 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -prettier@1.13.7: - version "1.13.7" - resolved "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281" +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + dependencies: + fast-diff "^1.1.2" + +prettier@1.14.3: + version "1.14.3" + resolved "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895" pretty-format@^23.2.0: version "23.2.0" @@ -3956,6 +4302,13 @@ pretty-format@^23.2.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -3991,7 +4344,7 @@ punycode@^2.1.0: version "2.1.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" -q@^1.5.1: +q@^1.4.1, q@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -4027,6 +4380,13 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -4034,7 +4394,7 @@ read-pkg-up@^3.0.0: find-up "^2.0.0" read-pkg "^3.0.0" -read-pkg@^1.0.0: +read-pkg@^1.0.0, read-pkg@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" dependencies: @@ -4042,6 +4402,14 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -4050,7 +4418,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.3.6" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: @@ -4077,6 +4445,13 @@ realpath-native@^1.0.0: dependencies: util.promisify "^1.0.0" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + redent@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" @@ -4117,15 +4492,9 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" - dependencies: - define-properties "^1.1.2" - -regexpp@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" +regexpp@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" regexpu-core@^2.0.0: version "2.0.0" @@ -4293,12 +4662,6 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" -rxjs@^5.5.2: - version "5.5.11" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" - dependencies: - symbol-observable "1.0.1" - rxjs@^6.1.0: version "6.2.2" resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" @@ -4346,6 +4709,10 @@ semver-compare@^1.0.0: version "5.5.0" resolved "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@^5.1.0, semver@^5.5.1: + version "5.5.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -4372,6 +4739,10 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -4472,7 +4843,7 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, sour version "0.5.7" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -4510,6 +4881,12 @@ split2@^2.0.0: dependencies: through2 "^2.0.2" +split@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + dependencies: + through "2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -4537,6 +4914,19 @@ staged-git-files@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.1.tgz#37c2218ef0d6d26178b1310719309a16a59f8f7b" +standard-version@4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/standard-version/-/standard-version-4.4.0.tgz#99de7a0709e6cafddf9c5984dd342c8cfe66e79f" + dependencies: + chalk "^1.1.3" + conventional-changelog "^1.1.0" + conventional-recommended-bump "^1.0.0" + dotgitignore "^1.0.3" + figures "^1.5.0" + fs-access "^1.0.0" + semver "^5.1.0" + yargs "^8.0.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -4544,6 +4934,10 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + stealthy-require@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" @@ -4574,16 +4968,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string.prototype.matchall@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz#2af8fe3d2d6dc53ca2a59bd376b089c3c152b3c8" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.10.0" - function-bind "^1.1.1" - has-symbols "^1.0.0" - regexp.prototype.flags "^1.2.0" - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4624,6 +5008,12 @@ strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" @@ -4648,10 +5038,6 @@ supports-color@^5.2.0, supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -4712,7 +5098,7 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "^2.1.5" xtend "~4.0.1" -"through@>=2.2.7 <3", through@^2.3.6: +through@2, "through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4756,6 +5142,10 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + tough-cookie@>=2.3.3, tough-cookie@^2.3.3: version "2.4.3" resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -4775,6 +5165,10 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + trim-newlines@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" @@ -4807,6 +5201,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + uglify-js@^2.6: version "2.8.29" resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -4816,6 +5214,13 @@ uglify-js@^2.6: optionalDependencies: uglify-to-browserify "~1.0.0" +uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -4836,7 +5241,7 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -uri-js@^4.2.1: +uri-js@^4.2.1, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: @@ -5025,6 +5430,12 @@ yargs-parser@^10.0.0: dependencies: camelcase "^4.1.0" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + dependencies: + camelcase "^4.1.0" + yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -5048,6 +5459,24 @@ yargs@^11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" +yargs@^8.0.1: + version "8.0.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"