diff --git a/packages/insomnia-inso/.babelrc b/packages/insomnia-inso/.babelrc deleted file mode 100644 index ff98aba32a2..00000000000 --- a/packages/insomnia-inso/.babelrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "12" - } - } - ], - "@babel/preset-flow" - ], - "plugins": [ - ["@babel/plugin-proposal-optional-chaining"] - ] -} diff --git a/packages/insomnia-inso/.babelrc.js b/packages/insomnia-inso/.babelrc.js new file mode 100644 index 00000000000..d0f4a0d6334 --- /dev/null +++ b/packages/insomnia-inso/.babelrc.js @@ -0,0 +1,13 @@ +export default = /** @type { import('@babel/core').TransformOptions } */ ({ + presets: [ + [ + "@babel/preset-env", + { + "targets": { + "node": "12" + } + } + ], + // "@babel/preset-typescript" + ], +}); diff --git a/packages/insomnia-inso/.eslintignore b/packages/insomnia-inso/.eslintignore new file mode 100644 index 00000000000..635bcf166f3 --- /dev/null +++ b/packages/insomnia-inso/.eslintignore @@ -0,0 +1,3 @@ +dist +bin +coverage diff --git a/packages/insomnia-inso/.flowconfig b/packages/insomnia-inso/.flowconfig deleted file mode 100644 index 23a42f9b1f0..00000000000 --- a/packages/insomnia-inso/.flowconfig +++ /dev/null @@ -1,14 +0,0 @@ -[ignore] -.*/node_modules/.* -./.cache -./dist - -[include] - -[libs] -./flow-typed - -[options] -esproposal.optional_chaining=enable - -[lints] diff --git a/packages/insomnia-inso/README.md b/packages/insomnia-inso/README.md index 89e7c047dff..83c00cab784 100644 --- a/packages/insomnia-inso/README.md +++ b/packages/insomnia-inso/README.md @@ -9,7 +9,7 @@

A CLI for Insomnia Designer

-
npm i -g insomnia-inso
+
npm install --global insomnia-inso

@@ -74,7 +74,7 @@ Similar to the Kong [Kubernetes](https://insomnia.rest/plugins/insomnia-plugin-k ### Examples -When running in the git-repo directory +When running in the git-repo directory Not specifying any arguments will prompt @@ -114,7 +114,7 @@ Designer has the ability to lint and validate your OpenAPI specification as you ### Examples -When running in the git-repo directory +When running in the git-repo directory Not specifying any arguments will prompt @@ -140,14 +140,14 @@ The test runner is built on top of Mocha, thus many of the options behave as the |Option|Alias|Description| |- |- |- | | `--env ` | `-e` |the environment to use - an environment name or id | -| `--reporter ` | `-r` |reporter to use, options are `dot, list, spec, min and progress` (default: `spec` )| +| `--reporter ` | `-r` |reporter to use, options are `dot, list, min, progress, spec` (default: `spec` )| | `--testNamePattern ` | `-t` | run tests that match the regex| | `--bail` | `-b` | abort ("bail") after the first test failure| | `--keepFile` | | do not delete the generated test file (useful for debugging)| ### Examples -When running in the git-repo directory +When running in the git-repo directory Not specifying any arguments will prompt @@ -190,7 +190,7 @@ This command will extract and export the raw OpenAPI specification from the data ### Examples -When running in the git-repo directory +When running in the git-repo directory Not specifying any arguments will prompt @@ -218,7 +218,7 @@ The `inso` [config file](#configuration) supports scripts, akin to NPM scripts d ### Examples -When running in the git-repo directory, with the following inso config file. +When running in the git-repo directory, with the following inso config file. ``` yaml # .insorc.yaml @@ -326,7 +326,7 @@ jobs: - name: Install NodeJS uses: actions/setup-node@v1 - name: Install inso - run: npm install -g insomnia-inso + run: npm install --global insomnia-inso - name: Lint run: inso lint spec "Designer Demo" --ci - name: Run test suites diff --git a/packages/insomnia-inso/__jest__/before.js b/packages/insomnia-inso/__jest__/before.js deleted file mode 100644 index d1b6245cb92..00000000000 --- a/packages/insomnia-inso/__jest__/before.js +++ /dev/null @@ -1,27 +0,0 @@ -import logger from '../src/logger'; - -export function globalBeforeAll() { - logger.__getLogs = () => { - const logs = {}; - // Taken from https://github.com/nuxt-contrib/consola/blob/master/src/types.js - [ - 'silent', - 'fatal', - 'error', - 'warn', - 'log', - 'info', - 'success', - 'debug', - 'trace', - 'verbose', - ].forEach(level => { - logs[level] = logger[level].mock.calls.map(c => (c.length === 1 ? c[0] : c)); - }); - return logs; - }; -} - -export function globalBeforeEach() { - logger.mockTypes(() => jest.fn()); -} diff --git a/packages/insomnia-inso/__mocks__/cosmiconfig.js b/packages/insomnia-inso/__mocks__/cosmiconfig.js deleted file mode 100644 index 98df34eec0a..00000000000 --- a/packages/insomnia-inso/__mocks__/cosmiconfig.js +++ /dev/null @@ -1,5 +0,0 @@ -const mock = { load: jest.fn(), search: jest.fn() }; - -module.exports = { - cosmiconfigSync: () => mock, -}; diff --git a/packages/insomnia-inso/__mocks__/enquirer.js b/packages/insomnia-inso/__mocks__/enquirer.js deleted file mode 100644 index d01ffb692e7..00000000000 --- a/packages/insomnia-inso/__mocks__/enquirer.js +++ /dev/null @@ -1,20 +0,0 @@ -const __constructorMock = jest.fn(); -let returnValue = 'test'; - -class Prompt { - constructor(options) { - __constructorMock(options); - } - - run() { - return returnValue; - } -} - -module.exports = { - __constructorMock, - __mockPromptRun: v => { - returnValue = v; - }, - AutoComplete: Prompt, -}; diff --git a/packages/insomnia-inso/__mocks__/insomnia-send-request.js b/packages/insomnia-inso/__mocks__/insomnia-send-request.js deleted file mode 100644 index 8b677d898de..00000000000 --- a/packages/insomnia-inso/__mocks__/insomnia-send-request.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - getSendRequestCallbackMemDb: jest.fn().mockResolvedValue(jest.fn()), -}; diff --git a/packages/insomnia-inso/__mocks__/insomnia-testing.js b/packages/insomnia-inso/__mocks__/insomnia-testing.js deleted file mode 100644 index 995af414f60..00000000000 --- a/packages/insomnia-inso/__mocks__/insomnia-testing.js +++ /dev/null @@ -1,8 +0,0 @@ -// const mod = jest.requireActual('insomnia-testing'); - -module.exports = { - generate: jest.fn(), - generateToFile: jest.fn(), - runTests: jest.fn(), - runTestsCli: jest.fn(), -}; diff --git a/packages/insomnia-inso/bin/inso b/packages/insomnia-inso/bin/inso index 6ecbe6bae40..7e1be0ce204 100755 --- a/packages/insomnia-inso/bin/inso +++ b/packages/insomnia-inso/bin/inso @@ -1,4 +1,5 @@ #!/usr/bin/env node global.require = require; -require('../dist').go(); +const insomniacli = require('../dist/index.js'); +insomniacli.go(); diff --git a/packages/insomnia-inso/flow-typed/@stoplight/spectral.js b/packages/insomnia-inso/flow-typed/@stoplight/spectral.js deleted file mode 100644 index 10091eeb01b..00000000000 --- a/packages/insomnia-inso/flow-typed/@stoplight/spectral.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module '@stoplight/spectral' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/commander.js b/packages/insomnia-inso/flow-typed/commander.js deleted file mode 100644 index bb41a6ece6c..00000000000 --- a/packages/insomnia-inso/flow-typed/commander.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'commander' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/consola.js b/packages/insomnia-inso/flow-typed/consola.js deleted file mode 100644 index f97e79eeada..00000000000 --- a/packages/insomnia-inso/flow-typed/consola.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'consola' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/cosmiconfig.js b/packages/insomnia-inso/flow-typed/cosmiconfig.js deleted file mode 100644 index 3d5c255bb0a..00000000000 --- a/packages/insomnia-inso/flow-typed/cosmiconfig.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'cosmiconfig' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/enquirer.js b/packages/insomnia-inso/flow-typed/enquirer.js deleted file mode 100644 index 093be578495..00000000000 --- a/packages/insomnia-inso/flow-typed/enquirer.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'enquirer' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/execa.js b/packages/insomnia-inso/flow-typed/execa.js deleted file mode 100644 index e8ebe509a5a..00000000000 --- a/packages/insomnia-inso/flow-typed/execa.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'execa' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/get-bin-path.js b/packages/insomnia-inso/flow-typed/get-bin-path.js deleted file mode 100644 index 0926b947e87..00000000000 --- a/packages/insomnia-inso/flow-typed/get-bin-path.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'get-bin-path' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/insomnia-send-request.js b/packages/insomnia-inso/flow-typed/insomnia-send-request.js deleted file mode 100644 index 5465184cf78..00000000000 --- a/packages/insomnia-inso/flow-typed/insomnia-send-request.js +++ /dev/null @@ -1,11 +0,0 @@ -// @flow - -declare module 'insomnia-send-request' { - declare module.exports: { - getSendRequestCallback: ( environmentId: string ) => Promise, - getSendRequestCallbackMemDb: ( - environmentId: string, - memDb: { [string]: Array }, - ) => Promise, - } -} diff --git a/packages/insomnia-inso/flow-typed/insomnia-testing.js b/packages/insomnia-inso/flow-typed/insomnia-testing.js deleted file mode 100644 index 90494135324..00000000000 --- a/packages/insomnia-inso/flow-typed/insomnia-testing.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'insomnia-testing' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/jest.js b/packages/insomnia-inso/flow-typed/jest.js deleted file mode 100644 index 2ad13d02b9b..00000000000 --- a/packages/insomnia-inso/flow-typed/jest.js +++ /dev/null @@ -1,1186 +0,0 @@ -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, - /** - * An array that contains all the object results that have been - * returned by this mock function call - */ - results: Array<{ - isThrow: boolean, - value: TReturn, - ... - }>, - ... - }, - /** - * 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 = ( - received: any, - ...actual: Array -) => JestMatcherResult | Promise; - -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 = { - // 5.x - toBeEmpty(): void, - toBePresent(): void, - // 6.x - toBeChecked(): void, - toBeDisabled(): void, - toBeEmptyRender(): void, - toContainMatchingElement(selector: string): void, - toContainMatchingElements(n: number, selector: string): void, - toContainExactlyOneMatchingElement(selector: string): void, - toContainReact(element: React$Element): void, - toExist(): void, - toHaveClassName(className: string): void, - toHaveHTML(html: string): void, - toHaveProp: ((propKey: string, propValue?: any) => void) & ((props: { ... }) => void), - toHaveRef(refName: string): void, - toHaveState: ((stateKey: string, stateValue?: any) => void) & ((state: { ... }) => void), - toHaveStyle: ((styleKey: string, styleValue?: any) => void) & ((style: { ... }) => void), - toHaveTagName(tagName: string): void, - toHaveText(text: string): void, - toHaveValue(value: any): void, - toIncludeText(text: string): void, - toMatchElement( - element: React$Element, - options?: {| ignoreProps?: boolean, verbose?: boolean |}, - ): void, - toMatchSelector(selector: string): void, - // 7.x - toHaveDisplayName(name: string): void, - ... -}; - -// DOM testing library extensions (jest-dom) -// https://github.com/testing-library/jest-dom -type DomTestingLibraryType = { - /** - * @deprecated - */ - toBeInTheDOM(container?: HTMLElement): void, - toBeInTheDocument(): void, - toBeVisible(): void, - toBeEmpty(): void, - toBeDisabled(): void, - toBeEnabled(): void, - toBeInvalid(): void, - toBeRequired(): void, - toBeValid(): void, - toContainElement(element: HTMLElement | null): void, - toContainHTML(htmlText: string): void, - toHaveAttribute(attr: string, value?: any): void, - toHaveClass(...classNames: string[]): void, - toHaveFocus(): void, - toHaveFormValues(expectedValues: { [name: string]: any, ... }): void, - toHaveStyle(css: string): void, - toHaveTextContent(text: string | RegExp, options?: { normalizeWhitespace: boolean, ... }): void, - toHaveValue(value?: string | string[] | number): 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 | $ReadOnlyArray, 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?: any, name?: string): void; - - /** - * This ensures that an Object matches the most recent snapshot. - */ - toMatchSnapshot(name: string): void; - - toMatchInlineSnapshot(snapshot?: string): void; - - toMatchInlineSnapshot(propertyMatchers?: any, 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, - /** - * Returns the number of fake timers still left to run. - */ - getTimerCount(): number, - /** - * 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, - /** - * Creates a sandbox registry for the modules that are loaded inside the - * callback function. This is useful to isolate specific modules for every - * test so that local module state doesn't conflict between tests. - */ - isolateModules(fn: () => void): 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, ... }; - -type JestDoneFn = {| - (): void, - fail: (error: Error) => void, -|}; - -/** Runs this function after every test inside this context */ -declare function afterEach(fn: (done: JestDoneFn) => ?Promise, timeout?: number): void; - -/** Runs this function before every test inside this context */ -declare function beforeEach(fn: (done: JestDoneFn) => ?Promise, timeout?: number): void; - -/** Runs this function after all tests have finished inside this context */ -declare function afterAll(fn: (done: JestDoneFn) => ?Promise, timeout?: number): void; - -/** Runs this function before any tests have started inside this context */ -declare function beforeAll(fn: (done: JestDoneFn) => ?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, - /** - * each runs this test against array of argument arrays per each run - * - * @param {table} table of Test - */ - each( - ...table: Array | mixed> | [Array, string] - ): (name: JestTestName, fn?: (...args: Array) => ?Promise, timeout?: number) => 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: JestDoneFn) => ?Promise, timeout?: number): 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: JestDoneFn) => ?Promise, timeout?: number): void, - each( - ...table: Array | mixed> | [Array, string] - ): ( - name: JestTestName, - fn?: (...args: Array) => ?Promise, - timeout?: number, - ) => 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: JestDoneFn) => ?Promise, timeout?: number): void, - /** - * Highlight planned tests in the summary output - * - * @param {String} Name of Test to do - */ - todo(name: string): 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: JestDoneFn) => ?Promise, - timeout?: number, - ): void, - /** - * each runs this test against array of argument arrays per each run - * - * @param {table} table of Test - */ - each( - ...table: Array | mixed> | [Array, string] - ): (name: JestTestName, fn?: (...args: Array) => ?Promise, timeout?: number) => void, - ... -}; - -declare function fit( - name: JestTestName, - fn: (done: JestDoneFn) => ?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/packages/insomnia-inso/flow-typed/lodash.flattendeep.js b/packages/insomnia-inso/flow-typed/lodash.flattendeep.js deleted file mode 100644 index be2847d7fa7..00000000000 --- a/packages/insomnia-inso/flow-typed/lodash.flattendeep.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'lodash.flattendeep' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/mkdirp.js b/packages/insomnia-inso/flow-typed/mkdirp.js deleted file mode 100644 index 92b7dbbfcb7..00000000000 --- a/packages/insomnia-inso/flow-typed/mkdirp.js +++ /dev/null @@ -1,7 +0,0 @@ -// @flow - -declare module 'mkdirp' { - declare module.exports: { - sync: (path: string) => string | null, - }; -} diff --git a/packages/insomnia-inso/flow-typed/nedb.js b/packages/insomnia-inso/flow-typed/nedb.js deleted file mode 100644 index fb3ae0e5956..00000000000 --- a/packages/insomnia-inso/flow-typed/nedb.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'nedb' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/openapi-2-kong.js b/packages/insomnia-inso/flow-typed/openapi-2-kong.js deleted file mode 100644 index 5d3d0ccf4bd..00000000000 --- a/packages/insomnia-inso/flow-typed/openapi-2-kong.js +++ /dev/null @@ -1,38 +0,0 @@ -// @flow - -declare type ConversionResultType = 'kong-declarative-config' | 'kong-for-kubernetes'; - -declare type DeclarativeConfigResult = { - type: 'kong-declarative-config', - label: string, - documents: Object, - warnings: Array<{ - severity: number, - message: string, - range: { - /* TODO */ - }, - }>, -}; - -declare type KongForKubernetesResult = { - type: 'kong-for-kubernetes', - label: string, - documents: Array, - warnings: Array<{ - severity: number, - message: string, - range: { - /* TODO */ - }, - }>, -}; - -declare type ConversionResult = DeclarativeConfigResult | KongForKubernetesResult; - -declare module 'openapi-2-kong' { - declare module.exports: { - generate: (specPath: string, type: ConversionResultType, tags?: Array) => Promise, - generateFromString: (specStr: string, type: ConversionResultType, tags?: Array) => Promise, - }; -} diff --git a/packages/insomnia-inso/flow-typed/string-argv.js b/packages/insomnia-inso/flow-typed/string-argv.js deleted file mode 100644 index 6f31a9e0c15..00000000000 --- a/packages/insomnia-inso/flow-typed/string-argv.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -declare module 'string-argv' { - declare module.exports: *; -} diff --git a/packages/insomnia-inso/flow-typed/yaml.js b/packages/insomnia-inso/flow-typed/yaml.js deleted file mode 100644 index 119502e9ea9..00000000000 --- a/packages/insomnia-inso/flow-typed/yaml.js +++ /dev/null @@ -1,9 +0,0 @@ -// @flow - -declare module 'yaml' { - declare module.exports: { - stringify: Object => string, - parse: string => Object, - parseCST: string => Object, - }; -} diff --git a/packages/insomnia-inso/jest.config.js b/packages/insomnia-inso/jest.config.js new file mode 100644 index 00000000000..bb9bcd15375 --- /dev/null +++ b/packages/insomnia-inso/jest.config.js @@ -0,0 +1,37 @@ +'use strict'; + +// @ts-check +module.exports = /** @type { import('@jest/types').Config.InitialOptions } */ { + globals: { + 'ts-jest': { + isolatedModules: true, + }, + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + testMatch: [ + '**/*.test.ts', + ], + verbose: false, + resetMocks: true, + resetModules: true, + + setupFiles: [ + './src/jest/setup.ts', + ], + collectCoverage: true, + coveragePathIgnorePatterns: [ + '/node_modules/', + ], + coverageThreshold: { + global: { + branches: 88, + functions: 96, + lines: 95, + statements: 95, + }, + }, +}; diff --git a/packages/insomnia-inso/package-lock.json b/packages/insomnia-inso/package-lock.json index ba5d0a654df..5c8c4f495c2 100644 --- a/packages/insomnia-inso/package-lock.json +++ b/packages/insomnia-inso/package-lock.json @@ -460,15 +460,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, "@babel/plugin-syntax-class-properties": { "version": "7.10.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", @@ -496,15 +487,6 @@ "@babel/helper-plugin-utils": "^7.10.1" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.1.tgz", - "integrity": "sha512-ypC4jwfIVF72og0dgvEcFRdOM2V9Qm1tu7RGmdZOlhsccyK0wisXmMObGuWEOd5jQ+K9wcIgSNftCpk2vkjUfQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -514,15 +496,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz", - "integrity": "sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.1" - } - }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", @@ -1044,260 +1017,6 @@ "to-fast-properties": "^2.0.0" } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jest/console": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", - "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "jest-message-util": "^26.1.0", - "jest-util": "^26.1.0", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@jest/core": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.1.0.tgz", - "integrity": "sha512-zyizYmDJOOVke4OO/De//aiv8b07OwZzL2cfsvWF3q9YssfpcKfcnZAwDY8f+A76xXSMMYe8i/f/LPocLlByfw==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/reporters": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.1.0", - "jest-config": "^26.1.0", - "jest-haste-map": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-resolve-dependencies": "^26.1.0", - "jest-runner": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "jest-watcher": "^26.1.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@jest/environment": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.1.0.tgz", - "integrity": "sha512-86+DNcGongbX7ai/KE/S3/NcUVZfrwvFzOOWX/W+OOTvTds7j07LtC+MgGydH5c8Ri3uIrvdmVgd1xFD5zt/xA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0" - } - }, - "@jest/fake-timers": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.1.0.tgz", - "integrity": "sha512-Y5F3kBVWxhau3TJ825iuWy++BAuQzK/xEa+wD9vDH3RytW9f2DbMVodfUQC54rZDX3POqdxCgcKdgcOL0rYUpA==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "@sinonjs/fake-timers": "^6.0.1", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" - } - }, - "@jest/globals": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.1.0.tgz", - "integrity": "sha512-MKiHPNaT+ZoG85oMaYUmGHEqu98y3WO2yeIDJrs2sJqHhYOy3Z6F7F/luzFomRQ8SQ1wEkmahFAz2291Iv8EAw==", - "dev": true, - "requires": { - "@jest/environment": "^26.1.0", - "@jest/types": "^26.1.0", - "expect": "^26.1.0" - } - }, - "@jest/reporters": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.1.0.tgz", - "integrity": "sha512-SVAysur9FOIojJbF4wLP0TybmqwDkdnFxHSPzHMMIYyBtldCW9gG+Q5xWjpMFyErDiwlRuPyMSJSU64A67Pazg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.1.0", - "jest-resolve": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", - "node-notifier": "^7.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.1.3" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@jest/source-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.1.0.tgz", - "integrity": "sha512-XYRPYx4eEVX15cMT9mstnO7hkHP3krNtKfxUYd8L7gbtia8JvZZ6bMzSwa6IQJENbudTwKMw5R1BePRD+bkEmA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", - "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/types": "^26.1.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.1.0.tgz", - "integrity": "sha512-Z/hcK+rTq56E6sBwMoQhSRDVjqrGtj1y14e2bIgcowARaIE1SgOanwx6gvY4Q9gTKMoZQXbXvptji+q5GYxa6Q==", - "dev": true, - "requires": { - "@jest/test-result": "^26.1.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.1.0", - "jest-runner": "^26.1.0", - "jest-runtime": "^26.1.0" - } - }, - "@jest/transform": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.1.0.tgz", - "integrity": "sha512-ICPm6sUXmZJieq45ix28k0s+d/z2E8CHDsq+WwtWI6kW8m7I8kPqarSEcUN86entHQ570ZBRci5OWaKL0wlAWw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.1.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.1.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "@jest/types": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", - "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -1321,24 +1040,6 @@ "fastq": "^1.6.0" } }, - "@sinonjs/commons": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.0.tgz", - "integrity": "sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, "@stoplight/json": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/@stoplight/json/-/json-3.6.0.tgz", @@ -1444,10 +1145,16 @@ "resolved": "https://registry.npmjs.org/@stoplight/yaml-ast-parser/-/yaml-ast-parser-0.0.44.tgz", "integrity": "sha512-PdY8p2Ufgtorf4d2DbKMfknILMa8KwuyyMMR/2lgK1mLaU8F5PKWYc+h9hIzC+ar0bh7m9h2rINo32m7ADfVyA==" }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "version": "7.1.13", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.13.tgz", + "integrity": "sha512-CC6amBNND16pTk4K3ZqKIaba6VGKAQs3gMjEY17FVd56oI/ZWt9OhS6riYiWv9s8ENbYUi7p8lgqb0QHQvUKQQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1458,18 +1165,24 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, + "@types/babel__preset-env": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@types/babel__preset-env/-/babel__preset-env-7.9.1.tgz", + "integrity": "sha512-kkCHo5fk24m3gcH7oVhRLdw6xGF2tog5rc8/CbXIyTSYSO0NhStjEYCaEmRjs5VB5Jy5Wbj+0QvuGdxuGdvAfQ==", + "dev": true + }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1490,49 +1203,64 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/graceful-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", - "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "dev": true, "requires": { + "@types/minimatch": "*", "@types/node": "*" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "@types/json-schema": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" + }, + "@types/lodash": { + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", "dev": true }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "@types/lodash.flattendeep": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.6.tgz", + "integrity": "sha512-uLm2MaRVlqJSGsMK0RZpP5T3KqReq+9WbYDHCUhBhp98v56hMG/Yht52bsoTSui9xz2mUvQ9NfG3LrNGDL92Ng==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*" + "@types/lodash": "*" } }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mkdirp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", + "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "@types/node": "*" } }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==" + "@types/nedb": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/nedb/-/nedb-1.8.11.tgz", + "integrity": "sha512-qHQRLZ0e6l/XK/2Qb2v5N1ujmdttYkUvnRI4nPIifMy6vYwoAnER10xhX13isWjjQtNsrjNLinZgDDguzPmEKw==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/node": { - "version": "14.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", - "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", + "version": "14.14.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", + "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==", "dev": true }, "@types/normalize-package-data": { @@ -1546,37 +1274,92 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, - "@types/prettier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.0.1.tgz", - "integrity": "sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==", + "@types/rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==", + "dev": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", "dev": true }, + "@types/uglify-js": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.0.tgz", + "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, "@types/urijs": { "version": "1.19.9", "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.9.tgz", "integrity": "sha512-/tiJyrc0GPcsReHzgC0SXwOmoPjLqYe01W7dLYB0yasQXMbcRee+ZIk+g8MIQhoBS8fPoBQO3Y93+aeBrI93Ug==" }, - "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "@types/webpack": { + "version": "4.41.26", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz", + "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" } }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", - "dev": true + "@types/webpack-node-externals": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/webpack-node-externals/-/webpack-node-externals-2.5.0.tgz", + "integrity": "sha512-KaWfhUQlpWknM/CMBKhV7i0vxX/N2xEy3WeaE500s4ZNxC4nLnKB+0F3gD3Fg+5octPq0nn8ZlfFR/P3dSkXpw==", + "dev": true, + "requires": { + "@types/webpack": "*" + } + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@types/yaml": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@types/yaml/-/yaml-1.9.7.tgz", + "integrity": "sha512-8WMXRDD1D+wCohjfslHDgICd2JtMATZU8CkhH8LVJqcJs6dyYj5TGptzP8wApbmEullGBSsCEzzap73DQ1HJaA==", + "dev": true, + "requires": { + "yaml": "*" + } }, "@webassemblyjs/ast": { "version": "1.9.0", @@ -1765,12 +1548,6 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true - }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -1779,28 +1556,6 @@ "event-target-shim": "^5.0.0" } }, - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -1841,26 +1596,9 @@ } }, "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - } - } + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-regex": { "version": "5.0.0", @@ -1880,6 +1618,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, + "optional": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -1890,6 +1629,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, + "optional": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -1908,6 +1648,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -1919,6 +1660,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, + "optional": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -1931,6 +1673,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, + "optional": true, "requires": { "is-extendable": "^0.1.0" } @@ -1942,6 +1685,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2" }, @@ -1951,6 +1695,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { "is-buffer": "^1.1.5" } @@ -1962,6 +1707,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, + "optional": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -1983,6 +1729,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, + "optional": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -1992,6 +1739,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, + "optional": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -2005,15 +1753,6 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -2038,15 +1777,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", @@ -2093,12 +1823,6 @@ } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -2122,54 +1846,12 @@ "dev": true, "optional": true }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", - "dev": true - }, - "babel-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.1.0.tgz", - "integrity": "sha512-Nkqgtfe7j6PxLO6TnCQQlkMm8wdTdnIF8xrdpooHCuD5hXRzVEPbPneTJKknH5Dsv3L8ip9unHDAp48YQ54Dkg==", - "dev": true, - "requires": { - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.1.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -2179,60 +1861,6 @@ "object.assign": "^4.1.0" } }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.1.0.tgz", - "integrity": "sha512-qhqLVkkSlqmC83bdMhM8WW4Z9tB+JkjqAqlbbohS9sJLT5Ha2vfzuKqg5yenXrAjOPG2YC0WiXdH3a9PvB+YYw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.1.0.tgz", - "integrity": "sha512-na9qCqFksknlEj5iSdw1ehMVR06LCCTkZLGKeEtxDDdhg8xpUF09m29Kvh1pRbZ07h7AQ5ttLYUwpXL4tO6w7w==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.1.0", - "babel-preset-current-node-syntax": "^0.1.2" - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -2300,15 +1928,6 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "better-ajv-errors": { "version": "0.6.7", "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-0.6.7.tgz", @@ -2407,12 +2026,6 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -2534,15 +2147,6 @@ "node-releases": "^1.1.58" } }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -2661,21 +2265,6 @@ "integrity": "sha512-QzPRKDCyp7RhjczTPZaqK3CjPA5Ht2UnXhZhCI4f7QiB5JK6KEuZBxIzyWnB3wO4hgAj4GMRxAhuiacfw0Psjg==", "dev": true }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", @@ -2722,12 +2311,6 @@ } } }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, "chokidar": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", @@ -2773,12 +2356,6 @@ "tslib": "^1.9.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -2843,12 +2420,6 @@ "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==" }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -2872,15 +2443,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -3097,60 +2659,17 @@ "randomfill": "^1.0.3" } }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "data-uri-to-buffer": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==" }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -3180,12 +2699,6 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -3246,12 +2759,6 @@ "esprima": "3.x.x" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3278,18 +2785,6 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.0.0.tgz", - "integrity": "sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==", - "dev": true - }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -3315,23 +2810,6 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -3344,16 +2822,6 @@ "stream-shift": "^1.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "electron-to-chromium": { "version": "1.3.483", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz", @@ -3427,11 +2895,11 @@ } }, "enquirer": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.5.tgz", - "integrity": "sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "requires": { - "ansi-colors": "^3.2.1" + "ansi-colors": "^4.1.1" } }, "eol": { @@ -3554,35 +3022,23 @@ "safe-buffer": "^5.1.1" } }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true - }, "execa": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", - "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3642,47 +3098,6 @@ "homedir-polyfill": "^1.0.1" } }, - "expect": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.1.0.tgz", - "integrity": "sha512-QbH4LZXDsno9AACrN9eM0zfnby9G+OsdNgZUohjg/P0mLy1O+/bzTAJGT6VSIjVCe8yKM6SzEl/ckEOFBT7Vnw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-regex-util": "^26.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3774,12 +3189,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3820,15 +3229,6 @@ "reusify": "^1.0.4" } }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -4030,12 +3430,6 @@ } } }, - "flow-bin": { - "version": "0.126.1", - "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.126.1.tgz", - "integrity": "sha512-RI05x7rVzruRVJQN3M4vLEjZMwUHJKhGz9FmL8HN7WiSo66/131EyJS6Vo8PkKyM2pgT9GRWfGP/tXlqS54XUg==", - "dev": true - }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -4052,23 +3446,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -4162,20 +3539,11 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true }, "get-uri": { "version": "2.0.4", @@ -4211,15 +3579,6 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -4314,29 +3673,6 @@ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -4475,21 +3811,6 @@ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "http-errors": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", @@ -4526,17 +3847,6 @@ } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -4563,9 +3873,9 @@ } }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { @@ -4614,16 +3924,6 @@ } } }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4677,12 +3977,6 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -4724,15 +4018,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -4772,13 +4057,6 @@ } } }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", - "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", - "dev": true, - "optional": true - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -4795,12 +4073,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", @@ -4829,40 +4101,18 @@ "isobject": "^3.0.1" } }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true - }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -4880,696 +4130,40 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-to-ast": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", + "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "code-error-fragment": "0.0.230", + "grapheme-splitter": "^1.0.4" } }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.1.0.tgz", - "integrity": "sha512-LIti8jppw5BcQvmNJe4w2g1N/3V68HUfAv9zDVm7v+VAtQulGhH0LnmmiVkbNE4M4I43Bj2fXPiBGKt26k9tHw==", - "dev": true, - "requires": { - "@jest/core": "^26.1.0", - "import-local": "^3.0.2", - "jest-cli": "^26.1.0" - }, - "dependencies": { - "jest-cli": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.1.0.tgz", - "integrity": "sha512-Imumvjgi3rU7stq6SJ1JUEMaV5aAgJYXIs0jPqdUnF47N/Tk83EXfmtvNKQ+SnFVI6t6mDOvfM3aA9Sg6kQPSw==", - "dev": true, - "requires": { - "@jest/core": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "prompts": "^2.0.1", - "yargs": "^15.3.1" - } - } - } - }, - "jest-changed-files": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.1.0.tgz", - "integrity": "sha512-HS5MIJp3B8t0NRKGMCZkcDUZo36mVRvrDETl81aqljT1S9tqiHRSpyoOvWg9ZilzZG9TDisDNaN1IXm54fLRZw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, - "jest-config": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.1.0.tgz", - "integrity": "sha512-ONTGeoMbAwGCdq4WuKkMcdMoyfs5CLzHEkzFOlVvcDXufZSaIWh/OXMLa2fwKXiOaFcqEw8qFr4VOKJQfn4CVw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.1.0", - "@jest/types": "^26.1.0", - "babel-jest": "^26.1.0", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.1.0", - "jest-environment-node": "^26.1.0", - "jest-get-type": "^26.0.0", - "jest-jasmine2": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "micromatch": "^4.0.2", - "pretty-format": "^26.1.0" - } - }, - "jest-diff": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.1.0.tgz", - "integrity": "sha512-GZpIcom339y0OXznsEKjtkfKxNdg7bVbEofK8Q6MnevTIiR1jNhDWKhRX6X0SDXJlwn3dy59nZ1z55fLkAqPWg==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.0.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.1.0.tgz", - "integrity": "sha512-lYiSo4Igr81q6QRsVQq9LIkJW0hZcKxkIkHzNeTMPENYYDw/W/Raq28iJ0sLlNFYz2qxxeLnc5K2gQoFYlu2bA==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", - "jest-util": "^26.1.0", - "pretty-format": "^26.1.0" - } - }, - "jest-environment-jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.1.0.tgz", - "integrity": "sha512-dWfiJ+spunVAwzXbdVqPH1LbuJW/kDL+FyqgA5YzquisHqTi0g9hquKif9xKm7c1bKBj6wbmJuDkeMCnxZEpUw==", - "dev": true, - "requires": { - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0", - "jsdom": "^16.2.2" - } - }, - "jest-environment-node": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.1.0.tgz", - "integrity": "sha512-DNm5x1aQH0iRAe9UYAkZenuzuJ69VKzDCAYISFHQ5i9e+2Tbeu2ONGY7YStubCLH8a1wdKBgqScYw85+ySxqxg==", - "dev": true, - "requires": { - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/types": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-util": "^26.1.0" - } - }, - "jest-get-type": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.0.0.tgz", - "integrity": "sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==", - "dev": true - }, - "jest-haste-map": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.1.0.tgz", - "integrity": "sha512-WeBS54xCIz9twzkEdm6+vJBXgRBQfdbbXD0dk8lJh7gLihopABlJmIQFdWSDDtuDe4PRiObsjZSUjbJ1uhWEpA==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "@types/graceful-fs": "^4.1.2", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-serializer": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - } - } - }, - "jest-jasmine2": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.1.0.tgz", - "integrity": "sha512-1IPtoDKOAG+MeBrKvvuxxGPJb35MTTRSDglNdWWCndCB3TIVzbLThRBkwH9P081vXLgiJHZY8Bz3yzFS803xqQ==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.1.0", - "@jest/source-map": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.1.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.1.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "pretty-format": "^26.1.0", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.1.0.tgz", - "integrity": "sha512-dsMnKF+4BVOZwvQDlgn3MG+Ns4JuLv8jNvXH56bgqrrboyCbI1rQg6EI5rs+8IYagVcfVP2yZFKfWNZy0rK0Hw==", - "dev": true, - "requires": { - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" - } - }, - "jest-matcher-utils": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.1.0.tgz", - "integrity": "sha512-PW9JtItbYvES/xLn5mYxjMd+Rk+/kIt88EfH3N7w9KeOrHWaHrdYPnVHndGbsFGRJ2d5gKtwggCvkqbFDoouQA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.1.0", - "jest-get-type": "^26.0.0", - "pretty-format": "^26.1.0" - } - }, - "jest-message-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", - "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "jest-mock": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.1.0.tgz", - "integrity": "sha512-1Rm8EIJ3ZFA8yCIie92UbxZWj9SuVmUGcyhLHyAhY6WI3NIct38nVcfOPWhJteqSn8V8e3xOMha9Ojfazfpovw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.1.0.tgz", - "integrity": "sha512-KsY1JV9FeVgEmwIISbZZN83RNGJ1CC+XUCikf/ZWJBX/tO4a4NvA21YixokhdR9UnmPKKAC4LafVixJBrwlmfg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.1", - "jest-util": "^26.1.0", - "read-pkg-up": "^7.0.1", - "resolve": "^1.17.0", - "slash": "^3.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "jest-resolve-dependencies": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.1.0.tgz", - "integrity": "sha512-fQVEPHHQ1JjHRDxzlLU/buuQ9om+hqW6Vo928aa4b4yvq4ZHBtRSDsLdKQLuCqn5CkTVpYZ7ARh2fbA8WkRE6g==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.1.0" - } - }, - "jest-runner": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.1.0.tgz", - "integrity": "sha512-elvP7y0fVDREnfqit0zAxiXkDRSw6dgCkzPCf1XvIMnSDZ8yogmSKJf192dpOgnUVykmQXwYYJnCx641uLTgcw==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/environment": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.1.0", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.1.0", - "jest-jasmine2": "^26.1.0", - "jest-leak-detector": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-resolve": "^26.1.0", - "jest-runtime": "^26.1.0", - "jest-util": "^26.1.0", - "jest-worker": "^26.1.0", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.1.0.tgz", - "integrity": "sha512-1qiYN+EZLmG1QV2wdEBRf+Ci8i3VSfIYLF02U18PiUDrMbhfpN/EAMMkJtT02jgJUoaEOpHAIXG6zS3QRMzRmA==", - "dev": true, - "requires": { - "@jest/console": "^26.1.0", - "@jest/environment": "^26.1.0", - "@jest/fake-timers": "^26.1.0", - "@jest/globals": "^26.1.0", - "@jest/source-map": "^26.1.0", - "@jest/test-result": "^26.1.0", - "@jest/transform": "^26.1.0", - "@jest/types": "^26.1.0", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.1.0", - "jest-haste-map": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-mock": "^26.1.0", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.1.0", - "jest-snapshot": "^26.1.0", - "jest-util": "^26.1.0", - "jest-validate": "^26.1.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.3.1" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "jest-serializer": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.1.0.tgz", - "integrity": "sha512-eqZOQG/0+MHmr25b2Z86g7+Kzd5dG9dhCiUoyUNJPgiqi38DqbDEOlHcNijyfZoj74soGBohKBZuJFS18YTJ5w==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.1.0.tgz", - "integrity": "sha512-YhSbU7eMTVQO/iRbNs8j0mKRxGp4plo7sJ3GzOQ0IYjvsBiwg0T1o0zGQAYepza7lYHuPTrG5J2yDd0CE2YxSw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.1.0", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.1.0", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.1.0", - "jest-get-type": "^26.0.0", - "jest-haste-map": "^26.1.0", - "jest-matcher-utils": "^26.1.0", - "jest-message-util": "^26.1.0", - "jest-resolve": "^26.1.0", - "natural-compare": "^1.4.0", - "pretty-format": "^26.1.0", - "semver": "^7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } - } - }, - "jest-util": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", - "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - } - }, - "jest-validate": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.1.0.tgz", - "integrity": "sha512-WPApOOnXsiwhZtmkDsxnpye+XLb/tUISP+H6cHjfUIXvlG+eKwP+isnivsxlHCPaO9Q5wvbhloIBkdF3qUn+Nw==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.0.0", - "leven": "^3.1.0", - "pretty-format": "^26.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.1.0.tgz", - "integrity": "sha512-ffEOhJl2EvAIki613oPsSG11usqnGUzIiK7MMX6hE4422aXOcVEG3ySCTDFLn1+LZNXGPE8tuJxhp8OBJ1pgzQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.1.0", - "@jest/types": "^26.1.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.1.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz", - "integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", - "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.0.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json-to-ast": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", - "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", - "requires": { - "code-error-fragment": "0.0.230", - "grapheme-splitter": "^1.0.4" - } - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -5590,30 +4184,12 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -5704,12 +4280,6 @@ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -5737,15 +4307,6 @@ "semver": "^5.6.0" } }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -5820,21 +4381,6 @@ } } }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -5981,12 +4527,6 @@ "to-regex": "^3.0.1" } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, "nedb": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz", @@ -6031,12 +4571,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -6091,33 +4625,55 @@ } } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-7.0.1.tgz", - "integrity": "sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg==", + "node-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-1.0.2.tgz", + "integrity": "sha512-myxAxpyMR7knjA4Uzwf3gjxaMtxSWj2vpm9o6AYWWxQ1S3XMBNeG2vzYcp/5eW03cBGfgSxyP+wntP8qhBJNhQ==", "dev": true, - "optional": true, "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^7.2.1", - "shellwords": "^0.1.1", - "uuid": "^7.0.3", - "which": "^2.0.2" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "optional": true + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, @@ -6143,7 +4699,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "optional": true }, "npm-run-path": { "version": "4.0.1", @@ -6154,18 +4711,6 @@ "path-key": "^3.0.0" } }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6249,9 +4794,9 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" @@ -6276,18 +4821,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -6392,12 +4925,6 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -6458,12 +4985,6 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -6475,24 +4996,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -6502,46 +5005,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "pretty-format": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.1.0.tgz", - "integrity": "sha512-GmeO1PEYdM+non4BKCj+XsPJjFOJIPnsLewqhDVoqY1xo0yNmDas7tC2XwpMrRAHR3MaE2hPo37deX5OisJ2Wg==", - "dev": true, - "requires": { - "@jest/types": "^26.1.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "private": { "version": "0.1.8", @@ -6566,16 +5030,6 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.4" - } - }, "proxy-agent": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", @@ -6602,12 +5056,6 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -6668,12 +5116,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -6716,12 +5158,6 @@ "unpipe": "1.0.0" } }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -6873,7 +5309,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "dev": true, + "optional": true }, "repeat-element": { "version": "1.1.3", @@ -6887,84 +5324,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6984,15 +5343,6 @@ "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -7016,12 +5366,6 @@ } } }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -7058,263 +5402,44 @@ "inherits": "^2.0.1" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, "run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" } }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "xmlchars": "^2.2.0" + "ret": "~0.1.10" } }, + "safe-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", + "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", @@ -7414,25 +5539,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -7675,29 +5787,6 @@ "extend-shallow": "^3.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -7707,23 +5796,6 @@ "figgy-pudding": "^3.5.1" } }, - "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -7750,12 +5822,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -7805,16 +5871,6 @@ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==" }, - "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -7838,18 +5894,6 @@ "ansi-regex": "^5.0.0" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -7864,55 +5908,12 @@ "has-flag": "^3.0.0" } }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, "terser": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", @@ -7957,28 +5958,11 @@ } } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -8003,12 +5987,6 @@ "setimmediate": "^1.0.4" } }, - "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -8066,24 +6044,103 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "ts-loader": { + "version": "8.0.18", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.18.tgz", + "integrity": "sha512-hRZzkydPX30XkLaQwJTDcWDoxZHK6IrEMDQpNd7tgcakFruFkeUp/aY+9hBb7BUGb+ZWKI0jiOGMo0MckwzdDQ==", "dev": true, "requires": { - "punycode": "^2.1.1" + "chalk": "^4.1.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "tslib": { @@ -8097,21 +6154,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -8120,12 +6162,6 @@ "prelude-ls": "~1.1.2" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -8138,15 +6174,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, "underscore": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", @@ -8338,38 +6365,12 @@ "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" }, - "uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", - "dev": true, - "optional": true - }, "v8-compile-cache": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, - "v8-to-istanbul": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", - "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -8380,50 +6381,12 @@ "spdx-expression-parse": "^3.0.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, "watchpack": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", @@ -8657,12 +6620,6 @@ } } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, "webpack": { "version": "4.44.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", @@ -9114,40 +7071,6 @@ "source-map": "~0.6.1" } }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", - "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9227,36 +7150,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", diff --git a/packages/insomnia-inso/package.json b/packages/insomnia-inso/package.json index fbebfa95a96..b6e10b14042 100644 --- a/packages/insomnia-inso/package.json +++ b/packages/insomnia-inso/package.json @@ -4,69 +4,60 @@ "homepage": "https://insomnia.rest", "description": "A CLI for Insomnia Designer - the collaborative API design tool.", "author": "Kong ", - "license": "Apache2", + "license": "Apache-2.0", "repository": "https://github.com/kong/insomnia/tree/develop/packages/insomnia-inso", "bugs": { "url": "https://github.com/kong/insomnia" }, + "main": "dist/index.js", + "types": "dist/index.d.ts", "bin": { "inso": "bin/inso" }, "scripts": { - "typecheck": "", - "test": "jest", + "bootstrap": "npm run build", + "lint": "eslint . --ext .js,.ts,.tsx", + "clean": "tsc --build tsconfig.build.json --clean", + "postclean": "rimraf dist", + "test": "jest --runInBand", "test:watch": "jest --watch", "test:snapshots": "npm run build && jest -u", - "build": "webpack --config webpack/webpack.config.development.js --display errors-only", + "prebuild": "npm run clean", + "build": "webpack --config webpack/webpack.config.development.js", "build:production": "webpack --config webpack/webpack.config.production.js --display errors-only", "start": "npm run build -- --watch", - "bootstrap": "npm run build", - "prepare": "npm run build:production" - }, - "jest": { - "setupFiles": [ - "./__jest__/setup.js" - ], - "testMatch": [ - "**/__tests__/**/*.test.js" - ], - "verbose": false, - "resetMocks": true, - "resetModules": true, - "collectCoverage": true, - "coveragePathIgnorePatterns": [ - "/node_modules/" - ], - "coverageThreshold": { - "global": { - "branches": 90, - "functions": 100, - "lines": 95, - "statements": 95 - } - } + "prepare-temp-disabled": "npm run build:production" }, "devDependencies": { "@babel/core": "^7.9.0", "@babel/plugin-proposal-optional-chaining": "^7.9.0", "@babel/preset-env": "^7.10.2", "@babel/preset-flow": "^7.10.1", - "execa": "^4.0.2", - "flow-bin": "^0.126.1", + "@types/babel__core": "^7.1.12", + "@types/babel__preset-env": "^7.9.1", + "@types/lodash.flattendeep": "^4.4.6", + "@types/mkdirp": "^1.0.1", + "@types/nedb": "^1.8.11", + "@types/node": "^14.14.32", + "@types/rimraf": "^3.0.0", + "@types/webpack-node-externals": "^2.5.0", + "@types/yaml": "^1.9.7", + "execa": "^5.0.0", "get-bin-path": "^5.1.0", - "jest": "^26.0.1", + "node-loader": "1.0.2", "rimraf": "^3.0.2", - "webpack": "^4.44.1", + "ts-loader": "^8.0.18", + "webpack": "4.44.1", "webpack-cli": "^3.3.12", "webpack-merge": "^5.0.7", "webpack-node-externals": "^1.7.2" }, "dependencies": { - "@stoplight/spectral": "^5.4.0", + "@stoplight/spectral": "5.4.0", "commander": "^5.1.0", "consola": "^2.15.0", "cosmiconfig": "^6.0.0", - "enquirer": "^2.3.5", + "enquirer": "^2.3.6", "insomnia-plugin-base64": "^2.2.24", "insomnia-plugin-cookie-jar": "^2.2.24", "insomnia-plugin-core-themes": "^2.2.29", diff --git a/packages/insomnia-inso/src/__mocks__/cosmiconfig.ts b/packages/insomnia-inso/src/__mocks__/cosmiconfig.ts new file mode 100644 index 00000000000..e73d850acd3 --- /dev/null +++ b/packages/insomnia-inso/src/__mocks__/cosmiconfig.ts @@ -0,0 +1,4 @@ +export const cosmiconfigSync = () => ({ + load: jest.fn(), + search: jest.fn(), +}); diff --git a/packages/insomnia-inso/src/__mocks__/util.js b/packages/insomnia-inso/src/__mocks__/util.ts similarity index 99% rename from packages/insomnia-inso/src/__mocks__/util.js rename to packages/insomnia-inso/src/__mocks__/util.ts index e33bd8239ba..41b314bc08f 100644 --- a/packages/insomnia-inso/src/__mocks__/util.js +++ b/packages/insomnia-inso/src/__mocks__/util.ts @@ -1,6 +1,5 @@ // eslint-disable-next-line filenames/match-exported const mod = jest.requireActual('../util'); - mod.exit = jest.fn(); module.exports = mod; diff --git a/packages/insomnia-inso/src/__tests__/__snapshots__/inso-snapshot.test.js.snap b/packages/insomnia-inso/src/__snapshots__/inso-snapshot.test.ts.snap similarity index 98% rename from packages/insomnia-inso/src/__tests__/__snapshots__/inso-snapshot.test.js.snap rename to packages/insomnia-inso/src/__snapshots__/inso-snapshot.test.ts.snap index 8121260067f..45909796398 100644 --- a/packages/insomnia-inso/src/__tests__/__snapshots__/inso-snapshot.test.js.snap +++ b/packages/insomnia-inso/src/__snapshots__/inso-snapshot.test.ts.snap @@ -163,8 +163,8 @@ Run Insomnia unit test suites Options: -e, --env environment to use -t, --testNamePattern run tests that match the regex - -r, --reporter reporter to use, options are [dot, list, spec, - min, progress] (default: spec) + -r, --reporter reporter to use, options are [dot, list, min, + progress, spec] (default: spec) -b, --bail abort (\\"bail\\") after first test failure --keepFile do not delete the generated test file -h, --help display help for command" diff --git a/packages/insomnia-inso/src/__tests__/cli.test.js b/packages/insomnia-inso/src/cli.test.ts similarity index 85% rename from packages/insomnia-inso/src/__tests__/cli.test.js rename to packages/insomnia-inso/src/cli.test.ts index ce8e3183ff1..702f2ef3efb 100644 --- a/packages/insomnia-inso/src/__tests__/cli.test.js +++ b/packages/insomnia-inso/src/cli.test.ts @@ -1,26 +1,24 @@ -// @flow -import * as cli from '../cli'; -import { generateConfig } from '../commands/generate-config'; -import { lintSpecification } from '../commands/lint-specification'; -import { runInsomniaTests } from '../commands/run-tests'; -import { exportSpecification } from '../commands/export-specification'; +import * as cli from './cli'; +import { generateConfig } from './commands/generate-config'; +import { lintSpecification } from './commands/lint-specification'; +import { runInsomniaTests } from './commands/run-tests'; +import { exportSpecification } from './commands/export-specification'; import { parseArgsStringToArgv } from 'string-argv'; -import * as packageJson from '../../package.json'; -import { globalBeforeAll, globalBeforeEach } from '../../__jest__/before'; -import logger from '../logger'; -import { exit } from '../util'; - -jest.mock('../commands/generate-config'); -jest.mock('../commands/lint-specification'); -jest.mock('../commands/run-tests'); -jest.mock('../commands/export-specification'); +import * as packageJson from '../package.json'; +import { globalBeforeAll, globalBeforeEach } from './jest/before'; +import { logger } from './logger'; +import { exit } from './util'; + +jest.mock('./commands/generate-config'); +jest.mock('./commands/lint-specification'); +jest.mock('./commands/run-tests'); +jest.mock('./commands/export-specification'); jest.unmock('cosmiconfig'); -jest.mock('../util'); +jest.mock('./util'); const initInso = () => { return (...args: Array): void => { const cliArgs = parseArgsStringToArgv(`node test ${args.join(' ')}`); - return cli.go(cliArgs, true); }; }; @@ -31,14 +29,15 @@ describe('cli', () => { }); let inso = initInso(); + beforeEach(() => { globalBeforeEach(); inso = initInso(); jest.spyOn(console, 'error').mockImplementation(() => {}); - (generateConfig: any).mockResolvedValue(true); - (lintSpecification: any).mockResolvedValue(true); - (runInsomniaTests: any).mockResolvedValue(true); - (exportSpecification: any).mockResolvedValue(true); + generateConfig.mockResolvedValue(true); + lintSpecification.mockResolvedValue(true); + runInsomniaTests.mockResolvedValue(true); + exportSpecification.mockResolvedValue(true); }); afterEach(() => { @@ -53,27 +52,25 @@ describe('cli', () => { it('should throw error if working dir argument is missing', () => { expect(() => inso('-w')).toThrowError(); }); - it.each(['-v', '--version'])('inso %s should print version from package.json', args => { logger.wrapAll(); expect(() => inso(args)).toThrowError(packageJson.version); logger.restoreAll(); }); - it.each(['-v', '--version'])('inso %s should print "dev" if running in development', args => { const oldNodeEnv = process.env.NODE_ENV; - process.env.NODE_ENV = 'development'; logger.wrapAll(); expect(() => inso(args)).toThrowError('dev'); logger.restoreAll(); - process.env.NODE_ENV = oldNodeEnv; }); it('should print options', () => { inso('generate config file.yaml -t declarative --printOptions --verbose'); + const logs = logger.__getLogs(); + expect(logs.log[0]).toContainEqual({ type: 'declarative', printOptions: true, @@ -152,7 +149,9 @@ describe('cli', () => { describe('run test', () => { it('should call runInsomniaTests with no arg and default reporter', () => { inso('run test'); - expect(runInsomniaTests).toHaveBeenCalledWith(undefined, { reporter: 'spec' }); + expect(runInsomniaTests).toHaveBeenCalledWith(undefined, { + reporter: 'spec', + }); }); it('should throw error if env argument is missing', () => { @@ -199,7 +198,9 @@ describe('cli', () => { it('should call exportSpec with all expected arguments', () => { inso('export spec spc_123 -o output.yaml'); - expect(exportSpecification).toHaveBeenCalledWith('spc_123', { output: 'output.yaml' }); + expect(exportSpecification).toHaveBeenCalledWith('spc_123', { + output: 'output.yaml', + }); }); it('should call generateConfig with global options', () => { @@ -214,26 +215,30 @@ describe('cli', () => { }); describe('script', () => { - const insorcFilePath = '--config src/__fixtures__/.insorc-with-scripts.yaml'; + const insorcFilePath = '--config src/fixtures/.insorc-with-scripts.yaml'; const expectExitWith = async (result: boolean): Promise => - expect((exit: Object).mock.calls[0][0]).resolves.toBe(result); + expect( + (exit as jest.Mock).mock.calls[0][0], + ).resolves.toBe(result); it('should call script command by default', () => { inso('gen-conf', insorcFilePath); - expect(generateConfig).toHaveBeenCalledWith( 'Designer Demo', - expect.objectContaining({ type: 'declarative' }), + expect.objectContaining({ + type: 'declarative', + }), ); }); it('should call script command', () => { inso('script gen-conf', insorcFilePath); - expect(generateConfig).toHaveBeenCalledWith( 'Designer Demo', - expect.objectContaining({ type: 'declarative' }), + expect.objectContaining({ + type: 'declarative', + }), ); }); @@ -241,6 +246,7 @@ describe('cli', () => { inso('invalid-script', insorcFilePath); const logs = logger.__getLogs(); + expect(logs.fatal).toContain('Tasks in a script should start with `inso`.'); expect(generateConfig).not.toHaveBeenCalledWith(); await expectExitWith(false); @@ -248,13 +254,15 @@ describe('cli', () => { it('should call nested command', async () => { inso('gen-conf:k8s', insorcFilePath); - expect(generateConfig).toHaveBeenCalledWith( 'Designer Demo', - expect.objectContaining({ type: 'kubernetes' }), + expect.objectContaining({ + type: 'kubernetes', + }), ); const logs = logger.__getLogs(); + expect(logs.debug).toEqual([ '>> inso gen-conf --type kubernetes', '>> inso generate config Designer Demo --type declarative --type kubernetes', @@ -264,17 +272,17 @@ describe('cli', () => { it('should call nested command and pass through props', async () => { inso('gen-conf:k8s --type declarative', insorcFilePath); - expect(generateConfig).toHaveBeenCalledWith( 'Designer Demo', - expect.objectContaining({ type: 'declarative' }), + expect.objectContaining({ + type: 'declarative', + }), ); await expectExitWith(true); }); it('should override env setting from command', async () => { inso('test:200s --env NewEnv', insorcFilePath); - expect(runInsomniaTests).toHaveBeenCalledWith( 'Designer Demo', expect.objectContaining({ @@ -286,7 +294,9 @@ describe('cli', () => { it('should fail if script not found', async () => { inso('not-found-script', insorcFilePath); + const logs = logger.__getLogs(); + expect(logs.fatal).toContain( 'Could not find inso script "not-found-script" in the config file.', ); diff --git a/packages/insomnia-inso/src/cli.js b/packages/insomnia-inso/src/cli.ts old mode 100755 new mode 100644 similarity index 54% rename from packages/insomnia-inso/src/cli.js rename to packages/insomnia-inso/src/cli.ts index aec5875dea0..5f571a8e10d --- a/packages/insomnia-inso/src/cli.js +++ b/packages/insomnia-inso/src/cli.ts @@ -1,59 +1,54 @@ -// @flow -import { ConversionTypeMap, generateConfig } from './commands/generate-config'; +import { conversionTypeMap, generateConfig } from './commands/generate-config'; import { getVersion, logErrorExit1, exit } from './util'; -import { runInsomniaTests, TestReporterEnum } from './commands/run-tests'; +import { reporterTypes, runInsomniaTests, TestReporter } from './commands/run-tests'; import { lintSpecification } from './commands/lint-specification'; import { exportSpecification } from './commands/export-specification'; import { parseArgsStringToArgv } from 'string-argv'; import commander from 'commander'; -import getOptions from './get-options'; -import logger, { configureLogger } from './logger'; +import { logger, configureLogger } from './logger'; import type { GenerateConfigOptions } from './commands/generate-config'; import type { RunTestsOptions } from './commands/run-tests'; import type { LintSpecificationOptions } from './commands/lint-specification'; import type { ExportSpecificationOptions } from './commands/export-specification'; -import type { GlobalOptions } from './get-options'; +import { getOptions } from './get-options'; +import { UNKNOWN_OBJ } from './types'; -type CreateCommandType = (command?: string, options?: Object) => Object; - -function prepareCommand(options: $Shape): void { +const prepareCommand = (options: Partial) => { configureLogger(options.verbose, options.ci); - options.printOptions && logger.log(`Loaded options`, options, '\n'); -} + options.printOptions && logger.log('Loaded options', options, '\n'); + return options; +}; -function makeGenerateCommand(createCommand: CreateCommandType) { - // inso generate - const generate = createCommand('generate').description('Code generation utilities'); +type CreateCommand = (command: string) => commander.Command - const conversionTypes = Object.keys(ConversionTypeMap).join(', '); +const makeGenerateCommand = (commandCreator: CreateCommand) => { + // inso generate + const command = commandCreator('generate').description('Code generation utilities'); + const defaultType = 'declarative'; // inso generate config -t kubernetes config.yaml - const defaultType = 'declarative'; - // inso generate config -t kubernetes config.yaml - generate + command .command('config [identifier]') .description('Generate configuration from an api spec.') .option( '-t, --type ', - `type of configuration to generate, options are [${conversionTypes}] (default: ${defaultType})`, + `type of configuration to generate, options are [${Object.keys(conversionTypeMap).join(', ')}] (default: ${defaultType})`, ) .option('-o, --output ', 'save the generated config to a file') .action((identifier, cmd) => { - const options = getOptions(cmd, { type: defaultType }); - prepareCommand(options); + let options = getOptions(cmd, { + type: defaultType, + }); + options = prepareCommand(options); return exit(generateConfig(identifier, options)); }); + return command; +}; - return generate; -} - -function makeTestCommand(createCommand: CreateCommandType) { +const makeTestCommand = (commandCreator: CreateCommand) => { // inso run - const run = createCommand('run').description('Execution utilities'); - - const reporterTypes = Object.keys(TestReporterEnum).join(', '); + const run = commandCreator('run').description('Execution utilities'); + const defaultReporter: TestReporter = 'spec'; // inso run tests - const defaultReporter = TestReporterEnum.spec; - // inso run tests run .command('test [identifier]') .description('Run Insomnia unit test suites') @@ -61,64 +56,64 @@ function makeTestCommand(createCommand: CreateCommandType) { .option('-t, --testNamePattern ', 'run tests that match the regex') .option( '-r, --reporter ', - `reporter to use, options are [${reporterTypes}] (default: ${defaultReporter})`, + `reporter to use, options are [${reporterTypes.join(', ')}] (default: ${defaultReporter})`, ) .option('-b, --bail', 'abort ("bail") after first test failure') .option('--keepFile', 'do not delete the generated test file') .action((identifier, cmd) => { - const options = getOptions(cmd, { reporter: defaultReporter }); - prepareCommand(options); + let options = getOptions(cmd, { + reporter: defaultReporter, + }); + options = prepareCommand(options); return exit(runInsomniaTests(identifier, options)); }); - return run; -} +}; -function makeLintCommand(createCommand: CreateCommandType) { +const makeLintCommand = (commandCreator: CreateCommand) => { // inso lint - const lint = createCommand('lint').description('Linting utilities'); + const lint = commandCreator('lint').description('Linting utilities'); // inso lint spec - // inso lint spec lint .command('spec [identifier]') .description('Lint an API Specification') .action((identifier, cmd) => { - const options = getOptions(cmd); - prepareCommand(options); + let options = getOptions(cmd); + options = prepareCommand(options); return exit(lintSpecification(identifier, options)); }); - return lint; -} +}; -function makeExportCommand(createCommand: CreateCommandType) { +const makeExportCommand = (commandCreator: CreateCommand) => { // inso export - const exportCmd = createCommand('export').description('Export data from insomnia models'); + const exportCmd = commandCreator('export').description('Export data from insomnia models'); // inso export spec - // inso export spec exportCmd .command('spec [identifier]') .description('Export an API Specification to a file') .option('-o, --output ', 'save the generated config to a file') .action((identifier, cmd) => { - const options = getOptions(cmd); - prepareCommand(options); + let options = getOptions(cmd); + options = prepareCommand(options); return exit(exportSpecification(identifier, options)); }); - return exportCmd; -} +}; -function addScriptCommand(originalCommand: Object) { +const addScriptCommand = (originalCommand: commander.Command) => { // inso script originalCommand - .command('script ', { isDefault: true }) + .command('script ', { + isDefault: true, + }) .description('Run scripts defined in .insorc') .allowUnknownOption() + // @ts-expect-error this appears to actually be valid, and I don't want to risk changing any behavior .action((scriptName, cmd) => { // Load scripts - const options = getOptions(cmd); - prepareCommand(options); + let options = getOptions(cmd); + options = prepareCommand(options); // Ignore the first arg because that will be scriptName, get the rest const passThroughArgs = cmd.args.slice(1); @@ -128,29 +123,28 @@ function addScriptCommand(originalCommand: Object) { if (!scriptTask) { logger.fatal(`Could not find inso script "${scriptName}" in the config file.`); - return exit(new Promise(resolve => resolve(false))); + return exit(new Promise((resolve) => resolve(false))); } if (!scriptTask.startsWith('inso')) { logger.fatal('Tasks in a script should start with `inso`.'); - return exit(new Promise(resolve => resolve(false))); + return exit(new Promise((resolve) => resolve(false))); } // Collect args - const scriptArgs: Array = parseArgsStringToArgv( + const scriptArgs: string[] = parseArgsStringToArgv( `self ${scriptTask} ${passThroughArgs.join(' ')}`, ); // Print command - logger.debug(`>> ${scriptArgs.slice(1).join(' ')}`); + logger.debug(`>> ${scriptArgs.slice(1).join(' ')}`); // Run - // Run runWithArgs(originalCommand, scriptArgs); }); -} +}; -export function go(args?: Array, exitOverride?: boolean): void { - const createCommand: CreateCommandType = (cmd?: string) => { +export const go = (args?: string[], exitOverride?: boolean) => { + const commandCreator = (cmd?: string) => { const command = new commander.Command(cmd).storeOptionsAsProperties(false); if (exitOverride) { @@ -163,10 +157,12 @@ export function go(args?: Array, exitOverride?: boolean): void { configureLogger(); // inso - const cmd = createCommand(); + const cmd = commandCreator(); // Version and description - cmd.version(getVersion(), '-v, --version').description('A CLI for Insomnia!'); + cmd + .version(getVersion(), '-v, --version') + .description('A CLI for Insomnia!'); // Global options cmd @@ -179,17 +175,19 @@ export function go(args?: Array, exitOverride?: boolean): void { // Add commands and sub commands cmd - .addCommand(makeGenerateCommand(createCommand)) - .addCommand(makeTestCommand(createCommand)) - .addCommand(makeLintCommand(createCommand)) - .addCommand(makeExportCommand(createCommand)); + .addCommand(makeGenerateCommand(commandCreator)) + .addCommand(makeTestCommand(commandCreator)) + .addCommand(makeLintCommand(commandCreator)) + .addCommand(makeExportCommand(commandCreator)); // Add script base command addScriptCommand(cmd); - runWithArgs(cmd, args || process.argv); -} +}; -function runWithArgs(cmd: Object, args: Array) { +const runWithArgs = ( + cmd: UNKNOWN_OBJ, + args: string[], +) => { cmd.parseAsync(args).catch(logErrorExit1); -} +}; diff --git a/packages/insomnia-inso/src/commands/__mocks__/insomnia-send-request.ts b/packages/insomnia-inso/src/commands/__mocks__/insomnia-send-request.ts new file mode 100644 index 00000000000..0aa8122210d --- /dev/null +++ b/packages/insomnia-inso/src/commands/__mocks__/insomnia-send-request.ts @@ -0,0 +1 @@ +export const getSendRequestCallbackMemDb = jest.fn().mockResolvedValue(jest.fn()); diff --git a/packages/insomnia-inso/src/commands/__mocks__/insomnia-testing.ts b/packages/insomnia-inso/src/commands/__mocks__/insomnia-testing.ts new file mode 100644 index 00000000000..6421443cb70 --- /dev/null +++ b/packages/insomnia-inso/src/commands/__mocks__/insomnia-testing.ts @@ -0,0 +1,4 @@ +export const generate = jest.fn(); +export const generateToFile = jest.fn(); +export const runTests = jest.fn(); +export const runTestsCli = jest.fn(); diff --git a/packages/insomnia-inso/__mocks__/openapi-2-kong.js b/packages/insomnia-inso/src/commands/__mocks__/openapi-2-kong.ts similarity index 56% rename from packages/insomnia-inso/__mocks__/openapi-2-kong.js rename to packages/insomnia-inso/src/commands/__mocks__/openapi-2-kong.ts index 4769eb8f50d..3f84db26f88 100644 --- a/packages/insomnia-inso/__mocks__/openapi-2-kong.js +++ b/packages/insomnia-inso/src/commands/__mocks__/openapi-2-kong.ts @@ -1,7 +1,5 @@ -const mod = jest.requireActual('openapi-2-kong'); - module.exports = { - ...mod, + ...jest.requireActual('openapi-2-kong'), generate: jest.fn(), generateFromString: jest.fn(), }; diff --git a/packages/insomnia-inso/src/commands/__tests__/export-specification.test.js b/packages/insomnia-inso/src/commands/export-specification.test.ts similarity index 76% rename from packages/insomnia-inso/src/commands/__tests__/export-specification.test.js rename to packages/insomnia-inso/src/commands/export-specification.test.ts index bd1ff5168d8..78ce4b44321 100644 --- a/packages/insomnia-inso/src/commands/__tests__/export-specification.test.js +++ b/packages/insomnia-inso/src/commands/export-specification.test.ts @@ -1,30 +1,30 @@ -// @flow -import { exportSpecification } from '../export-specification'; -import { writeFileWithCliOptions } from '../../write-file'; -import { globalBeforeAll, globalBeforeEach } from '../../../__jest__/before'; -import logger from '../../logger'; +import { exportSpecification } from './export-specification'; +import { writeFileWithCliOptions } from '../write-file'; +import { globalBeforeAll, globalBeforeEach } from '../jest/before'; +import { logger } from '../logger'; +import { UNKNOWN } from '../types'; -jest.mock('../../write-file'); +jest.mock('../write-file'); describe('exportSpecification()', () => { beforeAll(() => { globalBeforeAll(); }); + beforeEach(() => { globalBeforeEach(); }); - // make flow happy - const mock = (mockFn: any) => mockFn; + const mock = (mockFn: UNKNOWN) => mockFn; + afterEach(() => { jest.restoreAllMocks(); }); it('should load identifier from database', async () => { const result = await exportSpecification('spc_46c5a4a40e83445a9bd9d9758b86c16c', { - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', }); - expect(result).toBe(true); expect(writeFileWithCliOptions).not.toHaveBeenCalled(); expect(logger.__getLogs().log).toEqual([expect.stringContaining("openapi: '3.0.2")]); @@ -33,34 +33,27 @@ describe('exportSpecification()', () => { it('should output document to a file', async () => { const outputPath = 'this-is-the-output-path'; mock(writeFileWithCliOptions).mockResolvedValue(outputPath); - const options = { output: 'output.yaml', - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', }; - const result = await exportSpecification('spc_46c5a4a40e83445a9bd9d9758b86c16c', options); - expect(result).toBe(true); - expect(writeFileWithCliOptions).toHaveBeenCalledWith( options.output, expect.stringContaining("openapi: '3.0.2"), options.workingDir, ); - expect(logger.__getLogs().log).toEqual([`Specification exported to "${outputPath}".`]); }); it('should throw if writing file returns error', async () => { const error = new Error('error message'); mock(writeFileWithCliOptions).mockRejectedValue(error); - const options = { output: 'output.yaml', - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', }; - await expect( exportSpecification('spc_46c5a4a40e83445a9bd9d9758b86c16c', options), ).rejects.toThrowError(error); @@ -68,9 +61,8 @@ describe('exportSpecification()', () => { it('should return false if spec could not be found', async () => { const result = await exportSpecification('not-found', { - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', }); - expect(result).toBe(false); expect(logger.__getLogs().fatal).toEqual(['Specification not found.']); }); diff --git a/packages/insomnia-inso/src/commands/export-specification.js b/packages/insomnia-inso/src/commands/export-specification.ts similarity index 76% rename from packages/insomnia-inso/src/commands/export-specification.js rename to packages/insomnia-inso/src/commands/export-specification.ts index 139a42885b0..1b27d90e915 100644 --- a/packages/insomnia-inso/src/commands/export-specification.js +++ b/packages/insomnia-inso/src/commands/export-specification.ts @@ -1,24 +1,26 @@ -// @flow import type { GlobalOptions } from '../get-options'; import { loadDb } from '../db'; import { loadApiSpec, promptApiSpec } from '../db/models/api-spec'; import { writeFileWithCliOptions } from '../write-file'; -import logger from '../logger'; +import { logger } from '../logger'; export type ExportSpecificationOptions = GlobalOptions & { - output?: string, + output?: string; }; export async function exportSpecification( - identifier: ?string, + identifier: string | null | undefined, { output, workingDir, appDataDir, ci }: ExportSpecificationOptions, ): Promise { - const db = await loadDb({ workingDir, appDataDir, filterTypes: ['ApiSpec'] }); - + const db = await loadDb({ + workingDir, + appDataDir, + filterTypes: ['ApiSpec'], + }); const specFromDb = identifier ? loadApiSpec(db, identifier) : await promptApiSpec(db, !!ci); if (!specFromDb) { - logger.fatal(`Specification not found.`); + logger.fatal('Specification not found.'); return false; } diff --git a/packages/insomnia-inso/src/commands/__fixtures__/openapi-spec.yaml b/packages/insomnia-inso/src/commands/fixtures/openapi-spec.yaml similarity index 100% rename from packages/insomnia-inso/src/commands/__fixtures__/openapi-spec.yaml rename to packages/insomnia-inso/src/commands/fixtures/openapi-spec.yaml diff --git a/packages/insomnia-inso/src/commands/__tests__/generate-config.test.js b/packages/insomnia-inso/src/commands/generate-config.test.ts similarity index 70% rename from packages/insomnia-inso/src/commands/__tests__/generate-config.test.js rename to packages/insomnia-inso/src/commands/generate-config.test.ts index 1cc48eb4fd6..b1441bdf184 100644 --- a/packages/insomnia-inso/src/commands/__tests__/generate-config.test.js +++ b/packages/insomnia-inso/src/commands/generate-config.test.ts @@ -1,26 +1,26 @@ -// @flow -import { ConversionTypeMap, generateConfig } from '../generate-config'; +import { conversionTypeMap, generateConfig, GenerateConfigOptions } from './generate-config'; import o2k from 'openapi-2-kong'; import path from 'path'; -import { writeFileWithCliOptions } from '../../write-file'; -import { globalBeforeAll, globalBeforeEach } from '../../../__jest__/before'; -import logger from '../../logger'; -import { InsoError } from '../../errors'; +import { writeFileWithCliOptions } from '../write-file'; +import { globalBeforeAll, globalBeforeEach } from '../jest/before'; +import { logger } from '../logger'; +import { InsoError } from '../errors'; import os from 'os'; +import { UNKNOWN } from '../types'; jest.mock('openapi-2-kong'); -jest.mock('../../write-file'); +jest.mock('../write-file'); describe('generateConfig()', () => { beforeAll(() => { globalBeforeAll(); }); + beforeEach(() => { globalBeforeEach(); }); - // make flow happy - const mock = (mockFn: any) => mockFn; + const mock = (mockFn: UNKNOWN) => mockFn; afterEach(() => { jest.restoreAllMocks(); @@ -29,8 +29,10 @@ describe('generateConfig()', () => { const filePath = 'file.yaml'; it('should should not generate if type arg is invalid', async () => { - await generateConfig(filePath, { type: 'invalid' }); - + await generateConfig(filePath, { + // @ts-expect-error intentionally invalid input + type: 'invalid', + }); expect(o2k.generate).not.toHaveBeenCalled(); expect(logger.__getLogs().fatal).toEqual([ 'Config type "invalid" not unrecognized. Options are [kubernetes, declarative].', @@ -38,130 +40,118 @@ describe('generateConfig()', () => { }); it('should print conversion documents to console', async () => { - mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); - - await generateConfig(filePath, { type: 'kubernetes' }); - - expect(o2k.generate).toHaveBeenCalledWith(filePath, ConversionTypeMap.kubernetes); + mock(o2k.generate).mockResolvedValue({ + documents: ['a', 'b'], + }); + await generateConfig(filePath, { + type: 'kubernetes', + }); + expect(o2k.generate).toHaveBeenCalledWith(filePath, conversionTypeMap.kubernetes); expect(logger.__getLogs().log).toEqual(['a\n---\nb\n']); }); it('should load identifier from database', async () => { - mock(o2k.generateFromString).mockResolvedValue({ documents: ['a', 'b'] }); - + mock(o2k.generateFromString).mockResolvedValue({ + documents: ['a', 'b'], + }); await generateConfig('spc_46c5a4a40e83445a9bd9d9758b86c16c', { type: 'kubernetes', - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', }); - expect(o2k.generateFromString).toHaveBeenCalled(); expect(logger.__getLogs().log).toEqual(['a\n---\nb\n']); }); it('should output generated document to a file', async () => { - mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); + mock(o2k.generate).mockResolvedValue({ + documents: ['a', 'b'], + }); const outputPath = 'this-is-the-output-path'; mock(writeFileWithCliOptions).mockResolvedValue(outputPath); - - const options = { + const options: Partial = { type: 'kubernetes', output: 'output.yaml', workingDir: 'working/dir', }; - const result = await generateConfig(filePath, options); - expect(result).toBe(true); - expect(writeFileWithCliOptions).toHaveBeenCalledWith( options.output, 'a\n---\nb\n', options.workingDir, ); - expect(logger.__getLogs().log).toEqual([`Configuration generated to "${outputPath}".`]); }); it('should return false if failed to write file', async () => { - mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); + mock(o2k.generate).mockResolvedValue({ + documents: ['a', 'b'], + }); const error = new Error('error message'); - mock(writeFileWithCliOptions).mockRejectedValue(error); - - const options = { + const options: Partial = { type: 'kubernetes', output: 'output.yaml', workingDir: 'working/dir', }; - const result = generateConfig(filePath, options); - await expect(result).rejects.toThrowError(error); }); it('should generate documents using workingDir', async () => { - mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); + mock(o2k.generate).mockResolvedValue({ + documents: ['a', 'b'], + }); const outputPath = 'this-is-the-output-path'; mock(writeFileWithCliOptions).mockResolvedValue(outputPath); - const result = await generateConfig('file.yaml', { type: 'kubernetes', workingDir: 'test/dir', output: 'output.yaml', }); + expect(result).toBe(true); // Read from workingDir - expect(result).toBe(true); - - // Read from workingDir expect(o2k.generate).toHaveBeenCalledWith( path.normalize('test/dir/file.yaml'), - ConversionTypeMap.kubernetes, + conversionTypeMap.kubernetes, ); - expect(logger.__getLogs().log).toEqual([`Configuration generated to "${outputPath}".`]); }); it('should generate documents using absolute path', async () => { - mock(o2k.generate).mockResolvedValue({ documents: ['a', 'b'] }); + mock(o2k.generate).mockResolvedValue({ + documents: ['a', 'b'], + }); const outputPath = 'this-is-the-output-path'; mock(writeFileWithCliOptions).mockResolvedValue(outputPath); - const absolutePath = path.join(os.tmpdir(), 'dev', 'file.yaml'); - const result = await generateConfig(absolutePath, { type: 'kubernetes', workingDir: 'test/dir', output: 'output.yaml', }); + expect(result).toBe(true); // Read from workingDir - expect(result).toBe(true); - - // Read from workingDir - expect(o2k.generate).toHaveBeenCalledWith(absolutePath, ConversionTypeMap.kubernetes); - + expect(o2k.generate).toHaveBeenCalledWith(absolutePath, conversionTypeMap.kubernetes); expect(logger.__getLogs().log).toEqual([`Configuration generated to "${outputPath}".`]); }); it('should throw InsoError if there is an error thrown by openapi-2-kong', async () => { const error = new Error('err'); mock(o2k.generate).mockRejectedValue(error); - const promise = generateConfig('file.yaml', { type: 'kubernetes', }); - await expect(promise).rejects.toThrowError( - new InsoError(`There was an error while generating configuration`, error), + new InsoError('There was an error while generating configuration', error), ); }); it('should warn if no valid spec can be found', async () => { mock(o2k.generate).mockResolvedValue({}); - const result = await generateConfig('file.yaml', { type: 'kubernetes', }); - expect(result).toBe(false); expect(logger.__getLogs().log).toEqual([ 'Could not find a valid specification to generate configuration.', diff --git a/packages/insomnia-inso/src/commands/generate-config.js b/packages/insomnia-inso/src/commands/generate-config.ts similarity index 57% rename from packages/insomnia-inso/src/commands/generate-config.js rename to packages/insomnia-inso/src/commands/generate-config.ts index 7659399e126..30d72fb81ad 100644 --- a/packages/insomnia-inso/src/commands/generate-config.js +++ b/packages/insomnia-inso/src/commands/generate-config.ts @@ -1,45 +1,54 @@ -// @flow -import * as o2k from 'openapi-2-kong'; +import { ConversionResult, ConversionResultType, generate, generateFromString } from 'openapi-2-kong'; import YAML from 'yaml'; import path from 'path'; import type { GlobalOptions } from '../get-options'; import { loadDb } from '../db'; import { loadApiSpec, promptApiSpec } from '../db/models/api-spec'; import { writeFileWithCliOptions } from '../write-file'; -import logger from '../logger'; +import { logger } from '../logger'; import { InsoError } from '../errors'; -export const ConversionTypeMap: { [string]: ConversionResultType } = { +export const conversionTypeMap = { kubernetes: 'kong-for-kubernetes', declarative: 'kong-declarative-config', -}; +} as const; + +export const conversionTypes: ConversionResultType[] = [ + 'kong-declarative-config', + 'kong-for-kubernetes', +]; export type GenerateConfigOptions = GlobalOptions & { - type: $Keys, - output?: string, + type: keyof (typeof conversionTypeMap); + output?: string; }; -function validateOptions({ type }: GenerateConfigOptions): boolean { - if (!ConversionTypeMap[type]) { - const conversionTypes = Object.keys(ConversionTypeMap).join(', '); - logger.fatal(`Config type "${type}" not unrecognized. Options are [${conversionTypes}].`); +const validateOptions = ( + options: Partial = {}, +): options is Partial & Pick => { + const { type } = options; + if (!type || !conversionTypeMap[type]) { + logger.fatal(`Config type "${type}" not unrecognized. Options are [${Object.keys(conversionTypeMap).join(', ')}].`); return false; } return true; -} +}; -export async function generateConfig( - identifier: ?string, - options: GenerateConfigOptions, -): Promise { +export const generateConfig = async ( + identifier: string | null | undefined, + options: Partial, +) => { if (!validateOptions(options)) { return false; } const { type, output, appDataDir, workingDir, ci } = options; - - const db = await loadDb({ workingDir, appDataDir, filterTypes: ['ApiSpec'] }); + const db = await loadDb({ + workingDir, + appDataDir, + filterTypes: ['ApiSpec'], + }); let result: ConversionResult | null = null; @@ -49,27 +58,25 @@ export async function generateConfig( try { if (specFromDb?.contents) { logger.trace('Generating config from database contents'); - result = await o2k.generateFromString(specFromDb.contents, ConversionTypeMap[type]); + result = await generateFromString(specFromDb.contents, conversionTypeMap[type]); } else if (identifier) { // try load as a file const fileName = path.isAbsolute(identifier) ? identifier : path.join(workingDir || '.', identifier); logger.trace(`Generating config from file \`${fileName}\``); - result = await o2k.generate(fileName, ConversionTypeMap[type]); + result = await generate(fileName, conversionTypeMap[type]); } } catch (e) { - throw new InsoError(`There was an error while generating configuration`, e); + throw new InsoError('There was an error while generating configuration', e); } - if (!result?.documents) { + if (!result?.documents || !Array.isArray(result.documents)) { logger.log('Could not find a valid specification to generate configuration.'); - return false; } - const yamlDocs = result.documents.map(d => YAML.stringify(d)); - + const yamlDocs = result.documents.map(document => YAML.stringify(document)); // Join the YAML docs with "---" and strip any extra newlines surrounding them const document = yamlDocs.join('\n---\n').replace(/\n+---\n+/g, '\n---\n'); @@ -81,4 +88,4 @@ export async function generateConfig( } return true; -} +}; diff --git a/packages/insomnia-inso/src/commands/__tests__/lint-specification.test.js b/packages/insomnia-inso/src/commands/lint-specification.test.ts similarity index 76% rename from packages/insomnia-inso/src/commands/__tests__/lint-specification.test.js rename to packages/insomnia-inso/src/commands/lint-specification.test.ts index 624f50eb3b4..5369796bec8 100644 --- a/packages/insomnia-inso/src/commands/__tests__/lint-specification.test.js +++ b/packages/insomnia-inso/src/commands/lint-specification.test.ts @@ -1,8 +1,7 @@ -// @flow import path from 'path'; -import { lintSpecification } from '../lint-specification'; -import { globalBeforeAll, globalBeforeEach } from '../../../__jest__/before'; -import logger from '../../logger'; +import { lintSpecification } from './lint-specification'; +import { globalBeforeAll, globalBeforeEach } from '../jest/before'; +import { logger } from '../logger'; describe('lint specification', () => { beforeAll(() => { @@ -11,63 +10,52 @@ describe('lint specification', () => { beforeEach(() => { globalBeforeEach(); }); - afterEach(() => { jest.restoreAllMocks(); }); - it('should return true for linting passed', async () => { const result = await lintSpecification('spc_46c5a4a40e83445a9bd9d9758b86c16c', { - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', }); - expect(result).toBe(true); }); - it('should lint specification from file with relative path', async () => { const result = await lintSpecification('openapi-spec.yaml', { - workingDir: 'src/commands/__fixtures__', + workingDir: 'src/commands/fixtures', }); - expect(result).toBe(true); }); - it('should lint specification from file with relative path and no working directory', async () => { - const result = await lintSpecification('src/commands/__fixtures__/openapi-spec.yaml', {}); - + const result = await lintSpecification('src/commands/fixtures/openapi-spec.yaml', {}); expect(result).toBe(true); }); - it('should lint specification from file with absolute path', async () => { - const directory = path.join(process.cwd(), 'src/commands/__fixtures__'); + const directory = path.join(process.cwd(), 'src/commands/fixtures'); const result = await lintSpecification(path.join(directory, 'openapi-spec.yaml'), { workingDir: 'src', }); - expect(result).toBe(true); }); - it('should return false for linting failed', async () => { const result = await lintSpecification('spc_46c5a4a40e83445a9bd9d9758b86c16c', { - workingDir: 'src/db/__fixtures__/git-repo-malformed-spec', + workingDir: 'src/db/fixtures/git-repo-malformed-spec', }); - expect(result).toBe(false); }); - it('should return false if spec could not be found', async () => { const result = await lintSpecification('not-found', {}); - expect(result).toBe(false); + const logs = logger.__getLogs(); + expect(logs.fatal).toContain('Failed to read "not-found"'); }); - it('should return false if spec was not specified', async () => { const result = await lintSpecification('', {}); - expect(result).toBe(false); + const logs = logger.__getLogs(); + expect(logs.fatal).toContain('Specification not found.'); }); }); diff --git a/packages/insomnia-inso/src/commands/lint-specification.js b/packages/insomnia-inso/src/commands/lint-specification.ts similarity index 83% rename from packages/insomnia-inso/src/commands/lint-specification.js rename to packages/insomnia-inso/src/commands/lint-specification.ts index 24c505d54fb..fe1c8125a09 100644 --- a/packages/insomnia-inso/src/commands/lint-specification.js +++ b/packages/insomnia-inso/src/commands/lint-specification.ts @@ -1,9 +1,8 @@ -// @flow import { Spectral } from '@stoplight/spectral'; import type { GlobalOptions } from '../get-options'; import { loadDb } from '../db'; import { loadApiSpec, promptApiSpec } from '../db/models/api-spec'; -import logger from '../logger'; +import { logger } from '../logger'; import { InsoError } from '../errors'; import fs from 'fs'; import path from 'path'; @@ -11,14 +10,17 @@ import path from 'path'; export type LintSpecificationOptions = GlobalOptions; export async function lintSpecification( - identifier: ?string, + identifier: string | null | undefined, { workingDir, appDataDir, ci }: LintSpecificationOptions, ): Promise { - const db = await loadDb({ workingDir, appDataDir, filterTypes: ['ApiSpec'] }); + const db = await loadDb({ + workingDir, + appDataDir, + filterTypes: ['ApiSpec'], + }); const specFromDb = identifier ? loadApiSpec(db, identifier) : await promptApiSpec(db, !!ci); - - let specContent: string = ''; + let specContent = ''; try { if (specFromDb?.contents) { @@ -30,13 +32,14 @@ export async function lintSpecification( ? identifier : path.join(workingDir || '.', identifier); logger.trace(`Linting specification from file \`${fileName}\``); + try { specContent = (await fs.promises.readFile(fileName)).toString(); } catch (e) { throw new InsoError(`Failed to read "${fileName}"`, e); } } else { - logger.fatal(`Specification not found.`); + logger.fatal('Specification not found.'); return false; } } catch (e) { @@ -49,13 +52,12 @@ export async function lintSpecification( if (results.length) { logger.log(`${results.length} lint errors found. \n`); - - results.forEach(r => + results.forEach((r) => logger.log(`${r.range.start.line}:${r.range.start.character} - ${r.message}`), ); return false; } - logger.log(`No linting errors. Yay!`); + logger.log('No linting errors. Yay!'); return true; } diff --git a/packages/insomnia-inso/src/commands/__tests__/run-tests.test.js b/packages/insomnia-inso/src/commands/run-tests.test.ts similarity index 63% rename from packages/insomnia-inso/src/commands/__tests__/run-tests.test.js rename to packages/insomnia-inso/src/commands/run-tests.test.ts index 431ba0d39c6..916ccaaff1d 100644 --- a/packages/insomnia-inso/src/commands/__tests__/run-tests.test.js +++ b/packages/insomnia-inso/src/commands/run-tests.test.ts @@ -1,57 +1,61 @@ -// @flow - -import insomniaTesting from 'insomnia-testing'; -import { runInsomniaTests, TestReporterEnum } from '../run-tests'; -import { globalBeforeAll, globalBeforeEach } from '../../../__jest__/before'; -import logger from '../../logger'; +import { generate as _generate, runTestsCli as _runTestsCli } from 'insomnia-testing'; +import { runInsomniaTests, RunTestsOptions } from './run-tests'; +import { globalBeforeAll, globalBeforeEach } from '../jest/before'; +import { logger } from '../logger'; +import { GenerateConfigOptions } from './generate-config'; jest.mock('insomnia-testing'); jest.mock('insomnia-send-request'); +const generate = _generate as jest.Mock; +const runTestsCli = _runTestsCli as jest.Mock; + describe('runInsomniaTests()', () => { beforeAll(() => { globalBeforeAll(); }); + beforeEach(() => { globalBeforeEach(); }); - // make flow happy - const mock = (mockFn: any) => mockFn; afterEach(() => { jest.restoreAllMocks(); }); - const base = { - reporter: TestReporterEnum.spec, - appDataDir: 'src/db/__fixtures__/nedb', + const base: RunTestsOptions = { + reporter: 'spec', + appDataDir: 'src/db/fixtures/nedb', ci: true, }; - it('should should not generate if type arg is invalid', async () => { - await runInsomniaTests(null, ({ reporter: 'invalid' }: Object)); - - expect(insomniaTesting.runTestsCli).not.toHaveBeenCalled(); + it('should should not as _generate if type arg is invalid', async () => { + await runInsomniaTests(null, { + // @ts-expect-error this is intentionally passing in a bad value + reporter: 'invalid', + }); + expect(runTestsCli).not.toHaveBeenCalled(); expect(logger.__getLogs().fatal).toEqual([ - 'Reporter "invalid" not unrecognized. Options are [dot, list, spec, min, progress].', + 'Reporter "invalid" not unrecognized. Options are [dot, list, min, progress, spec].', ]); }); it('should forward options to insomnia-testing', async () => { const contents = 'generated test contents'; - mock(insomniaTesting.generate).mockResolvedValue(contents); + generate.mockReturnValue(contents); - const options = { + const options: Partial = { ...base, + // @ts-expect-error not sure why this was an invalid value, but I'm going to leave it here reporter: 'min', bail: true, keepFile: false, testNamePattern: 'Math', env: 'env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub', }; - await runInsomniaTests('spc_46c5a4a40e83445a9bd9d9758b86c16c', options); - expect(insomniaTesting.runTestsCli).toHaveBeenCalledWith(contents, { + await runInsomniaTests('spc_46c5a4a40e83445a9bd9d9758b86c16c', options); + expect(runTestsCli).toHaveBeenCalledWith(contents, { reporter: 'min', bail: true, keepFile: false, @@ -61,22 +65,19 @@ describe('runInsomniaTests()', () => { }); it('should return false if test results have any failures', async function() { - mock(insomniaTesting.runTestsCli).mockResolvedValue(false); - + runTestsCli.mockResolvedValue(false); const result = await runInsomniaTests('spc_46c5a4a40e83445a9bd9d9758b86c16c', { ...base, env: 'env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub', }); - expect(result).toBe(false); }); it('should return false if test suites could not be found', async () => { const result = await runInsomniaTests('not-found', { ...base, - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', }); - expect(result).toBe(false); expect(logger.__getLogs().fatal).toEqual(['No test suites found; cannot run tests.']); }); @@ -84,23 +85,20 @@ describe('runInsomniaTests()', () => { it('should return false if environment could not be found', async () => { const result = runInsomniaTests('spc_46c5a4a40e83445a9bd9d9758b86c16c', { ...base, - workingDir: 'src/db/__fixtures__/git-repo', + workingDir: 'src/db/fixtures/git-repo', env: 'not-found', }); - await expect(result).rejects.toThrowError( 'Expected single sub environment in the data store, but found none.', ); }); it('should return true if test results have no failures', async function() { - mock(insomniaTesting.runTestsCli).mockResolvedValue(true); - + runTestsCli.mockResolvedValue(true); const result = await runInsomniaTests('spc_46c5a4a40e83445a9bd9d9758b86c16c', { ...base, env: 'env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub', }); - expect(result).toBe(true); }); }); diff --git a/packages/insomnia-inso/src/commands/run-tests.js b/packages/insomnia-inso/src/commands/run-tests.ts similarity index 59% rename from packages/insomnia-inso/src/commands/run-tests.js rename to packages/insomnia-inso/src/commands/run-tests.ts index c3c3113facd..34a2fc65875 100644 --- a/packages/insomnia-inso/src/commands/run-tests.js +++ b/packages/insomnia-inso/src/commands/run-tests.ts @@ -1,56 +1,64 @@ -// @flow - -import { generate, runTestsCli } from 'insomnia-testing'; +import { generate, runTestsCli, TestSuite } from 'insomnia-testing'; import type { GlobalOptions } from '../get-options'; import { loadDb } from '../db'; import type { UnitTest, UnitTestSuite } from '../db/models/types'; -import logger, { noConsoleLog } from '../logger'; +import { logger, noConsoleLog } from '../logger'; import { loadTestSuites, promptTestSuites } from '../db/models/unit-test-suite'; import { loadEnvironment, promptEnvironment } from '../db/models/environment'; -export const TestReporterEnum = { - dot: 'dot', - list: 'list', - spec: 'spec', - min: 'min', - progress: 'progress', -}; +export type TestReporter = 'dot' | 'list' | 'spec' | 'min' | 'progress'; + +export const reporterTypes: TestReporter[] = [ + 'dot', + 'list', + 'min', + 'progress', + 'spec', +]; + +export const reporterTypesSet = new Set(reporterTypes); export type RunTestsOptions = GlobalOptions & { - env?: string, - reporter: $Keys, - bail?: boolean, - keepFile?: boolean, - testNamePattern?: string, + env?: string; + reporter: TestReporter; + bail?: boolean; + keepFile?: boolean; + testNamePattern?: string; }; -function validateOptions({ reporter }: RunTestsOptions): boolean { - if (reporter && !TestReporterEnum[reporter]) { - const reporterTypes = Object.keys(TestReporterEnum).join(', '); - logger.fatal(`Reporter "${reporter}" not unrecognized. Options are [${reporterTypes}].`); +function validateOptions({ reporter }: Partial): boolean { + if (reporter && !reporterTypesSet.has(reporter)) { + logger.fatal(`Reporter "${reporter}" not unrecognized. Options are [${reporterTypes.join(', ')}].`); return false; } return true; } -const createTestSuite = (dbSuite: UnitTestSuite, dbTests: Array) => ({ +const createTestSuite = (dbSuite: UnitTestSuite, dbTests: UnitTest[]): TestSuite => ({ name: dbSuite.name, - tests: dbTests.map(({ name, code, requestId }) => ({ name, code, defaultRequestId: requestId })), + suites: [], + tests: dbTests.map(({ name, code, requestId }) => ({ + name, + code, + defaultRequestId: requestId, + })), }); // Identifier can be the id or name of a workspace, apiSpec, or unit test suite export async function runInsomniaTests( - identifier: ?string, - options: RunTestsOptions, + identifier: string | null | undefined, + options: Partial, ): Promise { if (!validateOptions(options)) { return false; } const { reporter, bail, keepFile, appDataDir, workingDir, env, ci, testNamePattern } = options; - - const db = await loadDb({ workingDir, appDataDir }); + const db = await loadDb({ + workingDir, + appDataDir, + }); // Find suites const suites = identifier ? loadTestSuites(db, identifier) : await promptTestSuites(db, !!ci); @@ -72,19 +80,19 @@ export async function runInsomniaTests( } // Generate test file - const testFileContents = await generate( + const testFileContents = generate( suites.map(suite => createTestSuite( suite, - db.UnitTest.filter(t => t.parentId === suite._id), + db.UnitTest.filter(test => test.parentId === suite._id), ), ), ); - // Load lazily when needed, otherwise this require slows down the entire CLI. + // eslint-disable-next-line @typescript-eslint/no-var-requires -- Load lazily when needed, otherwise this require slows down the entire CLI. const { getSendRequestCallbackMemDb } = require('insomnia-send-request'); - const sendRequest = await getSendRequestCallbackMemDb(environment._id, db); + const sendRequest = await getSendRequestCallbackMemDb(environment._id, db); return await noConsoleLog(() => runTestsCli(testFileContents, { reporter, diff --git a/packages/insomnia-inso/src/__tests__/data-directory.test.js b/packages/insomnia-inso/src/data-directory.test.ts similarity index 77% rename from packages/insomnia-inso/src/__tests__/data-directory.test.js rename to packages/insomnia-inso/src/data-directory.test.ts index 9b6c7148c04..1ff750c45e3 100644 --- a/packages/insomnia-inso/src/__tests__/data-directory.test.js +++ b/packages/insomnia-inso/src/data-directory.test.ts @@ -1,65 +1,74 @@ -// @flow -import { getAppDataDir } from '../data-directory'; +import { getAppDataDir } from './data-directory'; import path from 'path'; +import os from 'os'; jest.mock('os', () => ({ - ...jest.requireActual('os'), + ...jest.requireActual('os'), homedir: (): string => 'homedir', })); +const setPlatform = (platform: NodeJS.Platform) => { + Object.defineProperty(process, 'platform', { + value: platform, + }); +}; + describe('getAppDataDir()', () => { const OLD_ENV = process.env; const OLD_PLATFORM = process.platform; beforeEach(() => { process.env = { ...OLD_ENV }; // make a copy - _setPlatform(OLD_PLATFORM); + + setPlatform(OLD_PLATFORM); }); afterAll(() => { process.env = OLD_ENV; // restore old env - _setPlatform(OLD_PLATFORM); + + setPlatform(OLD_PLATFORM); }); it('should return the correct directory on macOS', () => { - _setPlatform('darwin'); + setPlatform('darwin'); + expect(getAppDataDir('testApp')).toBe( path.join('homedir', 'Library', 'Application Support', 'testApp'), ); }); it('should return the correct directory on Windows with APPDATA not set', () => { - _setPlatform('win32'); + setPlatform('win32'); + process.env.APPDATA = undefined; expect(getAppDataDir('testApp')).toBe(path.join('homedir', 'AppData', 'Roaming', 'testApp')); }); it('should return the correct directory on Windows with APPDATA set', () => { - _setPlatform('win32'); + setPlatform('win32'); + process.env.APPDATA = 'test'; expect(getAppDataDir('testApp')).toBe(path.join('test', 'testApp')); }); it('should return the correct directory on Linux with XDG_DATA_HOME not set', () => { - _setPlatform('linux'); + setPlatform('linux'); + process.env.XDG_DATA_HOME = undefined; expect(getAppDataDir('testApp')).toBe(path.join('homedir', '.config', 'testApp')); }); it('should return the correct directory on Linux with XDG_DATA_HOME set', () => { - _setPlatform('linux'); + setPlatform('linux'); + process.env.XDG_DATA_HOME = 'test'; expect(getAppDataDir('testApp')).toBe(path.join('test', 'testApp')); }); it('should return nothing on other platforms', () => { - _setPlatform('testPlatform'); + // @ts-expect-error this is an intentionally bad value + setPlatform('testPlatform'); + expect(getAppDataDir('testApp')).toBe(''); }); }); - -function _setPlatform(platform: string) { - Object.defineProperty(process, 'platform', { - value: platform, - }); -} diff --git a/packages/insomnia-inso/src/data-directory.js b/packages/insomnia-inso/src/data-directory.ts similarity index 71% rename from packages/insomnia-inso/src/data-directory.js rename to packages/insomnia-inso/src/data-directory.ts index 7080a1fade7..3601c5092c0 100644 --- a/packages/insomnia-inso/src/data-directory.js +++ b/packages/insomnia-inso/src/data-directory.ts @@ -1,18 +1,22 @@ -// @flow import path from 'path'; import { homedir } from 'os'; -// getAppDataDir returns the data directory for an Electron app, -// it is equivalent to the app.getPath('userData') API in Electron. -// https://www.electronjs.org/docs/api/app#appgetpathname +/** + * getAppDataDir returns the data directory for an Electron app, + * it is equivalent to the app.getPath('userData') API in Electron. + * https://www.electronjs.org/docs/api/app#appgetpathname +*/ export function getAppDataDir(app: string): string { switch (process.platform) { case 'darwin': return path.join(homedir(), 'Library', 'Application Support', app); + case 'win32': return path.join(process.env.APPDATA || path.join(homedir(), 'AppData', 'Roaming'), app); + case 'linux': return path.join(process.env.XDG_DATA_HOME || path.join(homedir(), '.config'), app); + default: return ''; } diff --git a/packages/insomnia-inso/src/db/__mocks__/index.js b/packages/insomnia-inso/src/db/__mocks__/index.ts similarity index 98% rename from packages/insomnia-inso/src/db/__mocks__/index.js rename to packages/insomnia-inso/src/db/__mocks__/index.ts index 3d67fd7ed25..63fd996af50 100644 --- a/packages/insomnia-inso/src/db/__mocks__/index.js +++ b/packages/insomnia-inso/src/db/__mocks__/index.ts @@ -1,8 +1,5 @@ // eslint-disable-next-line filenames/match-exported const db = jest.requireActual('../index'); - const database = db.emptyDb(); - db.loadDb = jest.fn().mockResolvedValue(database); - module.exports = db; diff --git a/packages/insomnia-inso/src/db/adapters/__tests__/git-adapter.test.js b/packages/insomnia-inso/src/db/adapters/git-adapter.test.ts similarity index 92% rename from packages/insomnia-inso/src/db/adapters/__tests__/git-adapter.test.js rename to packages/insomnia-inso/src/db/adapters/git-adapter.test.ts index e2df036cf8d..ebbd055041e 100644 --- a/packages/insomnia-inso/src/db/adapters/__tests__/git-adapter.test.js +++ b/packages/insomnia-inso/src/db/adapters/git-adapter.test.ts @@ -1,14 +1,11 @@ -// @flow import path from 'path'; -import gitAdapter from '../git-adapter'; +import gitAdapter from './git-adapter'; describe('gitAdapter()', () => { - const fixturesPath = 'src/db/__fixtures__'; - + const fixturesPath = 'src/db/fixtures'; it('should seed with git-repo directory', async () => { const workingDir = path.join(fixturesPath, 'git-repo'); const db = await gitAdapter(workingDir); - expect(db?.ApiSpec.length).toBe(1); expect(db?.Environment.length).toBe(2); expect(db?.Request.length).toBe(2); @@ -21,7 +18,6 @@ describe('gitAdapter()', () => { it('should seed with git-repo directory with filter', async () => { const workingDir = path.join(fixturesPath, 'git-repo'); const db = await gitAdapter(workingDir, ['Environment']); - expect(db?.ApiSpec.length).toBe(0); expect(db?.Environment.length).toBe(2); expect(db?.Request.length).toBe(0); diff --git a/packages/insomnia-inso/src/db/adapters/git-adapter.js b/packages/insomnia-inso/src/db/adapters/git-adapter.ts similarity index 65% rename from packages/insomnia-inso/src/db/adapters/git-adapter.js rename to packages/insomnia-inso/src/db/adapters/git-adapter.ts index 93b8c64a2ca..3feaebd7849 100644 --- a/packages/insomnia-inso/src/db/adapters/git-adapter.js +++ b/packages/insomnia-inso/src/db/adapters/git-adapter.ts @@ -1,35 +1,35 @@ -// @flow import fs from 'fs'; import YAML from 'yaml'; import path from 'path'; import { emptyDb } from '../index'; import type { Database, DbAdapter } from '../index'; +import { UNKNOWN } from '../../types'; const gitAdapter: DbAdapter = async (dir, filterTypes) => { - dir = path.join(dir, '.insomnia'); + dir = path.join(dir, '.insomnia'); // Sanity check - do model directories exist? - // Sanity check - do model directories exist? if (!fs.existsSync(path.join(dir, 'Workspace'))) { return null; } const db = emptyDb(); - const readAndInsertDoc = async (type: $Keys, fileName: string): Promise => { + const readAndInsertDoc = async ( + type: keyof Database, + fileName: string, + ): Promise => { // Get contents of each file in type dir and insert into data const contents = await fs.promises.readFile(fileName); const obj = YAML.parse(contents.toString()); - - // Make flow happy - (db[type]: Array).push(obj); + (db[type] as UNKNOWN[]).push(obj); }; - const types = filterTypes?.length ? filterTypes : Object.keys(db); - + const types = filterTypes?.length ? filterTypes : Object.keys(db) as (keyof Database)[]; await Promise.all( - types.map(async type => { + types.map(async t => { // Get all files in type dir - const typeDir = path.join(dir, type); + const typeDir = path.join(dir, t); + if (!fs.existsSync(typeDir)) { return; } @@ -37,11 +37,12 @@ const gitAdapter: DbAdapter = async (dir, filterTypes) => { const files = await fs.promises.readdir(typeDir); return Promise.all( // Insert each file from each type - files.map(file => readAndInsertDoc(type, path.join(dir, type, file))), + files.map(file => + readAndInsertDoc(t, path.join(dir, t, file)), + ), ); }), ); - return db; }; diff --git a/packages/insomnia-inso/src/db/adapters/ne-db-adapter.js b/packages/insomnia-inso/src/db/adapters/ne-db-adapter.js deleted file mode 100644 index bdfcda193e4..00000000000 --- a/packages/insomnia-inso/src/db/adapters/ne-db-adapter.js +++ /dev/null @@ -1,44 +0,0 @@ -// @flow -import path from 'path'; -import NeDB from 'nedb'; -import type { BaseModel } from '../models/types'; -import type { DbAdapter } from '../index'; -import { emptyDb } from '../index'; -import fs from 'fs'; - -const neDbAdapter: DbAdapter = async (dir, filterTypes) => { - // Sanity check - do db files exist? - if (!fs.existsSync(path.join(dir, 'insomnia.Workspace.db'))) { - return null; - } - - const db = emptyDb(); - - const types = filterTypes?.length ? filterTypes : Object.keys(db); - - const promises = types.map( - type => - new Promise((resolve, reject) => { - const filePath = path.join(dir, `insomnia.${type}.db`); - const collection = new NeDB({ - autoload: true, - filename: filePath, - corruptAlertThreshold: 0.9, - }); - collection.find({}, (err, docs: Array) => { - if (err) { - return reject(err); - } - - (db[type]: Array).push(...docs); - resolve(); - }); - }), - ); - - await Promise.all(promises); - - return db; -}; - -export default neDbAdapter; diff --git a/packages/insomnia-inso/src/db/adapters/__tests__/ne-db-adapter.test.js b/packages/insomnia-inso/src/db/adapters/ne-db-adapter.test.ts similarity index 92% rename from packages/insomnia-inso/src/db/adapters/__tests__/ne-db-adapter.test.js rename to packages/insomnia-inso/src/db/adapters/ne-db-adapter.test.ts index 4a645f3dac8..494ed7c409f 100644 --- a/packages/insomnia-inso/src/db/adapters/__tests__/ne-db-adapter.test.js +++ b/packages/insomnia-inso/src/db/adapters/ne-db-adapter.test.ts @@ -1,14 +1,11 @@ -// @flow import path from 'path'; -import neDbAdapter from '../ne-db-adapter'; +import neDbAdapter from './ne-db-adapter'; describe('neDbAdapter()', () => { - const fixturesPath = 'src/db/__fixtures__'; - + const fixturesPath = 'src/db/fixtures'; it('should seed with nedb directory', async () => { const workingDir = path.join(fixturesPath, 'nedb'); const db = await neDbAdapter(workingDir); - expect(db?.ApiSpec.length).toBe(2); expect(db?.Environment.length).toBe(3); expect(db?.Request.length).toBe(2); @@ -21,7 +18,6 @@ describe('neDbAdapter()', () => { it('should seed with nedb directory with filter', async () => { const workingDir = path.join(fixturesPath, 'nedb'); const db = await neDbAdapter(workingDir, ['Environment']); - expect(db?.ApiSpec.length).toBe(0); expect(db?.Environment.length).toBe(3); expect(db?.Request.length).toBe(0); diff --git a/packages/insomnia-inso/src/db/adapters/ne-db-adapter.ts b/packages/insomnia-inso/src/db/adapters/ne-db-adapter.ts new file mode 100644 index 00000000000..0081be7088c --- /dev/null +++ b/packages/insomnia-inso/src/db/adapters/ne-db-adapter.ts @@ -0,0 +1,38 @@ +import path from 'path'; +import NeDB from 'nedb'; +import type { BaseModel } from '../models/types'; +import { Database, DbAdapter, emptyDb } from '../index'; +import fs from 'fs'; +import { UNKNOWN, UNKNOWN_OBJ } from '../../types'; + +const neDbAdapter: DbAdapter = async (dir, filterTypes) => { + // Sanity check - do db files exist? + if (!fs.existsSync(path.join(dir, 'insomnia.Workspace.db'))) { + return null; + } + + const db = emptyDb(); + const types = filterTypes?.length ? filterTypes : Object.keys(db) as (keyof Database)[]; + const promises = types.map(t => + new Promise((resolve, reject) => { + const filePath = path.join(dir, `insomnia.${t}.db`); + const collection = new NeDB({ + autoload: true, + filename: filePath, + corruptAlertThreshold: 0.9, + }); + collection.find({}, (err: UNKNOWN, docs: Array) => { + if (err) { + return reject(err); + } + + (db[t] as UNKNOWN_OBJ[]).push(...docs); + resolve(null); + }); + }), + ); + await Promise.all(promises); + return db; +}; + +export default neDbAdapter; diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml b/packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml b/packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml b/packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml b/packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml b/packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml b/packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml b/packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo-malformed-spec/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/ApiSpec/spc_46c5a4a40e83445a9bd9d9758b86c16c.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Environment/env_ca046a738f001eb3090261a537b1b78f86c2094c.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Environment/env_env_ca046a738f001eb3090261a537b1b78f86c2094c_sub.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292a21946b60.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Request/req_wrk_012d4860c7da418a85ffea7406e1292ab410454b.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/RequestGroup/fld_wrk_012d4860c7da418a85ffea7406e1292a30baa249.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_6b214a8cd07046f2a8f43237ca913c73.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_6b214a8cd07046f2a8f43237ca913c73.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_6b214a8cd07046f2a8f43237ca913c73.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_6b214a8cd07046f2a8f43237ca913c73.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_8c0c020fb9e341c2a3162e723445faf1.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_8c0c020fb9e341c2a3162e723445faf1.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_8c0c020fb9e341c2a3162e723445faf1.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_8c0c020fb9e341c2a3162e723445faf1.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_8fc42ec7f82a45d09e691ddfe212fd85.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_8fc42ec7f82a45d09e691ddfe212fd85.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_8fc42ec7f82a45d09e691ddfe212fd85.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_8fc42ec7f82a45d09e691ddfe212fd85.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_97a197104e83454ebf5f4e0dc0ba4bc6.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_97a197104e83454ebf5f4e0dc0ba4bc6.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTest/ut_97a197104e83454ebf5f4e0dc0ba4bc6.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTest/ut_97a197104e83454ebf5f4e0dc0ba4bc6.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTestSuite/uts_7f0f85548b0147f4ba6b5e442d137613.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTestSuite/uts_7f0f85548b0147f4ba6b5e442d137613.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTestSuite/uts_7f0f85548b0147f4ba6b5e442d137613.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTestSuite/uts_7f0f85548b0147f4ba6b5e442d137613.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTestSuite/uts_fe901c6565044f00aa620d3fe47f443f.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTestSuite/uts_fe901c6565044f00aa620d3fe47f443f.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/UnitTestSuite/uts_fe901c6565044f00aa620d3fe47f443f.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/UnitTestSuite/uts_fe901c6565044f00aa620d3fe47f443f.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml b/packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/git-repo/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml rename to packages/insomnia-inso/src/db/fixtures/git-repo/.insomnia/Workspace/wrk_012d4860c7da418a85ffea7406e1292a.yml diff --git a/packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.ApiSpec.db b/packages/insomnia-inso/src/db/fixtures/nedb/insomnia.ApiSpec.db similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.ApiSpec.db rename to packages/insomnia-inso/src/db/fixtures/nedb/insomnia.ApiSpec.db diff --git a/packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.Environment.db b/packages/insomnia-inso/src/db/fixtures/nedb/insomnia.Environment.db similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.Environment.db rename to packages/insomnia-inso/src/db/fixtures/nedb/insomnia.Environment.db diff --git a/packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.Request.db b/packages/insomnia-inso/src/db/fixtures/nedb/insomnia.Request.db similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.Request.db rename to packages/insomnia-inso/src/db/fixtures/nedb/insomnia.Request.db diff --git a/packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.RequestGroup.db b/packages/insomnia-inso/src/db/fixtures/nedb/insomnia.RequestGroup.db similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.RequestGroup.db rename to packages/insomnia-inso/src/db/fixtures/nedb/insomnia.RequestGroup.db diff --git a/packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.UnitTest.db b/packages/insomnia-inso/src/db/fixtures/nedb/insomnia.UnitTest.db similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.UnitTest.db rename to packages/insomnia-inso/src/db/fixtures/nedb/insomnia.UnitTest.db diff --git a/packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.UnitTestSuite.db b/packages/insomnia-inso/src/db/fixtures/nedb/insomnia.UnitTestSuite.db similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.UnitTestSuite.db rename to packages/insomnia-inso/src/db/fixtures/nedb/insomnia.UnitTestSuite.db diff --git a/packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.Workspace.db b/packages/insomnia-inso/src/db/fixtures/nedb/insomnia.Workspace.db similarity index 100% rename from packages/insomnia-inso/src/db/__fixtures__/nedb/insomnia.Workspace.db rename to packages/insomnia-inso/src/db/fixtures/nedb/insomnia.Workspace.db diff --git a/packages/insomnia-inso/src/db/__tests__/index.test.js b/packages/insomnia-inso/src/db/index.test.ts similarity index 74% rename from packages/insomnia-inso/src/db/__tests__/index.test.js rename to packages/insomnia-inso/src/db/index.test.ts index 682f00abf8f..45b49e9872f 100644 --- a/packages/insomnia-inso/src/db/__tests__/index.test.js +++ b/packages/insomnia-inso/src/db/index.test.ts @@ -1,30 +1,31 @@ -// @flow - -import { emptyDb, loadDb } from '../index'; -import gitAdapter from '../adapters/git-adapter'; -import neDbAdapter from '../adapters/ne-db-adapter'; -import { globalBeforeAll, globalBeforeEach } from '../../../__jest__/before'; -import logger from '../../logger'; +import { emptyDb, loadDb } from './index'; +import gitAdapter from './adapters/git-adapter'; +import neDbAdapter from './adapters/ne-db-adapter'; +import { globalBeforeAll, globalBeforeEach } from '../jest/before'; +import { logger } from '../logger'; import path from 'path'; +import { UNKNOWN } from '../types'; -jest.mock('../adapters/git-adapter'); -jest.mock('../adapters/ne-db-adapter'); +jest.mock('./adapters/git-adapter'); +jest.mock('./adapters/ne-db-adapter'); describe('loadDb()', () => { beforeAll(() => { globalBeforeAll(); }); + beforeEach(() => { jest.clearAllMocks(); globalBeforeEach(); }); - const mock = (mockFn: any) => mockFn; + const mock = (mockFn: UNKNOWN) => mockFn; it('should default to current directory if working dir not defined', async () => { mock(gitAdapter).mockResolvedValue(emptyDb()); - await loadDb({ workingDir: undefined }); - + await loadDb({ + workingDir: undefined, + }); expect(logger.__getLogs().debug).toEqual([ `Data store configured from git repository at \`${path.resolve('.')}\``, ]); @@ -34,8 +35,10 @@ describe('loadDb()', () => { it('should load git data from working directory', async () => { mock(gitAdapter).mockResolvedValue(emptyDb()); - await loadDb({ workingDir: 'dir', filterTypes: ['Environment'] }); - + await loadDb({ + workingDir: 'dir', + filterTypes: ['Environment'], + }); expect(logger.__getLogs().debug).toEqual([ `Data store configured from git repository at \`${path.resolve('dir')}\``, ]); @@ -46,8 +49,10 @@ describe('loadDb()', () => { it('should load nedb from appDataDir', async () => { mock(gitAdapter).mockResolvedValue(emptyDb()); mock(neDbAdapter).mockResolvedValue(emptyDb()); - await loadDb({ appDataDir: 'dir', filterTypes: ['Environment'] }); - + await loadDb({ + appDataDir: 'dir', + filterTypes: ['Environment'], + }); expect(logger.__getLogs().debug).toEqual([ `Data store configured from app data directory at \`${path.resolve('dir')}\``, ]); @@ -57,9 +62,9 @@ describe('loadDb()', () => { it('should not load from git if appDataDir is defined', async () => { mock(neDbAdapter).mockResolvedValue(emptyDb()); - - await loadDb({ appDataDir: 'dir' }); - + await loadDb({ + appDataDir: 'dir', + }); expect(logger.__getLogs().debug).toEqual([ `Data store configured from app data directory at \`${path.resolve('dir')}\``, ]); @@ -70,12 +75,10 @@ describe('loadDb()', () => { it('should load from neDb if not loaded from git', async () => { mock(gitAdapter).mockResolvedValue(null); mock(neDbAdapter).mockResolvedValue(emptyDb()); + await loadDb(); // Cannot assert the full path because it is application data - await loadDb(); - - // Cannot assert the full path because it is application data expect(logger.__getLogs().debug).toEqual([ - expect.stringContaining(`Data store configured from app data directory at`), + expect.stringContaining('Data store configured from app data directory at'), ]); expect(gitAdapter).toHaveBeenCalled(); expect(neDbAdapter).toHaveBeenCalled(); @@ -84,9 +87,7 @@ describe('loadDb()', () => { it('should warn and return empty db if nothing loaded from git or nedb', async () => { mock(gitAdapter).mockResolvedValue(null); mock(neDbAdapter).mockResolvedValue(null); - const db = await loadDb(); - expect(logger.__getLogs().warn).toEqual([ 'No git or app data store found, re-run `inso` with `--verbose` to see tracing information', ]); diff --git a/packages/insomnia-inso/src/db/index.js b/packages/insomnia-inso/src/db/index.ts similarity index 71% rename from packages/insomnia-inso/src/db/index.js rename to packages/insomnia-inso/src/db/index.ts index 985af21cb13..5398a3d4d0f 100644 --- a/packages/insomnia-inso/src/db/index.js +++ b/packages/insomnia-inso/src/db/index.ts @@ -1,4 +1,3 @@ -// @flow import type { ApiSpec, BaseModel, @@ -11,18 +10,18 @@ import gitAdapter from './adapters/git-adapter'; import neDbAdapter from './adapters/ne-db-adapter'; import { getDefaultAppName } from '../util'; import { getAppDataDir } from '../data-directory'; -import logger from '../logger'; +import { logger } from '../logger'; import path from 'path'; -export type Database = {| - ApiSpec: Array, - Environment: Array, - Request: Array, - RequestGroup: Array, - Workspace: Array, - UnitTestSuite: Array, - UnitTest: Array, -|}; +export type Database = { + ApiSpec: ApiSpec[]; + Environment: Environment[]; + Request: BaseModel[]; + RequestGroup: BaseModel[]; + Workspace: Workspace[]; + UnitTestSuite: UnitTestSuite[]; + UnitTest: UnitTest[]; +}; export const emptyDb = (): Database => ({ ApiSpec: [], @@ -36,13 +35,13 @@ export const emptyDb = (): Database => ({ export type DbAdapter = ( dir: string, - filterTypes?: Array<$Keys>, + filterTypes?: (keyof Database)[], ) => Promise; type Options = { - workingDir?: string, - appDataDir?: string, - filterTypes?: Array<$Keys>, + workingDir?: string; + appDataDir?: string; + filterTypes?: (keyof Database)[]; }; export const loadDb = async ({ @@ -50,22 +49,19 @@ export const loadDb = async ({ appDataDir, filterTypes, }: Options = {}): Promise => { - let db = null; + let db = null; // try load from git - // try load from git if (!appDataDir) { const dir = workingDir || '.'; db = await gitAdapter(dir, filterTypes); db && logger.debug(`Data store configured from git repository at \`${path.resolve(dir)}\``); - } + } // try load from nedb - // try load from nedb if (!db) { const dir = appDataDir || getAppDataDir(getDefaultAppName()); db = await neDbAdapter(dir, filterTypes); - db && logger.debug(`Data store configured from app data directory at \`${path.resolve(dir)}\``); + db && logger.debug(`Data store configured from app data directory at \`${path.resolve(dir)}\``); // Try to load from the Designer data dir, if the Core data directory does not exist - // Try to load from the Designer data dir, if the Core data directory does not exist if (!db && !appDataDir) { const designerDir = getAppDataDir('Insomnia Designer'); db = await neDbAdapter(designerDir); @@ -76,9 +72,8 @@ export const loadDb = async ({ )}\``, ); } - } + } // return empty db - // return empty db if (!db) { logger.warn( 'No git or app data store found, re-run `inso` with `--verbose` to see tracing information', diff --git a/packages/insomnia-inso/src/db/models/__mocks__/enquirer.ts b/packages/insomnia-inso/src/db/models/__mocks__/enquirer.ts new file mode 100644 index 00000000000..89cac5d01b0 --- /dev/null +++ b/packages/insomnia-inso/src/db/models/__mocks__/enquirer.ts @@ -0,0 +1,20 @@ +const __constructorMock = jest.fn(); + +let returnValue = 'test'; + +module.exports = { + __constructorMock, + __mockPromptRun: (value: string) => { + returnValue = value; + }, + AutoComplete: class { + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- missing types from enquirer + constructor(options: any) { + __constructorMock(options); + } + + run() { + return returnValue; + } + }, +}; diff --git a/packages/insomnia-inso/src/db/models/__tests__/__snapshots__/api-spec.test.js.snap b/packages/insomnia-inso/src/db/models/__snapshots__/api-spec.test.ts.snap similarity index 100% rename from packages/insomnia-inso/src/db/models/__tests__/__snapshots__/api-spec.test.js.snap rename to packages/insomnia-inso/src/db/models/__snapshots__/api-spec.test.ts.snap diff --git a/packages/insomnia-inso/src/db/models/__tests__/__snapshots__/environment.test.js.snap b/packages/insomnia-inso/src/db/models/__snapshots__/environment.test.ts.snap similarity index 100% rename from packages/insomnia-inso/src/db/models/__tests__/__snapshots__/environment.test.js.snap rename to packages/insomnia-inso/src/db/models/__snapshots__/environment.test.ts.snap diff --git a/packages/insomnia-inso/src/db/models/__tests__/__snapshots__/unit-test-suite.test.js.snap b/packages/insomnia-inso/src/db/models/__snapshots__/unit-test-suite.test.ts.snap similarity index 100% rename from packages/insomnia-inso/src/db/models/__tests__/__snapshots__/unit-test-suite.test.js.snap rename to packages/insomnia-inso/src/db/models/__snapshots__/unit-test-suite.test.ts.snap diff --git a/packages/insomnia-inso/src/db/models/api-spec.js b/packages/insomnia-inso/src/db/models/api-spec.js deleted file mode 100644 index b0371b337b2..00000000000 --- a/packages/insomnia-inso/src/db/models/api-spec.js +++ /dev/null @@ -1,32 +0,0 @@ -// @flow -import type { Database } from '../index'; -import type { ApiSpec } from './types'; -import { ensureSingleOrNone, generateIdIsh, getDbChoice, matchIdIsh } from './util'; -import { AutoComplete } from 'enquirer'; -import logger from '../../logger'; - -const entity = 'api specification'; - -export const loadApiSpec = (db: Database, identifier: string): ?ApiSpec => { - logger.trace('Load %s with identifier `%s` from data store', entity, identifier); - const items = db.ApiSpec.filter(s => matchIdIsh(s, identifier) || s.fileName === identifier); - logger.trace('Found %d.', items.length); - - return ensureSingleOrNone(items, entity); -}; - -export const promptApiSpec = async (db: Database, ci: boolean): Promise => { - if (ci || !db.ApiSpec.length) { - return null; - } - - const prompt = new AutoComplete({ - name: 'apiSpec', - message: 'Select an API Specification', - choices: db.ApiSpec.map(s => getDbChoice(generateIdIsh(s), s.fileName)), - }); - - logger.trace('Prompt for %s', entity); - const [idIsh] = (await prompt.run()).split(' - ').reverse(); - return loadApiSpec(db, idIsh); -}; diff --git a/packages/insomnia-inso/src/db/models/__tests__/api-spec.test.js b/packages/insomnia-inso/src/db/models/api-spec.test.ts similarity index 83% rename from packages/insomnia-inso/src/db/models/__tests__/api-spec.test.js rename to packages/insomnia-inso/src/db/models/api-spec.test.ts index feb2f81e8b5..5b62cfc4ab8 100644 --- a/packages/insomnia-inso/src/db/models/__tests__/api-spec.test.js +++ b/packages/insomnia-inso/src/db/models/api-spec.test.ts @@ -1,32 +1,28 @@ -// @flow -import type { Database } from '../../index'; -import { emptyDb } from '../../index'; -import type { ApiSpec } from '../types'; -import { generateIdIsh } from '../util'; +import type { Database } from '../index'; +import { emptyDb } from '../index'; +import type { ApiSpec } from './types'; +import { generateIdIsh } from './util'; import enquirer from 'enquirer'; -import { loadApiSpec, promptApiSpec } from '../api-spec'; +import { loadApiSpec, promptApiSpec } from './api-spec'; jest.mock('enquirer'); describe('apiSpec', () => { let db: Database = emptyDb(); - const spec: $Shape = { + const spec: Partial = { _id: 'spc_1234567890', fileName: 'fileName', - }; + } as ApiSpec; beforeEach(() => { db = emptyDb(); - - const dummySpec: $Shape = { + const dummySpec: Partial = { _id: 'spc_dummy', fileName: 'dummy spec', - }; - + } as ApiSpec; db.ApiSpec.push(spec); db.ApiSpec.push(dummySpec); - jest.clearAllMocks(); }); @@ -50,13 +46,11 @@ describe('apiSpec', () => { enquirer.__mockPromptRun('fileName - spc_123456'); const result = await promptApiSpec(db, false); - expect(result).toBe(spec); }); it('should match snapshot of autocomplete config', async () => { await promptApiSpec(db, false); - expect(enquirer.__constructorMock.mock.calls[0][0]).toMatchSnapshot(); }); }); @@ -68,14 +62,13 @@ describe('apiSpec', () => { it.each([generateIdIsh(spec), spec._id, spec.fileName])( 'should return spec with identifier: %o', - identifier => { + (identifier) => { expect(loadApiSpec(db, identifier)).toBe(spec); }, ); it('should throw error if multiple specs matched', () => { db.ApiSpec.push({ ...spec }); - expect(() => loadApiSpec(db, spec._id)).toThrowError(); }); }); diff --git a/packages/insomnia-inso/src/db/models/api-spec.ts b/packages/insomnia-inso/src/db/models/api-spec.ts new file mode 100644 index 00000000000..12d825e186e --- /dev/null +++ b/packages/insomnia-inso/src/db/models/api-spec.ts @@ -0,0 +1,46 @@ +import type { Database } from '../index'; +import type { ApiSpec } from './types'; +import { + ensureSingleOrNone, + generateIdIsh, + getDbChoice, + matchIdIsh, +} from './util'; +// @ts-expect-error the enquirer types are incomplete https://github.com/enquirer/enquirer/pull/307 +import { AutoComplete } from 'enquirer'; +import { logger } from '../../logger'; +const entity = 'api specification'; + +export const loadApiSpec = ( + db: Database, + identifier: string, +): ApiSpec | null | undefined => { + logger.trace( + 'Load %s with identifier `%s` from data store', + entity, + identifier, + ); + const items = db.ApiSpec.filter( + spec => matchIdIsh(spec, identifier) || spec.fileName === identifier, + ); + logger.trace('Found %d.', items.length); + return ensureSingleOrNone(items, entity); +}; + +export const promptApiSpec = async ( + db: Database, + ci: boolean, +): Promise => { + if (ci || !db.ApiSpec.length) { + return null; + } + + const prompt = new AutoComplete({ + name: 'apiSpec', + message: 'Select an API Specification', + choices: db.ApiSpec.map(s => getDbChoice(generateIdIsh(s), s.fileName)), + }); + logger.trace('Prompt for %s', entity); + const [idIsh] = (await prompt.run()).split(' - ').reverse(); + return loadApiSpec(db, idIsh); +}; diff --git a/packages/insomnia-inso/src/db/models/__tests__/environment.test.js b/packages/insomnia-inso/src/db/models/environment.test.ts similarity index 81% rename from packages/insomnia-inso/src/db/models/__tests__/environment.test.js rename to packages/insomnia-inso/src/db/models/environment.test.ts index e692bf2cfa5..50135bc8c59 100644 --- a/packages/insomnia-inso/src/db/models/__tests__/environment.test.js +++ b/packages/insomnia-inso/src/db/models/environment.test.ts @@ -1,55 +1,59 @@ -// @flow -import type { Database } from '../../index'; -import { emptyDb } from '../../index'; -import type { Environment, Workspace } from '../types'; -import { generateIdIsh } from '../util'; -import enquirer from 'enquirer'; -import { loadEnvironment, promptEnvironment } from '../environment'; -import { globalBeforeAll, globalBeforeEach } from '../../../../__jest__/before'; +import type { Database } from '../index'; +import { emptyDb } from '../index'; +import type { Environment, Workspace } from './types'; +import { generateIdIsh } from './util'; +import _enquirer from 'enquirer'; +import { loadEnvironment, promptEnvironment } from './environment'; +import { globalBeforeAll, globalBeforeEach } from '../../jest/before'; jest.mock('enquirer'); +const enquirer = _enquirer as unknown as jest.Mock & { + __mockPromptRun: (str: string) => void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- missing types from enquirer + __constructorMock: jest.Mock; +}; describe('Environment', () => { beforeAll(() => { globalBeforeAll(); }); + beforeEach(() => { globalBeforeEach(); }); let db: Database = emptyDb(); - const workspace: $Shape = { + const workspace = { _id: 'wrk_1234567890', name: 'workspace name', - }; + } as Workspace; - const environment: $Shape = { + const environment = { _id: 'env_1234567890', name: 'base env', parentId: workspace._id, - }; + } as Environment; - const subEnvironment: $Shape = { + const subEnvironment = { _id: 'env_env_1234567890', name: 'sub env', parentId: environment._id, - }; + } as Environment; beforeEach(() => { db = emptyDb(); - const dummySubEnv: $Shape = { + const dummySubEnv = { _id: 'env_env_dummy', name: 'dummy sub env', parentId: environment._id, - }; + } as Environment; db.Workspace.push(workspace); db.Environment.push(environment); db.Environment.push(subEnvironment); db.Environment.push(dummySubEnv); - jest.clearAllMocks(); }); @@ -60,7 +64,6 @@ describe('Environment', () => { it('should return null if no environments exist', () => { db.Environment = []; - expect(promptEnvironment(db, false, workspace._id)).resolves.toBeNull(); }); @@ -81,7 +84,6 @@ describe('Environment', () => { it('should match snapshot of autocomplete config', async () => { await promptEnvironment(db, false, workspace._id); - expect(enquirer.__constructorMock.mock.calls[0][0]).toMatchSnapshot(); }); }); @@ -89,7 +91,6 @@ describe('Environment', () => { describe('loadEnvironment()', () => { it('should return null if no environments exist', () => { db.Environment = []; - expect(loadEnvironment(db, workspace._id, environment._id)).toBeNull(); }); @@ -104,7 +105,7 @@ describe('Environment', () => { it.each([generateIdIsh(subEnvironment), subEnvironment._id, subEnvironment.name])( 'should return the sub environment if matched with id: %s', - identifier => { + () => { expect(loadEnvironment(db, workspace._id, subEnvironment._id)).toBe(subEnvironment); }, ); diff --git a/packages/insomnia-inso/src/db/models/environment.js b/packages/insomnia-inso/src/db/models/environment.ts similarity index 68% rename from packages/insomnia-inso/src/db/models/environment.js rename to packages/insomnia-inso/src/db/models/environment.ts index 5baedbbb47e..45be992d0b1 100644 --- a/packages/insomnia-inso/src/db/models/environment.js +++ b/packages/insomnia-inso/src/db/models/environment.ts @@ -1,15 +1,17 @@ -// @flow import type { Database } from '../index'; import type { Environment } from './types'; +// @ts-expect-error the enquirer types are incomplete https://github.com/enquirer/enquirer/pull/307 import { AutoComplete } from 'enquirer'; import { ensureSingle, generateIdIsh, getDbChoice, matchIdIsh } from './util'; -import logger from '../../logger'; +import { logger } from '../../logger'; const loadBaseEnvironmentForWorkspace = (db: Database, workspaceId: string): Environment => { - logger.trace('Load base environment for the workspace `%s` from data store', workspaceId); + logger.trace( + 'Load base environment for the workspace `%s` from data store', + workspaceId, + ); const items = db.Environment.filter(e => e.parentId === workspaceId); logger.trace('Found %d.', items.length); - return ensureSingle(items, 'base environment'); }; @@ -17,14 +19,16 @@ export const loadEnvironment = ( db: Database, workspaceId: string, identifier?: string, -): ?Environment => { +): Environment | null | undefined => { if (!db.Environment.length) { return null; } // Get the sub environments const baseWorkspaceEnv = loadBaseEnvironmentForWorkspace(db, workspaceId); - const subEnvs = db.Environment.filter(e => e.parentId === baseWorkspaceEnv._id); + const subEnvs = db.Environment.filter( + env => env.parentId === baseWorkspaceEnv._id, + ); // If no identifier, return base environmenmt if (!identifier) { @@ -32,10 +36,14 @@ export const loadEnvironment = ( return baseWorkspaceEnv; } - logger.trace('Load sub environment with identifier `%s` from data store', identifier); - const items = subEnvs.filter(e => matchIdIsh(e, identifier) || e.name === identifier); + logger.trace( + 'Load sub environment with identifier `%s` from data store', + identifier, + ); + const items = subEnvs.filter( + env => matchIdIsh(env, identifier) || env.name === identifier, + ); logger.trace('Found %d', items.length); - return ensureSingle(items, 'sub environment'); }; @@ -43,14 +51,16 @@ export const promptEnvironment = async ( db: Database, ci: boolean, workspaceId: string, -): Promise => { +): Promise => { if (ci || !db.Environment.length) { return null; } // Get the sub environments const baseWorkspaceEnv = loadBaseEnvironmentForWorkspace(db, workspaceId); - const subEnvs = db.Environment.filter(e => e.parentId === baseWorkspaceEnv._id); + const subEnvs = db.Environment.filter( + e => e.parentId === baseWorkspaceEnv._id, + ); if (!subEnvs.length) { logger.trace('No sub environments found, using base environment'); @@ -59,10 +69,9 @@ export const promptEnvironment = async ( const prompt = new AutoComplete({ name: 'environment', - message: `Select an environment`, + message: 'Select an environment', choices: subEnvs.map(e => getDbChoice(generateIdIsh(e, 14), e.name)), }); - logger.trace('Prompt for environment'); const [idIsh] = (await prompt.run()).split(' - ').reverse(); return loadEnvironment(db, workspaceId, idIsh); diff --git a/packages/insomnia-inso/src/db/models/types.js b/packages/insomnia-inso/src/db/models/types.js deleted file mode 100644 index 85683946f49..00000000000 --- a/packages/insomnia-inso/src/db/models/types.js +++ /dev/null @@ -1,45 +0,0 @@ -// @flow - -// Simplified and extracted from insomnia-app/app/models/* - -export type BaseModel = { - _id: string, - type: string, - parentId: string, -}; - -type BaseApiSpec = { - fileName: string, - contentType: 'json' | 'yaml', - contents: string, -}; - -export type ApiSpec = BaseModel & BaseApiSpec; - -type BaseUnitTestSuite = { - name: string, -}; - -export type UnitTestSuite = BaseModel & BaseUnitTestSuite; - -type BaseUnitTest = { - name: string, - code: string, - requestId: string | null, -}; - -export type UnitTest = BaseModel & BaseUnitTest; - -type BaseEnvironment = { - name: string, - metaSortKey: number, -}; - -export type Environment = BaseModel & BaseEnvironment; - -type BaseWorkspace = { - name: string, - description: string, -}; - -export type Workspace = BaseModel & BaseWorkspace; diff --git a/packages/insomnia-inso/src/db/models/types.ts b/packages/insomnia-inso/src/db/models/types.ts new file mode 100644 index 00000000000..dfd5130e5fe --- /dev/null +++ b/packages/insomnia-inso/src/db/models/types.ts @@ -0,0 +1,42 @@ +// Simplified and extracted from insomnia-app/app/models/* +export type BaseModel = { + _id: string + type: string + parentId: string +} + +type BaseApiSpec = { + fileName: string + contentType: 'json' | 'yaml' + contents: string +} + +export type ApiSpec = BaseModel & BaseApiSpec + +type BaseUnitTestSuite = { + name: string +} + +export type UnitTestSuite = BaseModel & BaseUnitTestSuite + +type BaseUnitTest = { + name: string + code: string + requestId: string | null +} + +export type UnitTest = BaseModel & BaseUnitTest + +type BaseEnvironment = { + name: string + metaSortKey: number +} + +export type Environment = BaseModel & BaseEnvironment + +type BaseWorkspace = { + name: string + description: string +} + +export type Workspace = BaseModel & BaseWorkspace diff --git a/packages/insomnia-inso/src/db/models/__tests__/unit-test-suite.test.js b/packages/insomnia-inso/src/db/models/unit-test-suite.test.ts similarity index 84% rename from packages/insomnia-inso/src/db/models/__tests__/unit-test-suite.test.js rename to packages/insomnia-inso/src/db/models/unit-test-suite.test.ts index 72abdf67aac..6b5faa82607 100644 --- a/packages/insomnia-inso/src/db/models/__tests__/unit-test-suite.test.js +++ b/packages/insomnia-inso/src/db/models/unit-test-suite.test.ts @@ -1,34 +1,33 @@ -// @flow -import type { Database } from '../../index'; -import { emptyDb } from '../../index'; -import type { ApiSpec, UnitTestSuite, Workspace } from '../types'; +import type { Database } from '../index'; +import { emptyDb } from '../index'; +import type { ApiSpec, UnitTestSuite, Workspace } from './types'; import enquirer from 'enquirer'; -import { generateIdIsh } from '../util'; -import { loadTestSuites, promptTestSuites } from '../unit-test-suite'; +import { generateIdIsh } from './util'; +import { loadTestSuites, promptTestSuites } from './unit-test-suite'; jest.mock('enquirer'); describe('Unit Test Suite', () => { let db: Database = emptyDb(); - const workspace: $Shape = { + const workspace: Partial = { _id: 'wrk_1234567890', name: 'workspace name', }; - const spec: $Shape = { + const spec: Partial = { _id: 'spc_1234567890', fileName: 'spec name', parentId: workspace._id, }; - const suite1: $Shape = { + const suite1: Partial = { _id: 'uts_1234567890', name: 'suite one', parentId: workspace._id, }; - const suite2: $Shape = { + const suite2: Partial = { _id: 'uts_987654321', name: 'suite two', parentId: workspace._id, @@ -36,19 +35,16 @@ describe('Unit Test Suite', () => { beforeEach(() => { db = emptyDb(); - - const dummySuite: $Shape = { + const dummySuite: Partial = { _id: 'uts_dummy', name: 'dummy suite', parentId: 'dummy parent', }; - db.Workspace.push(workspace); db.ApiSpec.push(spec); db.UnitTestSuite.push(suite1); db.UnitTestSuite.push(suite2); db.UnitTestSuite.push(dummySuite); - jest.clearAllMocks(); }); @@ -72,18 +68,15 @@ describe('Unit Test Suite', () => { enquirer.__mockPromptRun('suite one - uts_123456'); const result = await promptTestSuites(db, false); - expect(result).toHaveLength(1); expect(result).toContain(suite1); }); it('should match snapshot of autocomplete config', async () => { await promptTestSuites(db, false); - expect(enquirer.__constructorMock.mock.calls[0][0]).toMatchSnapshot(); }); }); - describe('loadTestSuites()', () => { it('should return empty array if no suites matched', () => { expect(loadTestSuites(db, 'not-found')).toHaveLength(0); @@ -91,7 +84,7 @@ describe('Unit Test Suite', () => { it.each([generateIdIsh(workspace), workspace._id, workspace.name])( 'should load all suites that match by workspace id: %o', - identifier => { + (identifier) => { const result = loadTestSuites(db, identifier); expect(result).toHaveLength(2); expect(result).toContain(suite1); @@ -101,7 +94,7 @@ describe('Unit Test Suite', () => { it.each([generateIdIsh(spec), spec._id, spec.fileName])( 'should load all suites that match by apiSpec id: %o', - identifier => { + (identifier) => { const result = loadTestSuites(db, identifier); expect(result).toHaveLength(2); expect(result).toContain(suite1); @@ -111,7 +104,7 @@ describe('Unit Test Suite', () => { it.each([generateIdIsh(suite1), suite1._id, suite1.name])( 'should load single suite that matches by id: %o', - identifier => { + (identifier) => { const result = loadTestSuites(db, identifier); expect(result).toHaveLength(1); expect(result).toContain(suite1); diff --git a/packages/insomnia-inso/src/db/models/unit-test-suite.js b/packages/insomnia-inso/src/db/models/unit-test-suite.ts similarity index 57% rename from packages/insomnia-inso/src/db/models/unit-test-suite.js rename to packages/insomnia-inso/src/db/models/unit-test-suite.ts index a35f697b3d3..a949736d823 100644 --- a/packages/insomnia-inso/src/db/models/unit-test-suite.js +++ b/packages/insomnia-inso/src/db/models/unit-test-suite.ts @@ -1,36 +1,47 @@ -// @flow import type { Database } from '../index'; import type { UnitTestSuite } from './types'; import { loadApiSpec } from './api-spec'; +// @ts-expect-error the enquirer types are incomplete https://github.com/enquirer/enquirer/pull/307 import { AutoComplete } from 'enquirer'; import flattenDeep from 'lodash.flattendeep'; -import { ensureSingleOrNone, generateIdIsh, getDbChoice, matchIdIsh } from './util'; +import { + ensureSingleOrNone, + generateIdIsh, + getDbChoice, + matchIdIsh, +} from './util'; import { loadWorkspace } from './workspace'; -import logger from '../../logger'; +import { logger } from '../../logger'; -export const loadUnitTestSuite = (db: Database, identifier: string): ?UnitTestSuite => { +export const loadUnitTestSuite = ( + db: Database, + identifier: string, +): UnitTestSuite | null | undefined => { // Identifier is for one specific suite; find it - logger.trace('Load unit test suite with identifier `%s` from data store', identifier); - const items = db.UnitTestSuite.filter(s => matchIdIsh(s, identifier) || s.name === identifier); + logger.trace( + 'Load unit test suite with identifier `%s` from data store', + identifier, + ); + const items = db.UnitTestSuite.filter( + suite => matchIdIsh(suite, identifier) || suite.name === identifier, + ); logger.trace('Found %d.', items.length); - return ensureSingleOrNone(items, 'unit test suite'); }; - -export const loadTestSuites = (db: Database, identifier: string): Array => { +export const loadTestSuites = ( + db: Database, + identifier: string, +): Array => { const apiSpec = loadApiSpec(db, identifier); - const workspace = loadWorkspace(db, apiSpec?.parentId || identifier); + const workspace = loadWorkspace(db, apiSpec?.parentId || identifier); // if identifier is for an apiSpec or a workspace, return all suites for that workspace - // if identifier is for an apiSpec or a workspace, return all suites for that workspace if (workspace) { return db.UnitTestSuite.filter(s => s.parentId === workspace._id); - } + } // load particular suite - // load particular suite const result = loadUnitTestSuite(db, identifier); return result ? [result] : []; }; - export const promptTestSuites = async ( db: Database, ci: boolean, @@ -41,8 +52,12 @@ export const promptTestSuites = async ( const choices = db.ApiSpec.map(spec => [ getDbChoice(generateIdIsh(spec), spec.fileName), - ...db.UnitTestSuite.filter(suite => suite.parentId === spec.parentId).map(suite => - getDbChoice(generateIdIsh(suite), suite.name, { indent: 1 }), + ...db.UnitTestSuite.filter( + suite => suite.parentId === spec.parentId, + ).map(suite => + getDbChoice(generateIdIsh(suite), suite.name, { + indent: 1, + }), ), ]); @@ -55,7 +70,6 @@ export const promptTestSuites = async ( message: 'Select a document or unit test suite', choices: flattenDeep(choices), }); - logger.trace('Prompt for document or test suite'); const [idIsh] = (await prompt.run()).split(' - ').reverse(); return loadTestSuites(db, idIsh); diff --git a/packages/insomnia-inso/src/db/models/util.js b/packages/insomnia-inso/src/db/models/util.js deleted file mode 100644 index 446e8738ee8..00000000000 --- a/packages/insomnia-inso/src/db/models/util.js +++ /dev/null @@ -1,54 +0,0 @@ -// @flow -import type { BaseModel } from './types'; -import { InsoError } from '../../errors'; - -export const matchIdIsh = ({ _id }: BaseModel, identifier: string) => _id.startsWith(identifier); -export const generateIdIsh = ({ _id }: BaseModel, length: number = 10) => _id.substr(0, length); - -function indent(level: number, code: string, tab: string = ' |'): string { - if (!level || level < 0) { - return code; - } - - const prefix = new Array(level + 1).join(tab); - return `${prefix} ${code}`; -} - -export const getDbChoice = ( - idIsh: string, - message: string, - config: { indent?: number, hint?: string } = {}, -) => ({ - name: idIsh, - message: indent(config.indent || 0, message), - value: `${message} - ${idIsh}`, - hint: config.hint || `${idIsh}`, -}); - -export const ensureSingleOrNone = (items: Array, entity: string): ?T => { - if (items.length === 1) { - return items[0]; - } - - if (items.length === 0) { - return null; - } - - throw new InsoError( - `Expected single or no ${entity} in the data store, but found multiple (${items.length}).`, - ); -}; - -export const ensureSingle = (items: Array, entity: string): T => { - if (items.length === 1) { - return items[0]; - } - - if (items.length === 0) { - throw new InsoError(`Expected single ${entity} in the data store, but found none.`); - } - - throw new InsoError( - `Expected single ${entity} in the data store, but found multiple (${items.length}).`, - ); -}; diff --git a/packages/insomnia-inso/src/db/models/util.ts b/packages/insomnia-inso/src/db/models/util.ts new file mode 100644 index 00000000000..728858f8cc9 --- /dev/null +++ b/packages/insomnia-inso/src/db/models/util.ts @@ -0,0 +1,60 @@ +import type { BaseModel } from './types'; +import { InsoError } from '../../errors'; +export const matchIdIsh = ({ _id }: BaseModel, identifier: string) => + _id.startsWith(identifier); +export const generateIdIsh = ({ _id }: BaseModel, length = 10) => + _id.substr(0, length); + +function indent(level: number, code: string, tab = ' |'): string { + if (!level || level < 0) { + return code; + } + + const prefix = new Array(level + 1).join(tab); + return `${prefix} ${code}`; +} + +export const getDbChoice = ( + idIsh: string, + message: string, + config: { + indent?: number + hint?: string + } = {}, +) => ({ + name: idIsh, + message: indent(config.indent || 0, message), + value: `${message} - ${idIsh}`, + hint: config.hint || `${idIsh}`, +}); +export const ensureSingleOrNone = ( + items: Array, + entity: string, +): T | null | undefined => { + if (items.length === 1) { + return items[0]; + } + + if (items.length === 0) { + return null; + } + + throw new InsoError( + `Expected single or no ${entity} in the data store, but found multiple (${items.length}).`, + ); +}; +export const ensureSingle = (items: Array, entity: string): T => { + if (items.length === 1) { + return items[0]; + } + + if (items.length === 0) { + throw new InsoError( + `Expected single ${entity} in the data store, but found none.`, + ); + } + + throw new InsoError( + `Expected single ${entity} in the data store, but found multiple (${items.length}).`, + ); +}; diff --git a/packages/insomnia-inso/src/db/models/workspace.js b/packages/insomnia-inso/src/db/models/workspace.js deleted file mode 100644 index 961b154585f..00000000000 --- a/packages/insomnia-inso/src/db/models/workspace.js +++ /dev/null @@ -1,13 +0,0 @@ -// @flow -import type { Database } from '../index'; -import type { Workspace } from './types'; -import { ensureSingleOrNone, matchIdIsh } from './util'; -import logger from '../../logger'; - -export const loadWorkspace = (db: Database, identifier: string): ?Workspace => { - logger.trace('Load workspace with identifier `%s` from data store', identifier); - const items = db.Workspace.filter(s => matchIdIsh(s, identifier) || s.name === identifier); - logger.trace('Found %d.', items.length); - - return ensureSingleOrNone(items, 'workspace'); -}; diff --git a/packages/insomnia-inso/src/db/models/__tests__/workspace.test.js b/packages/insomnia-inso/src/db/models/workspace.test.ts similarity index 72% rename from packages/insomnia-inso/src/db/models/__tests__/workspace.test.js rename to packages/insomnia-inso/src/db/models/workspace.test.ts index e4efa306fd2..da1fff4f020 100644 --- a/packages/insomnia-inso/src/db/models/__tests__/workspace.test.js +++ b/packages/insomnia-inso/src/db/models/workspace.test.ts @@ -1,26 +1,22 @@ -// @flow -import type { Database } from '../../index'; -import { emptyDb } from '../../index'; -import type { Workspace } from '../types'; -import { generateIdIsh } from '../util'; -import { loadWorkspace } from '../workspace'; +import type { Database } from '../index'; +import { emptyDb } from '../index'; +import type { Workspace } from './types'; +import { generateIdIsh } from './util'; +import { loadWorkspace } from './workspace'; describe('workspace', () => { let db: Database = emptyDb(); - - const workspace: $Shape = { + const workspace: Partial = { _id: 'wrk_1234567890', name: 'workspace name', }; beforeEach(() => { db = emptyDb(); - - const dummyWorkspace: $Shape = { + const dummyWorkspace: Partial = { _id: 'wrk_dummy', name: 'dummy workspace', }; - db.Workspace.push(workspace); db.Workspace.push(dummyWorkspace); }); @@ -32,14 +28,13 @@ describe('workspace', () => { it.each([generateIdIsh(workspace), workspace._id, workspace.name])( 'should return workspace with identifier: %o', - identifier => { + (identifier) => { expect(loadWorkspace(db, identifier)).toBe(workspace); }, ); it('should throw error if multiple workspace matched', () => { db.Workspace.push({ ...workspace }); - expect(() => loadWorkspace(db, workspace._id)).toThrowError(); }); }); diff --git a/packages/insomnia-inso/src/db/models/workspace.ts b/packages/insomnia-inso/src/db/models/workspace.ts new file mode 100644 index 00000000000..2de3871a317 --- /dev/null +++ b/packages/insomnia-inso/src/db/models/workspace.ts @@ -0,0 +1,15 @@ +import type { Database } from '../index'; +import { ensureSingleOrNone, matchIdIsh } from './util'; +import { logger } from '../../logger'; + +export const loadWorkspace = (db: Database, identifier: string) => { + logger.trace( + 'Load workspace with identifier `%s` from data store', + identifier, + ); + const items = db.Workspace.filter(workspace => ( + matchIdIsh(workspace, identifier) || workspace.name === identifier + )); + logger.trace('Found %d.', items.length); + return ensureSingleOrNone(items, 'workspace'); +}; diff --git a/packages/insomnia-inso/src/errors.js b/packages/insomnia-inso/src/errors.ts similarity index 86% rename from packages/insomnia-inso/src/errors.js rename to packages/insomnia-inso/src/errors.ts index d9238976920..34d5bcf6378 100644 --- a/packages/insomnia-inso/src/errors.js +++ b/packages/insomnia-inso/src/errors.ts @@ -1,9 +1,6 @@ -// @flow - -import logger from './logger'; - +import { logger } from './logger'; export class InsoError extends Error { - cause: ?Error; + cause: Error | null | undefined; constructor(message: string, cause?: Error) { super(message); @@ -19,5 +16,6 @@ export const handleError = (err?: Error) => { } else if (err) { logger.error(err); } + logger.info('To view tracing information, re-run `inso` with `--verbose`'); }; diff --git a/packages/insomnia-inso/src/__fixtures__/.insorc-blank.yaml b/packages/insomnia-inso/src/fixtures/.insorc-blank.yaml similarity index 100% rename from packages/insomnia-inso/src/__fixtures__/.insorc-blank.yaml rename to packages/insomnia-inso/src/fixtures/.insorc-blank.yaml diff --git a/packages/insomnia-inso/src/__fixtures__/.insorc-missing-properties.yaml b/packages/insomnia-inso/src/fixtures/.insorc-missing-properties.yaml similarity index 100% rename from packages/insomnia-inso/src/__fixtures__/.insorc-missing-properties.yaml rename to packages/insomnia-inso/src/fixtures/.insorc-missing-properties.yaml diff --git a/packages/insomnia-inso/src/__fixtures__/.insorc-with-scripts.yaml b/packages/insomnia-inso/src/fixtures/.insorc-with-scripts.yaml similarity index 100% rename from packages/insomnia-inso/src/__fixtures__/.insorc-with-scripts.yaml rename to packages/insomnia-inso/src/fixtures/.insorc-with-scripts.yaml diff --git a/packages/insomnia-inso/src/__fixtures__/.insorc.yaml b/packages/insomnia-inso/src/fixtures/.insorc.yaml similarity index 100% rename from packages/insomnia-inso/src/__fixtures__/.insorc.yaml rename to packages/insomnia-inso/src/fixtures/.insorc.yaml diff --git a/packages/insomnia-inso/src/__tests__/get-options.test.js b/packages/insomnia-inso/src/get-options.test.ts similarity index 73% rename from packages/insomnia-inso/src/__tests__/get-options.test.js rename to packages/insomnia-inso/src/get-options.test.ts index 202e925f041..b4679e3180c 100644 --- a/packages/insomnia-inso/src/__tests__/get-options.test.js +++ b/packages/insomnia-inso/src/get-options.test.ts @@ -1,31 +1,28 @@ -// @flow import commander from 'commander'; -import getOptions, { extractCommandOptions, loadCosmiConfig } from '../get-options'; +import { getOptions, extractCommandOptions, loadCosmiConfig } from './get-options'; import path from 'path'; +import { noop } from './util'; jest.unmock('cosmiconfig'); -const fixturesDir = path.join('src', '__fixtures__'); +const fixturesDir = path.join('src', 'fixtures'); describe('extractCommandOptions()', () => { it('should combine options from all commands into one object', () => { const command = new commander.Command('command').exitOverride(); - command .command('subCommand') .option('-s, --subCmd') - .action(cmd => { + .action((cmd) => { expect(extractCommandOptions(cmd)).toEqual({ global: true, subCmd: true, }); }); - const parent = new commander.Command() .exitOverride() .option('-g, --global') .addCommand(command); - parent.parse('self inso command subCommand --global --subCmd'.split(' ')); }); }); @@ -33,23 +30,26 @@ describe('extractCommandOptions()', () => { describe('loadCosmiConfig()', () => { it('should load .insorc.yaml config file in fixtures dir', () => { const result = loadCosmiConfig(path.join(fixturesDir, '.insorc.yaml')); - expect(result).toEqual({ __configFile: { - options: { appDataDir: 'configFile', workingDir: 'workingDir', ci: true }, - scripts: { lint: 'inso lint spec' }, + options: { + appDataDir: 'configFile', + workingDir: 'workingDir', + ci: true, + }, + scripts: { + lint: 'inso lint spec', + }, filePath: path.resolve(fixturesDir, '.insorc.yaml'), }, }); - expect(result.__configFile?.options?.shouldBeIgnored).toBe(undefined); }); it('should return empty object and report error if specified config file not found', () => { - const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); - const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); + const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(noop); + const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(noop); const result = loadCosmiConfig('not-found.yaml'); - expect(result).toEqual({}); expect(consoleLogSpy).toHaveBeenCalledWith('Could not find config file at not-found.yaml.'); expect(consoleErrorSpy).toHaveBeenCalled(); @@ -74,34 +74,47 @@ describe('loadCosmiConfig()', () => { describe('getOptions', () => { it('should load default options', () => { - const commandOptions = { opts: () => ({}) }; - const defaultOptions = { appDataDir: 'default' }; - + const commandOptions = { + opts: () => ({}), + }; + const defaultOptions = { + appDataDir: 'default', + }; const result = getOptions(commandOptions, defaultOptions); - - expect(result).toEqual({ appDataDir: 'default' }); + expect(result).toEqual({ + appDataDir: 'default', + }); }); it('should combine default options with command options, favouring command', () => { - const commandOptions = { opts: () => ({ appDataDir: 'command' }) }; - const defaultOptions = { appDataDir: 'default', anotherDefault: '0' }; - + const commandOptions = { + opts: () => ({ + appDataDir: 'command', + }), + }; + const defaultOptions = { + appDataDir: 'default', + anotherDefault: '0', + }; const result = getOptions(commandOptions, defaultOptions); - - expect(result).toEqual({ appDataDir: 'command', anotherDefault: '0' }); + expect(result).toEqual({ + appDataDir: 'command', + anotherDefault: '0', + }); }); it('should combine config file options with default options, favouring config file', () => { - // Will also load src/__fixtures__/.insorc.yaml + // Will also load src/fixtures/.insorc.yaml const commandOptions = { opts: () => ({ config: path.join(fixturesDir, '.insorc.yaml'), }), }; - const defaultOptions = { appDataDir: 'default', anotherDefault: '0' }; - + const defaultOptions = { + appDataDir: 'default', + anotherDefault: '0', + }; const result = getOptions(commandOptions, defaultOptions); - expect(result).toEqual({ appDataDir: 'configFile', workingDir: 'workingDir', @@ -109,35 +122,39 @@ describe('getOptions', () => { anotherDefault: '0', config: path.join(fixturesDir, '.insorc.yaml'), __configFile: { - options: { appDataDir: 'configFile', workingDir: 'workingDir', ci: true }, - scripts: { lint: 'inso lint spec' }, + options: { + appDataDir: 'configFile', + workingDir: 'workingDir', + ci: true, + }, + scripts: { + lint: 'inso lint spec', + }, filePath: path.resolve(fixturesDir, '.insorc.yaml'), }, }); }); it('should print error to console if config file not found', () => { - const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); - const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); - + const logSpy = jest.spyOn(console, 'log').mockImplementation(noop); + const errSpy = jest.spyOn(console, 'error').mockImplementation(noop); const configFilePath = path.join(fixturesDir, '.insorc-not-found.yaml'); - - // Will also load src/__fixtures__/.insorc.yaml + // Will also load src/fixtures/.insorc.yaml const commandOptions = { opts: () => ({ config: configFilePath, }), }; - const defaultOptions = { appDataDir: 'default', anotherDefault: '0' }; - + const defaultOptions = { + appDataDir: 'default', + anotherDefault: '0', + }; const result = getOptions(commandOptions, defaultOptions); - expect(result).toEqual({ appDataDir: 'default', anotherDefault: '0', config: configFilePath, }); - expect(logSpy).toHaveBeenCalledWith(`Could not find config file at ${configFilePath}.`); expect(errSpy).toHaveBeenCalled(); }); diff --git a/packages/insomnia-inso/src/get-options.js b/packages/insomnia-inso/src/get-options.ts similarity index 59% rename from packages/insomnia-inso/src/get-options.js rename to packages/insomnia-inso/src/get-options.ts index 0d928c0b6aa..8bc81a2aa15 100644 --- a/packages/insomnia-inso/src/get-options.js +++ b/packages/insomnia-inso/src/get-options.ts @@ -1,24 +1,25 @@ -// @flow import { cosmiconfigSync } from 'cosmiconfig'; +import { GenerateConfigOptions } from './commands/generate-config'; +import { UNKNOWN_OBJ } from './types'; type ConfigFileOptions = { __configFile?: { - options?: Object, - scripts?: Object, - filePath: string, - }, + options?: UNKNOWN_OBJ; + scripts?: UNKNOWN_OBJ; + filePath: string; + }; }; export type GlobalOptions = { - appDataDir?: string, - workingDir?: string, - ci?: boolean, - verbose?: boolean, - printOptions?: boolean, - config?: string, + appDataDir?: string; + workingDir?: string; + ci?: boolean; + verbose?: boolean; + printOptions?: boolean; + config?: string; } & ConfigFileOptions; -const OptionsSupportedInConfigFile: Array<$Keys> = [ +const OptionsSupportedInConfigFile: (keyof GlobalOptions)[] = [ 'appDataDir', 'workingDir', 'ci', @@ -26,22 +27,20 @@ const OptionsSupportedInConfigFile: Array<$Keys> = [ 'printOptions', ]; -export const loadCosmiConfig = (configFile?: string): ConfigFileOptions => { +export const loadCosmiConfig = (configFile?: string): Partial => { try { const explorer = cosmiconfigSync('inso'); - const results = configFile ? explorer.load(configFile) : explorer.search(); if (results && !results?.isEmpty) { - const options = {}; - + const options: UNKNOWN_OBJ = {}; OptionsSupportedInConfigFile.forEach(key => { const value = results.config?.options?.[key]; + if (value) { options[key] = value; } }); - return { __configFile: { options, @@ -61,9 +60,14 @@ export const loadCosmiConfig = (configFile?: string): ConfigFileOptions => { return {}; }; -export const extractCommandOptions = (cmd: Object): $Shape => { - let opts = {}; - let command = cmd; +type CommandObj = { + parent?: CommandObj; + opts: () => GenerateConfigOptions +} + +export const extractCommandOptions = (cmd: CommandObj): Partial => { + let opts: Partial = {}; + let command: CommandObj | undefined = cmd; do { // overwrite options with more specific ones @@ -74,9 +78,8 @@ export const extractCommandOptions = (cmd: Object): $Shape => { return opts; }; -const getOptions = (cmd: Object, defaultOptions: $Shape = {}): T => { +export const getOptions = >(cmd: CommandObj, defaultOptions: Partial = {}): Partial => { const commandOptions = extractCommandOptions(cmd); - const { __configFile } = loadCosmiConfig(commandOptions.config); if (__configFile) { @@ -88,7 +91,8 @@ const getOptions = (cmd: Object, defaultOptions: $Shape = {}): T => { }; } - return { ...defaultOptions, ...commandOptions }; + return { + ...defaultOptions, + ...commandOptions, + }; }; - -export default getOptions; diff --git a/packages/insomnia-inso/src/global.d.ts b/packages/insomnia-inso/src/global.d.ts new file mode 100644 index 00000000000..695084245a9 --- /dev/null +++ b/packages/insomnia-inso/src/global.d.ts @@ -0,0 +1,8 @@ +import { Database } from './db'; + +declare module 'insomnia-send-request' { + // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(TSCONVERSION) missing types from insomnia-send-request + export function getSendRequestCallbackMemDb(environmentId: string, db: Database): Promise; +} + +export {}; diff --git a/packages/insomnia-inso/src/index.ts b/packages/insomnia-inso/src/index.ts new file mode 100644 index 00000000000..f8c29a028ab --- /dev/null +++ b/packages/insomnia-inso/src/index.ts @@ -0,0 +1 @@ +export { go } from './cli'; diff --git a/packages/insomnia-inso/src/__tests__/inso-snapshot.test.js b/packages/insomnia-inso/src/inso-snapshot.test.ts similarity index 70% rename from packages/insomnia-inso/src/__tests__/inso-snapshot.test.js rename to packages/insomnia-inso/src/inso-snapshot.test.ts index 3a2f1c3a81c..0a853c41b72 100644 --- a/packages/insomnia-inso/src/__tests__/inso-snapshot.test.js +++ b/packages/insomnia-inso/src/inso-snapshot.test.ts @@ -1,10 +1,8 @@ -// @flow import execa from 'execa'; import { getBinPathSync } from 'get-bin-path'; // MAKE SURE YOU BUILD THE PROJECT BEFORE RUNNING THESE TESTS. // These tests use the executable /bin/inso, which relies on /dist. - describe('Snapshot for', () => { it.each([ '-h', @@ -20,8 +18,13 @@ describe('Snapshot for', () => { 'export spec -h', ])( '"inso %s"', - async args => { - const { stdout } = await execa(getBinPathSync(), args.split(' ')); + async (args) => { + const binPath = getBinPathSync(); + if (binPath === undefined) { + throw new Error('unable to get binary path'); + } + + const { stdout } = await execa(binPath, args.split(' ')); expect(stdout).toMatchSnapshot(); }, 30000, diff --git a/packages/insomnia-inso/__mocks__/node-libcurl.js b/packages/insomnia-inso/src/jest/__mocks__/node-libcurl.ts similarity index 85% rename from packages/insomnia-inso/__mocks__/node-libcurl.js rename to packages/insomnia-inso/src/jest/__mocks__/node-libcurl.ts index bc625e2b76f..3d9cd7dda1d 100644 --- a/packages/insomnia-inso/__mocks__/node-libcurl.js +++ b/packages/insomnia-inso/src/jest/__mocks__/node-libcurl.ts @@ -1,3 +1,3 @@ // Just do nothing for node-libcurl. It fails to import in CI because it will have been // built with Electron headers. -module.exports = {}; +export {}; diff --git a/packages/insomnia-inso/src/jest/before.ts b/packages/insomnia-inso/src/jest/before.ts new file mode 100644 index 00000000000..b28347b4c3d --- /dev/null +++ b/packages/insomnia-inso/src/jest/before.ts @@ -0,0 +1,35 @@ +import { logType } from 'consola'; +import { logger, LogsByType } from '../logger'; + +// Taken from https://github.com/unjs/consola/blob/master/types/consola.d.ts#L16 +const logTypes: logType[] = [ + 'silent', + 'fatal', + 'error', + 'warn', + 'log', + 'info', + 'success', + 'debug', + 'trace', + 'verbose', + 'ready', + 'start', +]; + +export const globalBeforeAll = () => { + logger.__getLogs = () => logTypes.reduce((accumulator, level) => { + // @ts-expect-error the consola types are incomplete + const calls = (logger[level] as jest.Mock).mock.calls.map(call => ( + call.length === 1 ? call[0] : call + )); + return { + ...accumulator, + [level]: calls, + }; + }, {} as LogsByType); + }; + +export const globalBeforeEach = () => { + logger.mockTypes(() => jest.fn()); +}; diff --git a/packages/insomnia-inso/__jest__/setup.js b/packages/insomnia-inso/src/jest/setup.ts similarity index 99% rename from packages/insomnia-inso/__jest__/setup.js rename to packages/insomnia-inso/src/jest/setup.ts index b5da5dddeed..28700cd97c2 100644 --- a/packages/insomnia-inso/__jest__/setup.js +++ b/packages/insomnia-inso/src/jest/setup.ts @@ -1,3 +1,2 @@ jest.mock('node-libcurl'); - process.env.DEFAULT_APP_NAME = process.env.DEFAULT_APP_NAME || 'insomnia-app'; diff --git a/packages/insomnia-inso/src/logger.js b/packages/insomnia-inso/src/logger.js deleted file mode 100644 index ce822852bd3..00000000000 --- a/packages/insomnia-inso/src/logger.js +++ /dev/null @@ -1,24 +0,0 @@ -// @flow -import consola from 'consola'; - -export const noConsoleLog = async (callback: () => Promise): Promise => { - const oldConsoleLog = console.log; - (console: Object).log = () => {}; - - try { - return await callback(); - } finally { - (console: Object).log = oldConsoleLog; - } -}; - -const logger = consola.create({ - reporters: [new consola.FancyReporter({ formatOptions: { date: false } })], -}); - -export const configureLogger = (verbose: boolean = false, ci: boolean = false) => { - logger.level = verbose ? consola.LogLevel.Verbose : consola.LogLevel.Info; - ci && logger.setReporters([new consola.BasicReporter()]); -}; - -export default logger; diff --git a/packages/insomnia-inso/src/__tests__/logger.test.js b/packages/insomnia-inso/src/logger.test.ts similarity index 75% rename from packages/insomnia-inso/src/__tests__/logger.test.js rename to packages/insomnia-inso/src/logger.test.ts index ff19823e893..f0550f8f156 100644 --- a/packages/insomnia-inso/src/__tests__/logger.test.js +++ b/packages/insomnia-inso/src/logger.test.ts @@ -1,21 +1,18 @@ -// @flow -import { noConsoleLog } from '../logger'; - +import { noConsoleLog } from './logger'; describe('logger', () => { describe('noConsoleLog()', () => { const originalConsoleLog = console.log; + afterAll(() => { - (console: Object).log = originalConsoleLog; + console.log = originalConsoleLog; }); it('should overwrite and reset console.log during callback', async () => { const consoleLogMock = jest.fn(); - (console: Object).log = consoleLogMock; - + console.log = consoleLogMock; await noConsoleLog(async () => { console.log('test'); }); - expect(console.log).toBe(consoleLogMock); expect(consoleLogMock).not.toHaveBeenCalled(); }); diff --git a/packages/insomnia-inso/src/logger.ts b/packages/insomnia-inso/src/logger.ts new file mode 100644 index 00000000000..7670c363030 --- /dev/null +++ b/packages/insomnia-inso/src/logger.ts @@ -0,0 +1,43 @@ +import consola, { LogLevel, FancyReporter, BasicReporter, logType } from 'consola'; +import { noop } from './util'; + +export const noConsoleLog = async (callback: () => Promise): Promise => { + const oldConsoleLog = console.log; + + console.log = noop; + + try { + return await callback(); + } finally { + console.log = oldConsoleLog; + } +}; + +export type LogsByType = { + [t in logType]?: string[] +} + +export type ModifiedConsola = ReturnType & { __getLogs: () => LogsByType}; + +const consolaLogger = consola.create({ + reporters: [ + new FancyReporter({ + formatOptions: { + // @ts-expect-error something is wrong here, ultimately these types come from https://nodejs.org/api/util.html#util_util_inspect_object_options and `date` doesn't appear to be one of the options. + date: false, + }, + }), + ], +}); + +(consolaLogger as ModifiedConsola).__getLogs = () => ({}); + +export const logger = consolaLogger as ModifiedConsola; + +export const configureLogger = (verbose = false, ci = false) => { + logger.level = verbose ? LogLevel.Verbose : LogLevel.Info; + + if (ci) { + logger.setReporters([new BasicReporter()]); + } +}; diff --git a/packages/insomnia-inso/src/openapi-2-kong.d.ts b/packages/insomnia-inso/src/openapi-2-kong.d.ts new file mode 100644 index 00000000000..3db71a54337 --- /dev/null +++ b/packages/insomnia-inso/src/openapi-2-kong.d.ts @@ -0,0 +1,57 @@ +// TODO(TSCONVERSION) remove this when the conversion for o2k is complete + +declare module 'openapi-2-kong' { + /** TODO(TSCONVERSION) this can be taken from the official types OpenAPIV3.Document */ + type OpenAPI3Document = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [todo: string]: any; + } + + export type ConversionResultType = 'kong-declarative-config' | 'kong-for-kubernetes' + + export type DeclarativeConfigResult = { + type: 'kong-declarative-config', + label: string, + documents: Object, + warnings: { + severity: number, + message: string, + range: { + /* TODO */ + }, + }[], + }; + + export type KongForKubernetesResult = { + type: 'kong-for-kubernetes', + label: string, + documents: Object[], + warnings: { + severity: number, + message: string, + range: { + /* TODO */ + }, + }[], + }; + + export type ConversionResult = DeclarativeConfigResult | KongForKubernetesResult; + + export function generateFromString( + spec: string, + type: ConversionResultType, + tags?: string[], + ): Promise + + export function generateFromSpec( + spec: OpenAPI3Document, + type: ConversionResultType, + tags?: string[] + ): Promise + + export function generate( + filename: string, + type: ConversionResultType, + tags?: string[], + ): Promise +} diff --git a/packages/insomnia-inso/src/types.ts b/packages/insomnia-inso/src/types.ts new file mode 100644 index 00000000000..53ff519e684 --- /dev/null +++ b/packages/insomnia-inso/src/types.ts @@ -0,0 +1,8 @@ +/** TypeScript version of "TODO" but for types */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any -- This is a utility type explicitly inteded for the sake of typescript conversions +export type UNKNOWN = any; + +/** TypeScript version of "TODO" but for Objects */ +export type UNKNOWN_OBJ = { + [key: string]: UNKNOWN; +}; diff --git a/packages/insomnia-inso/src/__tests__/util.test.js b/packages/insomnia-inso/src/util.test.ts similarity index 86% rename from packages/insomnia-inso/src/__tests__/util.test.js rename to packages/insomnia-inso/src/util.test.ts index 767a3efec09..608ac566d53 100644 --- a/packages/insomnia-inso/src/__tests__/util.test.js +++ b/packages/insomnia-inso/src/util.test.ts @@ -1,55 +1,51 @@ -// @flow -import { exit, logErrorExit1, getDefaultAppName, getVersion, isDevelopment } from '../util'; -import * as packageJson from '../../package.json'; -import { globalBeforeAll, globalBeforeEach } from '../../__jest__/before'; -import logger from '../logger'; -import { InsoError } from '../errors'; +import { exit, logErrorExit1, getDefaultAppName, getVersion, isDevelopment, noop } from './util'; +import * as packageJson from '../package.json'; +import { globalBeforeAll, globalBeforeEach } from './jest/before'; +import { logger } from './logger'; +import { InsoError } from './errors'; describe('exit()', () => { beforeAll(() => { globalBeforeAll(); }); + beforeEach(() => { globalBeforeEach(); }); it('should exit 0 if successful result', async () => { const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); - - await exit(new Promise(resolve => resolve(true))); - + await exit(new Promise((resolve) => resolve(true))); expect(exitSpy).toHaveBeenCalledWith(0); }); it('should exit 1 if unsuccessful result', async () => { const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); - - await exit(new Promise(resolve => resolve(false))); - + await exit(new Promise((resolve) => resolve(false))); expect(exitSpy).toHaveBeenCalledWith(1); }); - it('should exit 1 and print to console and if rejected', async () => { + it.only('should exit 1 and print to console if rejected', async () => { const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); - const error = new Error('message'); await exit(new Promise((resolve, reject) => reject(error))); const logs = logger.__getLogs(); + expect(logs.fatal).toEqual([]); expect(logs.error).toEqual([error]); expect(logs.info).toEqual(['To view tracing information, re-run `inso` with `--verbose`']); expect(exitSpy).toHaveBeenCalledWith(1); }); - it('should exit 1 and print to console and if rejected with InsoError', async () => { + it('should exit 1 and print to console if rejected with InsoError', async () => { const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); - const cause = new Error('message'); const insoError = new InsoError('inso error', cause); await exit(new Promise((resolve, reject) => reject(insoError))); const logs = logger.__getLogs(); + expect(logs.fatal).toEqual([insoError.message]); expect(logs.error).toEqual([cause]); expect(logs.info).toEqual(['To view tracing information, re-run `inso` with `--verbose`']); @@ -58,11 +54,11 @@ describe('exit()', () => { it('should exit 1 and print to console and if rejected with InsoError without cause', async () => { const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); - const insoError = new InsoError('inso error'); await exit(new Promise((resolve, reject) => reject(insoError))); const logs = logger.__getLogs(); + expect(logs.fatal).toEqual([insoError.message]); expect(logs.error).toEqual([]); expect(logs.info).toEqual(['To view tracing information, re-run `inso` with `--verbose`']); @@ -74,39 +70,37 @@ describe('logErrorExit1()', () => { beforeAll(() => { globalBeforeAll(); }); + beforeEach(() => { globalBeforeEach(); }); it('should exit 1 and print error to console', async () => { const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); - const error = new Error('message'); await logErrorExit1(error); const logs = logger.__getLogs(); + expect(logs.error).toEqual([error]); expect(logs.info).toEqual(['To view tracing information, re-run `inso` with `--verbose`']); - expect(exitSpy).toHaveBeenCalledWith(1); }); it('should exit 1', async () => { const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {}); - await logErrorExit1(); const logs = logger.__getLogs(); + expect(logs.error).toEqual([]); expect(logs.info).toEqual(['To view tracing information, re-run `inso` with `--verbose`']); - expect(exitSpy).toHaveBeenCalledWith(1); }); }); describe('getDefaultAppName()', () => { const OLD_ENV = process.env; - beforeEach(() => { process.env = { ...OLD_ENV }; // make a copy }); @@ -123,7 +117,6 @@ describe('getDefaultAppName()', () => { it('should throw error if not set', () => { process.env.DEFAULT_APP_NAME = ''; - expect(getDefaultAppName).toThrowError('Environment variable DEFAULT_APP_NAME is not set.'); }); }); @@ -135,10 +128,8 @@ describe('getVersion()', () => { it('should return dev if running in development', () => { const oldNodeEnv = process.env.NODE_ENV; - process.env.NODE_ENV = 'development'; expect(getVersion()).toBe('dev'); - process.env.NODE_ENV = oldNodeEnv; }); }); @@ -146,19 +137,24 @@ describe('getVersion()', () => { describe('isDevelopment()', () => { it('should return true if NODE_ENV is development', () => { const oldNodeEnv = process.env.NODE_ENV; - process.env.NODE_ENV = 'development'; expect(isDevelopment()).toBe(true); - process.env.NODE_ENV = oldNodeEnv; }); it('should return false if NODE_ENV is not development', () => { const oldNodeEnv = process.env.NODE_ENV; - process.env.NODE_ENV = 'production'; expect(isDevelopment()).toBe(false); - process.env.NODE_ENV = oldNodeEnv; }); }); + +describe('noop()', () => { + it('should return nothing', () => { + expect(noop()).toBe(undefined); + + // @ts-expect-error -- intentionally testing invalid inputs + expect(noop('argument')).toBe(undefined); + }); +}); diff --git a/packages/insomnia-inso/src/util.js b/packages/insomnia-inso/src/util.ts similarity index 51% rename from packages/insomnia-inso/src/util.js rename to packages/insomnia-inso/src/util.ts index e0ee1467a5b..80740036f49 100644 --- a/packages/insomnia-inso/src/util.js +++ b/packages/insomnia-inso/src/util.ts @@ -1,25 +1,24 @@ -// @flow -import * as packageJson from '../package.json'; +import packageJson from '../package.json'; import { handleError } from './errors'; -export function getVersion() { +export const getVersion = () => { return isDevelopment() ? 'dev' : packageJson.version; -} +}; -export function isDevelopment() { +export const isDevelopment = () => { return process.env.NODE_ENV === 'development'; -} +}; -export function logErrorExit1(err?: Error) { +export const logErrorExit1 = (err?: Error) => { handleError(err); process.exit(1); -} +}; -export async function exit(result: Promise): Promise { +export const exit = async (result: Promise): Promise => { return result.then(r => process.exit(r ? 0 : 1)).catch(logErrorExit1); -} +}; -export function getDefaultAppName(): string { +export const getDefaultAppName = (): string => { const name = process.env.DEFAULT_APP_NAME; if (!name) { @@ -27,4 +26,7 @@ export function getDefaultAppName(): string { } return name; -} +}; + +// eslint-disable-next-line @typescript-eslint/no-empty-function +export const noop = () => {}; diff --git a/packages/insomnia-inso/src/__tests__/write-file.test.js b/packages/insomnia-inso/src/write-file.test.ts similarity index 82% rename from packages/insomnia-inso/src/__tests__/write-file.test.js rename to packages/insomnia-inso/src/write-file.test.ts index 9996da3a16e..c4e3bc807f1 100644 --- a/packages/insomnia-inso/src/__tests__/write-file.test.js +++ b/packages/insomnia-inso/src/write-file.test.ts @@ -1,25 +1,21 @@ -// @flow import path from 'path'; -import { writeFileWithCliOptions } from '../write-file'; +import { writeFileWithCliOptions } from './write-file'; import mkdirp from 'mkdirp'; import fs from 'fs'; -import { InsoError } from '../errors'; +import { InsoError } from './errors'; import os from 'os'; jest.mock('mkdirp', () => ({ - sync: jest.fn().mockResolvedValue(), + sync: jest.fn().mockResolvedValue(() => {}), })); jest.mock('fs', () => ({ promises: { - writeFile: jest.fn().mockResolvedValue(), + writeFile: jest.fn().mockResolvedValue(() => {}), }, })); describe('writeFileWithCliOptions', () => { - // make flow happy - const mock = (mockFn: any) => mockFn; - beforeEach(() => { jest.resetAllMocks(); }); @@ -28,68 +24,54 @@ describe('writeFileWithCliOptions', () => { const output = 'file.yaml'; const contents = 'contents'; const workingDir = undefined; - const promise = writeFileWithCliOptions(output, contents, workingDir); await expect(promise).resolves.toBe('file.yaml'); }); - it('should write to absolute output file', async () => { const absolutePath = path.join(os.tmpdir(), 'dev', 'file.yaml'); const output = absolutePath; const contents = 'contents'; const workingDir = undefined; - const promise = writeFileWithCliOptions(output, contents, workingDir); await expect(promise).resolves.toBe(absolutePath); }); - it('should write to absolute output file and ignore working dir', async () => { const absolutePath = path.join(os.tmpdir(), 'dev', 'file.yaml'); const output = absolutePath; const contents = 'contents'; const workingDir = 'working/dir'; - const promise = writeFileWithCliOptions(output, contents, workingDir); await expect(promise).resolves.toBe(absolutePath); }); - it('should write to output file under working dir', async () => { const output = 'file.yaml'; const contents = 'contents'; const workingDir = 'working/dir'; - const promise = writeFileWithCliOptions(output, contents, workingDir); await expect(promise).resolves.toBe(path.normalize('working/dir/file.yaml')); }); - it('should ensure the output directory exists', async () => { const output = 'output/dir/file.yaml'; const contents = 'contents'; const workingDir = 'working/dir'; - const result = await writeFileWithCliOptions(output, contents, workingDir); expect(result).toEqual(path.normalize('working/dir/output/dir/file.yaml')); - expect(mkdirp.sync).toHaveBeenCalledWith(path.normalize('working/dir/output/dir')); expect(fs.promises.writeFile).toHaveBeenCalledWith( path.normalize('working/dir/output/dir/file.yaml'), contents, ); }); - it('should return an error if make directory fails', async () => { const error = new Error('mkdir sync error'); - mock(mkdirp.sync).mockRejectedValue(error); - + (mkdirp.sync as jest.Mock).mockRejectedValue(error); const promise = writeFileWithCliOptions('file.yaml', 'contents'); - await expect(promise).rejects.toThrow(new InsoError(`Failed to write to "file.yaml"`, error)); + await expect(promise).rejects.toThrow(new InsoError('Failed to write to "file.yaml"', error)); }); - it('should return an error if write file fails', async () => { const error = new Error('fs promises writeFile error'); - mock(fs.promises.writeFile).mockRejectedValue(error); - + (fs.promises.writeFile as jest.Mock).mockRejectedValue(error); const promise = writeFileWithCliOptions('file.yaml', 'contents'); - await expect(promise).rejects.toThrow(new InsoError(`Failed to write to "file.yaml"`, error)); + await expect(promise).rejects.toThrow(new InsoError('Failed to write to "file.yaml"', error)); }); }); diff --git a/packages/insomnia-inso/src/write-file.js b/packages/insomnia-inso/src/write-file.ts similarity index 98% rename from packages/insomnia-inso/src/write-file.js rename to packages/insomnia-inso/src/write-file.ts index 65613aa3ae1..aae2295c72c 100644 --- a/packages/insomnia-inso/src/write-file.js +++ b/packages/insomnia-inso/src/write-file.ts @@ -1,15 +1,14 @@ -// @flow import path from 'path'; import mkdirp from 'mkdirp'; import fs from 'fs'; import { InsoError } from './errors'; - export async function writeFileWithCliOptions( output: string, contents: string, workingDir?: string, ): Promise { const outputPath = path.isAbsolute(output) ? output : path.join(workingDir || '.', output); + try { await mkdirp.sync(path.dirname(outputPath)); await fs.promises.writeFile(outputPath, contents); diff --git a/packages/insomnia-inso/tsconfig.build.json b/packages/insomnia-inso/tsconfig.build.json new file mode 100644 index 00000000000..b8d2487b20a --- /dev/null +++ b/packages/insomnia-inso/tsconfig.build.json @@ -0,0 +1,26 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "." + }, + "include": [ + "src", + "package.json", + "**/*.d.ts" + ], + "exclude": [ + "node_modules", + "dist", + "jest", + ".babelrc.js", + "jest.config.js", + "webpack", + "bin", + "assets", + "**/@types/mocha/*", + "**/*.test.ts", + "**/__snapshots__/**", + "**/__mocks__/*" + ] +} \ No newline at end of file diff --git a/packages/insomnia-inso/tsconfig.json b/packages/insomnia-inso/tsconfig.json new file mode 100644 index 00000000000..32cdf3c1d86 --- /dev/null +++ b/packages/insomnia-inso/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.build.json", + "include": [ + "src", + "package.json", + "jest.config.js", + "webpack" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/packages/insomnia-inso/webpack/webpack.config.base.js b/packages/insomnia-inso/webpack/webpack.config.base.js index bf493bbf458..bcaa436fe8a 100644 --- a/packages/insomnia-inso/webpack/webpack.config.base.js +++ b/packages/insomnia-inso/webpack/webpack.config.base.js @@ -1,26 +1,34 @@ const path = require('path'); + const nodeExternals = require('webpack-node-externals'); -module.exports = { - entry: { index: './src/cli.js' }, +module.exports = /** @type { import('webpack').Configuration } */ ({ + entry: './src/index.ts', target: 'node', - devtool: 'source-map', output: { path: path.resolve(__dirname, '..', 'dist'), - filename: '[name].js', + filename: 'index.js', library: 'insomniacli', libraryTarget: 'commonjs2', }, module: { rules: [ { - test: /\.js$/, + test: /\.tsx?$/, + loader: 'ts-loader', exclude: [/node_modules/], - use: { - loader: 'babel-loader', + options: { + configFile: 'tsconfig.build.json', }, }, ], }, - externals: [nodeExternals()], -}; + resolve: { + extensions: ['.js', '.ts'], + }, + externals: [ + 'node-libcurl', + 'mocha', + nodeExternals(), + ], +}); diff --git a/packages/insomnia-inso/webpack/webpack.config.development.js b/packages/insomnia-inso/webpack/webpack.config.development.js index 30ac016d22e..a48ef379de7 100644 --- a/packages/insomnia-inso/webpack/webpack.config.development.js +++ b/packages/insomnia-inso/webpack/webpack.config.development.js @@ -1,13 +1,16 @@ const webpack = require('webpack'); -const {merge} = require('webpack-merge'); +const { merge } = require('webpack-merge'); const base = require('./webpack.config.base'); -module.exports = merge(base, { - mode: 'development', - plugins: [ - new webpack.DefinePlugin({ - __DEV__: true, - 'process.env.DEFAULT_APP_NAME': JSON.stringify('insomnia-app'), - }), - ], -}); +module.exports = merge( + base, + /** @type { import('webpack').Configuration } */ ({ + mode: 'development', + plugins: [ + new webpack.DefinePlugin({ + __DEV__: true, + 'process.env.DEFAULT_APP_NAME': JSON.stringify('insomnia-app'), + }), + ], + }), +); diff --git a/packages/insomnia-inso/webpack/webpack.config.production.js b/packages/insomnia-inso/webpack/webpack.config.production.js index b7cee44f68f..6243dbf5707 100644 --- a/packages/insomnia-inso/webpack/webpack.config.production.js +++ b/packages/insomnia-inso/webpack/webpack.config.production.js @@ -1,15 +1,18 @@ const webpack = require('webpack'); -const {merge} = require('webpack-merge'); +const { merge } = require('webpack-merge'); const base = require('./webpack.config.base'); -module.exports = merge(base, { - mode: 'production', - optimization: { - minimize: true, - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env.DEFAULT_APP_NAME': JSON.stringify('Insomnia'), - }), - ], -}); +module.exports = merge( + base, + /** @type { import('webpack').Configuration } */ ({ + mode: 'production', + optimization: { + minimize: true, + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env.DEFAULT_APP_NAME': JSON.stringify('Insomnia'), + }), + ], + }), +);