diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 65415a36..70cdc1b1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x] + node-version: [12.x, 14.x] steps: - uses: actions/checkout@v2 diff --git a/.nvmrc b/.nvmrc index 03128968..e1fcd1ea 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -lts/dubnium +lts/erbium diff --git a/index.js b/index.js index bb0a047c..768706a7 100644 --- a/index.js +++ b/index.js @@ -1 +1 @@ -module.exports = require('./lib'); +module.exports = require('./src/lib'); diff --git a/lib/helpers/convertGlobPaths.js b/lib/helpers/convertGlobPaths.js deleted file mode 100644 index 02916d17..00000000 --- a/lib/helpers/convertGlobPaths.js +++ /dev/null @@ -1,14 +0,0 @@ -const glob = require('glob'); - -/** - * Converts an array of globs to full paths - * @param {array} globs - Array of globs and/or normal paths - * @return {array} Array of fully-qualified paths - */ -function convertGlobPaths(globs) { - return globs - .map((globString) => glob.sync(globString)) - .reduce((previous, current) => previous.concat(current), []); -} - -module.exports = convertGlobPaths; diff --git a/lib/helpers/createSpecification.js b/lib/helpers/createSpecification.js deleted file mode 100644 index 583020f2..00000000 --- a/lib/helpers/createSpecification.js +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint no-self-assign: 0 */ - -/** - * Adds necessary properties for a given specification. - * @see https://goo.gl/Eoagtl - * @param {object} definition - The `definition` or `swaggerDefinition` from options. - * @returns {object} Object containing required properties of a given specification version. - */ -function createSpecification(definition) { - const specification = JSON.parse(JSON.stringify(definition)); - - // Properties corresponding to their specifications. - const v2 = [ - 'paths', - 'definitions', - 'responses', - 'parameters', - 'securityDefinitions', - ]; - const v3 = [...v2, 'components']; - - if (specification.openapi) { - specification.openapi = specification.openapi; - v3.forEach((property) => { - specification[property] = specification[property] || {}; - }); - } else if (specification.swagger) { - specification.swagger = specification.swagger; - v2.forEach((property) => { - specification[property] = specification[property] || {}; - }); - } else { - specification.swagger = '2.0'; - v2.forEach((property) => { - specification[property] = specification[property] || {}; - }); - } - - specification.tags = specification.tags || []; - - return specification; -} - -module.exports = createSpecification; diff --git a/lib/helpers/filterJsDocComments.js b/lib/helpers/filterJsDocComments.js deleted file mode 100644 index 84f736aa..00000000 --- a/lib/helpers/filterJsDocComments.js +++ /dev/null @@ -1,24 +0,0 @@ -const jsYaml = require('js-yaml'); - -/** - * Filters JSDoc comments for those tagged with '@swagger' - * @param {array} jsDocComments - JSDoc comments - * @returns {array} JSDoc comments tagged with '@swagger' - */ -function filterJsDocComments(jsDocComments) { - const swaggerJsDocComments = []; - - for (let i = 0; i < jsDocComments.length; i += 1) { - const jsDocComment = jsDocComments[i]; - for (let j = 0; j < jsDocComment.tags.length; j += 1) { - const tag = jsDocComment.tags[j]; - if (tag.title === 'swagger' || tag.title === 'openapi') { - swaggerJsDocComments.push(jsYaml.safeLoad(tag.description)); - } - } - } - - return swaggerJsDocComments; -} - -module.exports = filterJsDocComments; diff --git a/lib/helpers/finalizeSpecificationObject.js b/lib/helpers/finalizeSpecificationObject.js deleted file mode 100644 index 75796ac0..00000000 --- a/lib/helpers/finalizeSpecificationObject.js +++ /dev/null @@ -1,50 +0,0 @@ -const parser = require('swagger-parser'); -const hasEmptyProperty = require('./hasEmptyProperty'); - -/** - * OpenAPI specification validator does not accept empty values for a few properties. - * Solves validator error: "Schema error should NOT have additional properties" - * @param {object} inputSpec - The swagger/openapi specification - * @param {object} improvedSpec - The cleaned version of the inputSpec - */ -function cleanUselessProperties(inputSpec) { - const improvedSpec = JSON.parse(JSON.stringify(inputSpec)); - const toClean = [ - 'definitions', - 'responses', - 'parameters', - 'securityDefinitions', - ]; - - toClean.forEach((unnecessaryProp) => { - if (hasEmptyProperty(improvedSpec[unnecessaryProp])) { - delete improvedSpec[unnecessaryProp]; - } - }); - - return improvedSpec; -} - -/** - * Parse the swagger object and remove useless properties if necessary. - * - * @param {object} swaggerObject - Swagger object from parsing the api files. - * @returns {object} The specification. - */ -function finalizeSpecificationObject(swaggerObject) { - let specification = swaggerObject; - - parser.parse(swaggerObject, (err, api) => { - if (!err) { - specification = api; - } - }); - - if (specification.openapi) { - specification = cleanUselessProperties(specification); - } - - return specification; -} - -module.exports = finalizeSpecificationObject; diff --git a/lib/helpers/getSpecificationObject.js b/lib/helpers/getSpecificationObject.js deleted file mode 100644 index a311a2c8..00000000 --- a/lib/helpers/getSpecificationObject.js +++ /dev/null @@ -1,23 +0,0 @@ -const createSpecification = require('./createSpecification'); -const parseApiFile = require('./parseApiFile'); -const convertGlobPaths = require('./convertGlobPaths'); -const finalizeSpecificationObject = require('./finalizeSpecificationObject'); -const updateSpecificationObject = require('./updateSpecificationObject'); - -function getSpecificationObject(options) { - // Get input definition and prepare the specification's skeleton - const definition = options.swaggerDefinition || options.definition; - const specification = createSpecification(definition); - - // Parse the documentation containing information about APIs. - const apiPaths = convertGlobPaths(options.apis); - - for (let i = 0; i < apiPaths.length; i += 1) { - const parsedFile = parseApiFile(apiPaths[i]); - updateSpecificationObject(parsedFile, specification); - } - - return finalizeSpecificationObject(specification); -} - -module.exports = getSpecificationObject; diff --git a/lib/helpers/hasEmptyProperty.js b/lib/helpers/hasEmptyProperty.js deleted file mode 100644 index b8988f3c..00000000 --- a/lib/helpers/hasEmptyProperty.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Checks if there is any properties of @obj that is a empty object - * @param {object} obj - the object to check - */ -function hasEmptyProperty(obj) { - return Object.keys(obj) - .map((key) => obj[key]) - .every( - (keyObject) => - typeof keyObject === 'object' && - Object.keys(keyObject).every((key) => !(key in keyObject)) - ); -} - -module.exports = hasEmptyProperty; diff --git a/lib/helpers/parseApiFile.js b/lib/helpers/parseApiFile.js deleted file mode 100644 index 17a0d7f4..00000000 --- a/lib/helpers/parseApiFile.js +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const parseApiFileContent = require('./parseApiFileContent'); - -/** - * Parses the provided API file for JSDoc comments. - * @param {string} file - File to be parsed - * @returns {{jsdoc: array, yaml: array}} JSDoc comments and Yaml files - */ -function parseApiFile(file) { - const fileContent = fs.readFileSync(file, { encoding: 'utf8' }); - const ext = path.extname(file); - - return parseApiFileContent(fileContent, ext); -} - -module.exports = parseApiFile; diff --git a/lib/helpers/parseApiFileContent.js b/lib/helpers/parseApiFileContent.js deleted file mode 100644 index b93e838f..00000000 --- a/lib/helpers/parseApiFileContent.js +++ /dev/null @@ -1,53 +0,0 @@ -const doctrine = require('doctrine'); -const jsYaml = require('js-yaml'); - -/** - * Parse the provided API file content. - * @param {string} fileContent - Content of the file - * @param {string} ext - File format ('.yaml', '.yml', '.js', etc.) - * @returns {{jsdoc: array, yaml: array}} JSDoc comments and Yaml files - */ -function parseApiFileContent(fileContent, ext) { - const jsDocRegex = /\/\*\*([\s\S]*?)\*\//gm; - const csDocRegex = /###([\s\S]*?)###/gm; - const yaml = []; - const jsdoc = []; - let regexResults = null; - - switch (ext) { - case '.yml': - case '.yaml': - yaml.push(jsYaml.safeLoad(fileContent)); - break; - - case '.coffee': - regexResults = fileContent.match(csDocRegex); - if (regexResults) { - for (let i = 0; i < regexResults.length; i += 1) { - // Prepare input for doctrine - let part = regexResults[i].split('###'); - part[0] = `/**`; - part[regexResults.length - 1] = '*/'; - part = part.join(''); - jsdoc.push(doctrine.parse(part, { unwrap: true })); - } - } - break; - - default: { - regexResults = fileContent.match(jsDocRegex); - if (regexResults) { - for (let i = 0; i < regexResults.length; i += 1) { - jsdoc.push(doctrine.parse(regexResults[i], { unwrap: true })); - } - } - } - } - - return { - yaml, - jsdoc, - }; -} - -module.exports = parseApiFileContent; diff --git a/lib/helpers/specification.js b/lib/helpers/specification.js deleted file mode 100644 index f64906b0..00000000 --- a/lib/helpers/specification.js +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint no-param-reassign: 0 */ - -/** - * Checks if tag is already contained withing target. - * The tag is an object of type http://swagger.io/specification/#tagObject - * The target, is the part of the swagger specification that holds all tags. - * @param {object} target - Swagger object place to include the tags data. - * @param {object} tag - Swagger tag object to be included. - * @returns {boolean} Does tag is already present in target - */ -function tagDuplicated(target, tag) { - // Check input is workable. - if (target && target.length && tag) { - for (let i = 0; i < target.length; i += 1) { - const targetTag = target[i]; - // The name of the tag to include already exists in the taget. - // Therefore, it's not necessary to be added again. - if (targetTag.name === tag.name) { - return true; - } - } - } - - // This will indicate that `tag` is not present in `target`. - return false; -} - -/** - * Adds the tags property to a swagger object. - * @param {object} conf - Flexible configuration. - */ -function attachTags(conf) { - const { tag, swaggerObject, propertyName } = conf; - - // Correct deprecated property. - if (propertyName === 'tag') { - conf.propertyName = 'tags'; - } - - if (Array.isArray(tag)) { - for (let i = 0; i < tag.length; i += 1) { - if (!tagDuplicated(swaggerObject[propertyName], tag[i])) { - swaggerObject[propertyName].push(tag[i]); - } - } - } else if (!tagDuplicated(swaggerObject[propertyName], tag)) { - swaggerObject[propertyName].push(tag); - } -} - -/** - * List of deprecated or wrong swagger schema properties in singular. - * @returns {array} The list of deprecated property names. - */ -function getSwaggerSchemaWrongProperties() { - return [ - 'consume', - 'produce', - 'path', - 'tag', - 'definition', - 'securityDefinition', - 'scheme', - 'response', - 'parameter', - ]; -} - -/** - * Makes a deprecated property plural if necessary. - * @param {string} propertyName - The swagger property name to check. - * @returns {string} The updated propertyName if neccessary. - */ -function correctSwaggerKey(propertyName) { - const wrong = getSwaggerSchemaWrongProperties(); - if (wrong.indexOf(propertyName) > 0) { - // Returns the corrected property name. - return `${propertyName}s`; - } - return propertyName; -} - -/** - * Handles swagger propertyName in pathObject context for swaggerObject. - * @param {object} swaggerObject - The swagger object to update. - * @param {object} pathObject - The input context of an item for swaggerObject. - * @param {string} propertyName - The property to handle. - */ -function organizeSwaggerProperties(swaggerObject, pathObject, propertyName) { - const simpleProperties = [ - 'component', - 'components', - 'consume', - 'consumes', - 'produce', - 'produces', - 'path', - 'paths', - 'schema', - 'schemas', - 'securityDefinition', - 'securityDefinitions', - 'response', - 'responses', - 'parameter', - 'parameters', - 'definition', - 'definitions', - ]; - - // Common properties. - if (simpleProperties.indexOf(propertyName) !== -1) { - const keyName = correctSwaggerKey(propertyName); - const definitionNames = Object.getOwnPropertyNames( - pathObject[propertyName] - ); - for (let k = 0; k < definitionNames.length; k += 1) { - const definitionName = definitionNames[k]; - swaggerObject[keyName][definitionName] = { - ...swaggerObject[keyName][definitionName], - ...pathObject[propertyName][definitionName], - }; - } - // Tags. - } else if (propertyName === 'tag' || propertyName === 'tags') { - const tag = pathObject[propertyName]; - attachTags({ - tag, - swaggerObject, - propertyName, - }); - // Paths. - } else { - swaggerObject.paths[propertyName] = { - ...swaggerObject.paths[propertyName], - ...pathObject[propertyName], - }; - } -} - -/** - * Adds the data in to the swagger object. - * @param {object} swaggerObject - Swagger object which will be written to - * @param {object[]} data - objects of parsed swagger data from yml or jsDoc - * comments - */ -function addDataToSwaggerObject(swaggerObject, data) { - if (!swaggerObject || !data) { - throw new Error('swaggerObject and data are required!'); - } - - for (let i = 0; i < data.length; i += 1) { - const pathObject = data[i]; - const propertyNames = Object.getOwnPropertyNames(pathObject); - // Iterating the properties of the a given pathObject. - for (let j = 0; j < propertyNames.length; j += 1) { - const propertyName = propertyNames[j]; - // Do what's necessary to organize the end specification. - organizeSwaggerProperties(swaggerObject, pathObject, propertyName); - } - } -} - -module.exports = { - addDataToSwaggerObject, -}; diff --git a/lib/helpers/updateSpecificationObject.js b/lib/helpers/updateSpecificationObject.js deleted file mode 100644 index 65dd4f83..00000000 --- a/lib/helpers/updateSpecificationObject.js +++ /dev/null @@ -1,20 +0,0 @@ -const specHelper = require('./specification'); -const filterJsDocComments = require('./filterJsDocComments'); - -/** - * Given an api file parsed for its jsdoc comments and yaml files, update the - * specification. - * - * @param {object} parsedFile - Parsed API file. - * @param {object} specification - Specification accumulator. - */ -function updateSpecificationObject(parsedFile, specification) { - specHelper.addDataToSwaggerObject(specification, parsedFile.yaml); - - specHelper.addDataToSwaggerObject( - specification, - filterJsDocComments(parsedFile.jsdoc) - ); -} - -module.exports = updateSpecificationObject; diff --git a/package.json b/package.json index cf24f377..e7127bab 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "swagger-jsdoc", "description": "Generates swagger doc based on JSDoc", - "version": "4.3.1", + "version": "5.0.0", "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" }, "scripts": { "test:lint": "eslint .", @@ -16,7 +16,7 @@ "swagger-jsdoc": "./bin/swagger-jsdoc.js" }, "dependencies": { - "commander": "6.1.0", + "commander": "6.2.0", "doctrine": "3.0.0", "glob": "7.1.6", "js-yaml": "3.14.0", @@ -24,20 +24,20 @@ }, "devDependencies": { "body-parser": "1.19.0", - "eslint": "7.9.0", + "eslint": "7.12.1", "eslint-config-airbnb-base": "14.2.0", - "eslint-config-prettier": "6.11.0", + "eslint-config-prettier": "6.15.0", "eslint-loader": "4.0.2", - "eslint-plugin-import": "2.22.0", - "eslint-plugin-jest": "^24.0.2", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-jest": "^24.1.0", "eslint-plugin-prettier": "3.1.4", "express": "4.17.1", "husky": "4.3.0", - "jest": "^26.4.2", - "lint-staged": "10.4.0", + "jest": "^26.6.1", + "lint-staged": "10.5.0", "npm-run-all": "4.1.5", "prettier": "2.1.2", - "supertest": "4.0.2" + "supertest": "5.0.0" }, "license": "MIT", "homepage": "https://github.com/Surnet/swagger-jsdoc", @@ -46,18 +46,15 @@ "url": "https://github.com/Surnet/swagger-jsdoc.git" }, "keywords": [ - "jsdoc", - "restful", - "api", - "express", - "swagger" + "swagger", + "openapi", + "jsdoc" ], "author": "https://github.com/Surnet/swagger-jsdoc/graphs/contributors", "bugs": { "url": "https://github.com/Surnet/swagger-jsdoc/issues" }, "resolutions": { - "lodash": "^4.17.19", "minimist": "^1.2.3" }, "husky": { diff --git a/lib/index.js b/src/lib.js similarity index 66% rename from lib/index.js rename to src/lib.js index eb2e3d22..b9adaf49 100644 --- a/lib/index.js +++ b/src/lib.js @@ -1,5 +1,13 @@ const { YAMLException } = require('js-yaml'); -const getSpecificationObject = require('./helpers/getSpecificationObject'); + +const { + getSpecificationObject, + createSpecification, + updateSpecificationObject, + finalizeSpecificationObject, +} = require('./specification'); + +const { parseApiFileContent } = require('./utils'); /** * Generates the specification. @@ -35,7 +43,7 @@ module.exports = (options) => { } }; -module.exports.createSpecification = require('./helpers/createSpecification'); -module.exports.parseApiFileContent = require('./helpers/parseApiFileContent'); -module.exports.updateSpecificationObject = require('./helpers/updateSpecificationObject'); -module.exports.finalizeSpecificationObject = require('./helpers/finalizeSpecificationObject'); +module.exports.createSpecification = createSpecification; +module.exports.parseApiFileContent = parseApiFileContent; +module.exports.updateSpecificationObject = updateSpecificationObject; +module.exports.finalizeSpecificationObject = finalizeSpecificationObject; diff --git a/src/specification.js b/src/specification.js new file mode 100644 index 00000000..f66ba051 --- /dev/null +++ b/src/specification.js @@ -0,0 +1,245 @@ +/* eslint no-param-reassign: 0 */ +/* eslint no-self-assign: 0 */ +const parser = require('swagger-parser'); + +const { + hasEmptyProperty, + convertGlobPaths, + parseApiFile, + getAnnotations, +} = require('./utils'); + +/** + * Adds necessary properties for a given specification. + * @see https://github.com/OAI/OpenAPI-Specification/tree/master/versions + * @param {object} definition - The `definition` or `swaggerDefinition` from options. + * @returns {object} Object containing required properties of a given specification version. + */ +function createSpecification(definition) { + const specification = JSON.parse(JSON.stringify(definition)); + + // Properties corresponding to their specifications. + const v2 = [ + 'paths', + 'definitions', + 'responses', + 'parameters', + 'securityDefinitions', + ]; + const v3 = [...v2, 'components']; + + if (specification.openapi) { + specification.openapi = specification.openapi; + v3.forEach((property) => { + specification[property] = specification[property] || {}; + }); + } else if (specification.swagger) { + specification.swagger = specification.swagger; + v2.forEach((property) => { + specification[property] = specification[property] || {}; + }); + } else { + specification.swagger = '2.0'; + v2.forEach((property) => { + specification[property] = specification[property] || {}; + }); + } + + specification.tags = specification.tags || []; + + return specification; +} + +/** + * OpenAPI specification validator does not accept empty values for a few properties. + * Solves validator error: "Schema error should NOT have additional properties" + * @param {object} inputSpec - The swagger/openapi specification + * @param {object} improvedSpec - The cleaned version of the inputSpec + */ +function cleanUselessProperties(inputSpec) { + const improvedSpec = JSON.parse(JSON.stringify(inputSpec)); + const toClean = [ + 'definitions', + 'responses', + 'parameters', + 'securityDefinitions', + ]; + + toClean.forEach((unnecessaryProp) => { + if (hasEmptyProperty(improvedSpec[unnecessaryProp])) { + delete improvedSpec[unnecessaryProp]; + } + }); + + return improvedSpec; +} + +/** + * Parse the swagger object and remove useless properties if necessary. + * + * @param {object} swaggerObject - Swagger object from parsing the api files. + * @returns {object} The specification. + */ +function finalizeSpecificationObject(swaggerObject) { + let specification = swaggerObject; + + parser.parse(swaggerObject, (err, api) => { + if (!err) { + specification = api; + } + }); + + if (specification.openapi) { + specification = cleanUselessProperties(specification); + } + + return specification; +} + +/** + * Checks if tag is already contained withing target. + * The tag is an object of type http://swagger.io/specification/#tagObject + * The target, is the part of the swagger specification that holds all tags. + * @param {object} target - Swagger object place to include the tags data. + * @param {object} tag - Swagger tag object to be included. + * @returns {boolean} Does tag is already present in target + */ +function tagDuplicated(target, tag) { + // Check input is workable. + if (target && target.length && tag) { + for (let i = 0; i < target.length; i += 1) { + const targetTag = target[i]; + // The name of the tag to include already exists in the taget. + // Therefore, it's not necessary to be added again. + if (targetTag.name === tag.name) { + return true; + } + } + } + + // This will indicate that `tag` is not present in `target`. + return false; +} + +/** + * Adds the tags property to a swagger object. + * @param {object} conf - Flexible configuration. + */ +function attachTags(conf) { + const { tag, swaggerObject, propertyName } = conf; + + if (Array.isArray(tag)) { + for (let i = 0; i < tag.length; i += 1) { + if (!tagDuplicated(swaggerObject[propertyName], tag[i])) { + swaggerObject[propertyName].push(tag[i]); + } + } + } else if (!tagDuplicated(swaggerObject[propertyName], tag)) { + swaggerObject[propertyName].push(tag); + } +} + +/** + * Handles swagger propertyName in pathObject context for swaggerObject. + * @param {object} swaggerObject - The swagger object to update. + * @param {object} pathObject - The input context of an item for swaggerObject. + * @param {string} propertyName - The property to handle. + */ +function organizeSwaggerProperties(swaggerObject, pathObject, propertyName) { + const simpleProperties = [ + 'components', + 'consumes', + 'produces', + 'paths', + 'schemas', + 'securityDefinitions', + 'responses', + 'parameters', + 'definitions', + ]; + + // Common properties. + if (simpleProperties.indexOf(propertyName) !== -1) { + const definitionNames = Object.getOwnPropertyNames( + pathObject[propertyName] + ); + for (let k = 0; k < definitionNames.length; k += 1) { + const definitionName = definitionNames[k]; + swaggerObject[propertyName][definitionName] = { + ...swaggerObject[propertyName][definitionName], + ...pathObject[propertyName][definitionName], + }; + } + // Tags. + } else if (propertyName === 'tags') { + const tag = pathObject[propertyName]; + attachTags({ + tag, + swaggerObject, + propertyName, + }); + // Paths. + } else { + swaggerObject.paths[propertyName] = { + ...swaggerObject.paths[propertyName], + ...pathObject[propertyName], + }; + } +} + +/** + * Adds the data in to the swagger object. + * @param {object} swaggerObject - Swagger object which will be written to + * @param {object[]} data - objects of parsed swagger data from yml or jsDoc + * comments + */ +function addDataToSwaggerObject(swaggerObject, data) { + if (!swaggerObject || !data) { + throw new Error('swaggerObject and data are required!'); + } + + for (let i = 0; i < data.length; i += 1) { + const pathObject = data[i]; + const propertyNames = Object.getOwnPropertyNames(pathObject); + // Iterating the properties of the a given pathObject. + for (let j = 0; j < propertyNames.length; j += 1) { + const propertyName = propertyNames[j]; + // Do what's necessary to organize the end specification. + organizeSwaggerProperties(swaggerObject, pathObject, propertyName); + } + } +} + +/** + * Given an api file parsed for its jsdoc comments and yaml files, update the + * specification. + * + * @param {object} parsedFile - Parsed API file. + * @param {object} specification - Specification accumulator. + */ +function updateSpecificationObject(parsedFile, specification) { + addDataToSwaggerObject(specification, parsedFile.yaml); + addDataToSwaggerObject(specification, getAnnotations(parsedFile.jsdoc)); +} + +function getSpecificationObject(options) { + // Get input definition and prepare the specification's skeleton + const definition = options.swaggerDefinition || options.definition; + const specification = createSpecification(definition); + + // Parse the documentation containing information about APIs. + const apiPaths = convertGlobPaths(options.apis); + + for (let i = 0; i < apiPaths.length; i += 1) { + const parsedFile = parseApiFile(apiPaths[i]); + updateSpecificationObject(parsedFile, specification); + } + + return finalizeSpecificationObject(specification); +} + +module.exports.createSpecification = createSpecification; +module.exports.finalizeSpecificationObject = finalizeSpecificationObject; +module.exports.getSpecificationObject = getSpecificationObject; +module.exports.addDataToSwaggerObject = addDataToSwaggerObject; +module.exports.updateSpecificationObject = updateSpecificationObject; diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 00000000..2cf67ec8 --- /dev/null +++ b/src/utils.js @@ -0,0 +1,119 @@ +const fs = require('fs'); +const path = require('path'); +const glob = require('glob'); +const jsYaml = require('js-yaml'); +const doctrine = require('doctrine'); + +/** + * Converts an array of globs to full paths + * @param {array} globs - Array of globs and/or normal paths + * @return {array} Array of fully-qualified paths + */ +function convertGlobPaths(globs) { + return globs + .map((globString) => glob.sync(globString)) + .reduce((previous, current) => previous.concat(current), []); +} + +/** + * Checks if there is any properties of the input object which are an empty object + * @param {object} obj - the object to check + * @returns {boolean} + */ +function hasEmptyProperty(obj) { + return Object.keys(obj) + .map((key) => obj[key]) + .every( + (keyObject) => + typeof keyObject === 'object' && + Object.keys(keyObject).every((key) => !(key in keyObject)) + ); +} + +/** + * Filters JSDoc comments with `@swagger`/`@openapi` annotation. + * @param {array} jsDocComments - JSDoc comments + * @returns {array} JSDoc comments tagged with '@swagger' + */ +function getAnnotations(jsDocComments) { + const annotations = []; + + for (let i = 0; i < jsDocComments.length; i += 1) { + const jsDocComment = jsDocComments[i]; + for (let j = 0; j < jsDocComment.tags.length; j += 1) { + const tag = jsDocComment.tags[j]; + if (tag.title === 'swagger' || tag.title === 'openapi') { + annotations.push(jsYaml.safeLoad(tag.description)); + } + } + } + + return annotations; +} + +/** + * Parse the provided API file content. + * @param {string} fileContent - Content of the file + * @param {string} ext - File format ('.yaml', '.yml', '.js', etc.) + * @returns {{jsdoc: array, yaml: array}} JSDoc comments and Yaml files + */ +function parseApiFileContent(fileContent, ext) { + const jsDocRegex = /\/\*\*([\s\S]*?)\*\//gm; + const csDocRegex = /###([\s\S]*?)###/gm; + const yaml = []; + const jsdoc = []; + let regexResults = null; + + switch (ext) { + case '.yml': + case '.yaml': + yaml.push(jsYaml.safeLoad(fileContent)); + break; + + case '.coffee': + regexResults = fileContent.match(csDocRegex); + if (regexResults) { + for (let i = 0; i < regexResults.length; i += 1) { + // Prepare input for doctrine + let part = regexResults[i].split('###'); + part[0] = `/**`; + part[regexResults.length - 1] = '*/'; + part = part.join(''); + jsdoc.push(doctrine.parse(part, { unwrap: true })); + } + } + break; + + default: { + regexResults = fileContent.match(jsDocRegex); + if (regexResults) { + for (let i = 0; i < regexResults.length; i += 1) { + jsdoc.push(doctrine.parse(regexResults[i], { unwrap: true })); + } + } + } + } + + return { + yaml, + jsdoc, + }; +} + +/** + * Parses the provided API file for JSDoc comments. + * @param {string} file - File to be parsed + * @returns {{jsdoc: array, yaml: array}} JSDoc comments and Yaml files + */ +function parseApiFile(file) { + const fileContent = fs.readFileSync(file, { encoding: 'utf8' }); + const ext = path.extname(file); + + return parseApiFileContent(fileContent, ext); +} + +module.exports.convertGlobPaths = convertGlobPaths; +module.exports.hasEmptyProperty = hasEmptyProperty; +module.exports.getAnnotations = getAnnotations; +module.exports.parseApiFileContent = parseApiFileContent; +module.exports.parseApiFile = parseApiFile; diff --git a/test/__snapshots__/cli.spec.js.snap b/test/__snapshots__/cli.spec.js.snap index 2d22fdd3..bee6b70f 100644 --- a/test/__snapshots__/cli.spec.js.snap +++ b/test/__snapshots__/cli.spec.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`command line interface help menu is default fallback when no arguments 1`] = ` +exports[`CLI module help menu is default fallback when no arguments 1`] = ` "Usage: swagger-jsdoc [options] Options: @@ -11,7 +11,7 @@ Options: " `; -exports[`command line interface help menu works 1`] = ` +exports[`CLI module help menu works 1`] = ` "Usage: swagger-jsdoc [options] Options: @@ -22,13 +22,13 @@ Options: " `; -exports[`command line interface should reject definition file with invalid JSON syntax 1`] = ` +exports[`CLI module should reject definition file with invalid JSON syntax 1`] = ` "Error while loading definition file 'test/files/v2/wrong_syntax.json': Unexpected token t in JSON at position 18 " `; -exports[`command line interface should reject definition file with invalid YAML syntax 1`] = ` +exports[`CLI module should reject definition file with invalid YAML syntax 1`] = ` "Error while loading definition file 'test/files/v2/wrong_syntax.yaml': tag suffix cannot contain exclamation marks at line 2, column 5: !!!title: Hello World @@ -36,7 +36,7 @@ tag suffix cannot contain exclamation marks at line 2, column 5: " `; -exports[`command line interface should reject definition file with non-JSON compatible YAML syntax 1`] = ` +exports[`CLI module should reject definition file with non-JSON compatible YAML syntax 1`] = ` "Error while loading definition file 'test/files/v2/non_json_compatible.yaml': unknown tag ! at line 3, column 3: version: 1.0.0 @@ -44,7 +44,7 @@ unknown tag ! at line 3, column 3: " `; -exports[`command line interface should require a definition file 1`] = ` +exports[`CLI module should require a definition file 1`] = ` "Definition file is required. You can do that, for example: $ swag-jsdoc -d swaggerDef.js wrongDefinition @@ -58,19 +58,19 @@ Options: " `; -exports[`command line interface should require an info object in the definition 1`] = ` +exports[`CLI module should require an info object in the definition 1`] = ` "Definition file should contain an info object! More at http://swagger.io/specification/#infoObject " `; -exports[`command line interface should require arguments with jsDoc data about an API 1`] = ` +exports[`CLI module should require arguments with jsDoc data about an API 1`] = ` "You must provide sources for reading API files. Either add filenames as arguments, or add an \\"apis\\" key in your definitions file. " `; -exports[`command line interface should require title and version in the info object 1`] = ` +exports[`CLI module should require title and version in the info object 1`] = ` "The title and version properties are required! More at http://swagger.io/specification/#infoObject " diff --git a/test/cli.spec.js b/test/cli.spec.js index 6354c193..e31fdbd8 100644 --- a/test/cli.spec.js +++ b/test/cli.spec.js @@ -6,7 +6,7 @@ const sh = promisify(exec); const dir = process.env.PWD; const bin = `${dir}/bin/swagger-jsdoc.js`; -describe('command line interface', () => { +describe('CLI module', () => { it('help menu is default fallback when no arguments', async () => { const result = await sh(`${bin}`); expect(result.stdout).toMatchSnapshot(); diff --git a/test/lib.spec.js b/test/lib.spec.js index 9fa07244..b8c7d396 100644 --- a/test/lib.spec.js +++ b/test/lib.spec.js @@ -1,8 +1,10 @@ const path = require('path'); const { YAMLException } = require('js-yaml'); -const swaggerJsdoc = require('../lib'); -describe('swagger-jsdoc library', () => { +const swaggerJsdoc = require('../src/lib'); +const specHelper = require('../src/specification'); + +describe('Main lib module', () => { describe('Public APIs', () => { it('main module is a function', () => { expect(typeof swaggerJsdoc).toBe('function'); @@ -19,7 +21,6 @@ describe('swagger-jsdoc library', () => { describe('Error handling', () => { beforeEach(() => { jest.clearAllMocks(); - jest.resetModules(); }); it('should require options input', () => { @@ -51,7 +52,7 @@ describe('swagger-jsdoc library', () => { }); it('should provide verbose information for wrongly formatted yaml inputs', () => { - jest.doMock('../lib/helpers/getSpecificationObject', () => { + specHelper.getSpecificationObject = jest.fn().mockImplementation(() => { throw new YAMLException('bad indentation of a mapping entry', { name: null, buffer: '/invalid_yaml:\n - foo\n bar\n\u0000', diff --git a/test/specification.spec.js b/test/specification.spec.js new file mode 100644 index 00000000..f95c8bff --- /dev/null +++ b/test/specification.spec.js @@ -0,0 +1,73 @@ +/* eslint no-unused-expressions: 0 */ + +const specHelper = require('../src/specification'); + +const swaggerObject = require('./files/v2/swaggerObject.json'); +const testData = require('./files/v2/testData'); + +describe('Specification module', () => { + describe('addDataToSwaggerObject', () => { + it('should be a function', () => { + expect(typeof specHelper.addDataToSwaggerObject).toBe('function'); + }); + + it('should validate input', () => { + expect(() => { + specHelper.addDataToSwaggerObject(); + }).toThrow('swaggerObject and data are required!'); + }); + + it('should handle "definitions"', () => { + specHelper.addDataToSwaggerObject(swaggerObject, testData.definitions); + expect(swaggerObject.definitions).toEqual({ + DefinitionPlural: { + required: ['username', 'password'], + properties: { + username: { type: 'string' }, + password: { type: 'string' }, + }, + }, + }); + }); + + it('should handle "parameters"', () => { + specHelper.addDataToSwaggerObject(swaggerObject, testData.parameters); + expect(swaggerObject.parameters).toEqual({ + ParameterPlural: { + name: 'limit', + in: 'query', + description: 'max records to return', + required: true, + type: 'integer', + format: 'int32', + }, + }); + }); + + it('should handle "securityDefinitions"', () => { + specHelper.addDataToSwaggerObject( + swaggerObject, + testData.securityDefinitions + ); + expect(swaggerObject.securityDefinitions).toEqual({ + api_key: { type: 'apiKey', name: 'api_key', in: 'header' }, + petstore_auth: { + type: 'oauth2', + authorizationUrl: 'http://swagger.io/api/oauth/dialog', + flow: 'implicit', + scopes: { + 'write:pets': 'modify pets in your account', + 'read:pets': 'read your pets', + }, + }, + }); + }); + + it('should handle "responses"', () => { + specHelper.addDataToSwaggerObject(swaggerObject, testData.responses); + expect(swaggerObject.responses).toEqual({ + IllegalInput: { description: 'Illegal input for operation.' }, + }); + }); + }); +}); diff --git a/test/helpers.spec.js b/test/utils.spec.js similarity index 51% rename from test/helpers.spec.js rename to test/utils.spec.js index eaf7f145..0b73c971 100644 --- a/test/helpers.spec.js +++ b/test/utils.spec.js @@ -1,97 +1,8 @@ /* eslint no-unused-expressions: 0 */ -const specHelper = require('../lib/helpers/specification'); -const hasEmptyProperty = require('../lib/helpers/hasEmptyProperty'); -const parseApiFileContent = require('../lib/helpers/parseApiFileContent'); -const swaggerObject = require('./files/v2/swaggerObject.json'); -const testData = require('./files/v2/testData'); - -describe('Helpers', () => { - describe('addDataToSwaggerObject', () => { - it('should be a function', () => { - expect(typeof specHelper.addDataToSwaggerObject).toBe('function'); - }); - - it('should validate input', () => { - expect(() => { - specHelper.addDataToSwaggerObject(); - }).toThrow('swaggerObject and data are required!'); - }); - - it('should handle "definition" and "definitions"', () => { - specHelper.addDataToSwaggerObject(swaggerObject, testData.definitions); - expect(swaggerObject.definitions).toEqual({ - DefinitionSingular: { - required: ['username', 'password'], - properties: { - username: { type: 'string' }, - password: { type: 'string' }, - }, - }, - DefinitionPlural: { - required: ['username', 'password'], - properties: { - username: { type: 'string' }, - password: { type: 'string' }, - }, - }, - }); - }); - - it('should handle "parameter" and "parameters"', () => { - specHelper.addDataToSwaggerObject(swaggerObject, testData.parameters); - expect(swaggerObject.parameters).toEqual({ - ParameterSingular: { - name: 'username', - description: 'Username to use for login.', - in: 'formData', - required: true, - type: 'string', - }, - ParameterPlural: { - name: 'limit', - in: 'query', - description: 'max records to return', - required: true, - type: 'integer', - format: 'int32', - }, - }); - }); - - it('should handle "securityDefinition" and "securityDefinitions"', () => { - specHelper.addDataToSwaggerObject( - swaggerObject, - testData.securityDefinitions - ); - expect(swaggerObject.securityDefinitions).toEqual({ - basicAuth: { - type: 'basic', - description: - 'HTTP Basic Authentication. Works over `HTTP` and `HTTPS`', - }, - api_key: { type: 'apiKey', name: 'api_key', in: 'header' }, - petstore_auth: { - type: 'oauth2', - authorizationUrl: 'http://swagger.io/api/oauth/dialog', - flow: 'implicit', - scopes: { - 'write:pets': 'modify pets in your account', - 'read:pets': 'read your pets', - }, - }, - }); - }); - - it('should handle "response" and "responses"', () => { - specHelper.addDataToSwaggerObject(swaggerObject, testData.responses); - expect(swaggerObject.responses).toEqual({ - NotFound: { description: 'Entity not found.' }, - IllegalInput: { description: 'Illegal input for operation.' }, - }); - }); - }); +const utils = require('../src/utils'); +describe('Utilities module', () => { describe('hasEmptyProperty', () => { it('identifies object with an empty object or array as property', () => { const invalidA = { foo: {} }; @@ -100,11 +11,11 @@ describe('Helpers', () => { const validB = { foo: ['¯_(ツ)_/¯'] }; const validC = { foo: '¯_(ツ)_/¯' }; - expect(hasEmptyProperty(invalidA)).toBe(true); - expect(hasEmptyProperty(invalidB)).toBe(true); - expect(hasEmptyProperty(validA)).toBe(false); - expect(hasEmptyProperty(validB)).toBe(false); - expect(hasEmptyProperty(validC)).toBe(false); + expect(utils.hasEmptyProperty(invalidA)).toBe(true); + expect(utils.hasEmptyProperty(invalidB)).toBe(true); + expect(utils.hasEmptyProperty(validA)).toBe(false); + expect(utils.hasEmptyProperty(validB)).toBe(false); + expect(utils.hasEmptyProperty(validC)).toBe(false); }); }); @@ -140,7 +51,7 @@ describe('Helpers', () => { }; `; - expect(parseApiFileContent(fileContent, '.js')).toEqual({ + expect(utils.parseApiFileContent(fileContent, '.js')).toEqual({ yaml: [], jsdoc: [ { @@ -197,7 +108,7 @@ describe('Helpers', () => { res.json req.body `; - expect(parseApiFileContent(fileContent, '.coffee')).toEqual({ + expect(utils.parseApiFileContent(fileContent, '.coffee')).toEqual({ yaml: [], jsdoc: [ { diff --git a/yarn.lock b/yarn.lock index 6eba0dac..7db39283 100644 --- a/yarn.lock +++ b/yarn.lock @@ -316,10 +316,10 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@eslint/eslintrc@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" - integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== +"@eslint/eslintrc@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" + integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -348,93 +348,93 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@jest/console@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.3.0.tgz#ed04063efb280c88ba87388b6f16427c0a85c856" - integrity sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w== +"@jest/console@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.1.tgz#6a19eaac4aa8687b4db9130495817c65aec3d34e" + integrity sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.3.0" - jest-util "^26.3.0" + jest-message-util "^26.6.1" + jest-util "^26.6.1" slash "^3.0.0" -"@jest/core@^26.4.2": - version "26.4.2" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.4.2.tgz#85d0894f31ac29b5bab07aa86806d03dd3d33edc" - integrity sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg== +"@jest/core@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.1.tgz#77426822f667a2cda82bf917cee11cc8ba71f9ac" + integrity sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw== dependencies: - "@jest/console" "^26.3.0" - "@jest/reporters" "^26.4.1" - "@jest/test-result" "^26.3.0" - "@jest/transform" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/console" "^26.6.1" + "@jest/reporters" "^26.6.1" + "@jest/test-result" "^26.6.1" + "@jest/transform" "^26.6.1" + "@jest/types" "^26.6.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" - jest-changed-files "^26.3.0" - jest-config "^26.4.2" - jest-haste-map "^26.3.0" - jest-message-util "^26.3.0" + jest-changed-files "^26.6.1" + jest-config "^26.6.1" + jest-haste-map "^26.6.1" + jest-message-util "^26.6.1" jest-regex-util "^26.0.0" - jest-resolve "^26.4.0" - jest-resolve-dependencies "^26.4.2" - jest-runner "^26.4.2" - jest-runtime "^26.4.2" - jest-snapshot "^26.4.2" - jest-util "^26.3.0" - jest-validate "^26.4.2" - jest-watcher "^26.3.0" + jest-resolve "^26.6.1" + jest-resolve-dependencies "^26.6.1" + jest-runner "^26.6.1" + jest-runtime "^26.6.1" + jest-snapshot "^26.6.1" + jest-util "^26.6.1" + jest-validate "^26.6.1" + jest-watcher "^26.6.1" micromatch "^4.0.2" p-each-series "^2.1.0" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.3.0.tgz#e6953ab711ae3e44754a025f838bde1a7fd236a0" - integrity sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA== +"@jest/environment@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.1.tgz#38a56f1cc66f96bf53befcc5ebeaf1c2dce90e9a" + integrity sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw== dependencies: - "@jest/fake-timers" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/fake-timers" "^26.6.1" + "@jest/types" "^26.6.1" "@types/node" "*" - jest-mock "^26.3.0" + jest-mock "^26.6.1" -"@jest/fake-timers@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.3.0.tgz#f515d4667a6770f60ae06ae050f4e001126c666a" - integrity sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A== +"@jest/fake-timers@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.1.tgz#5aafba1822075b7142e702b906094bea15f51acf" + integrity sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" "@sinonjs/fake-timers" "^6.0.1" "@types/node" "*" - jest-message-util "^26.3.0" - jest-mock "^26.3.0" - jest-util "^26.3.0" + jest-message-util "^26.6.1" + jest-mock "^26.6.1" + jest-util "^26.6.1" -"@jest/globals@^26.4.2": - version "26.4.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.4.2.tgz#73c2a862ac691d998889a241beb3dc9cada40d4a" - integrity sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow== +"@jest/globals@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.1.tgz#b232c7611d8a2de62b4bf9eb9a007138322916f4" + integrity sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ== dependencies: - "@jest/environment" "^26.3.0" - "@jest/types" "^26.3.0" - expect "^26.4.2" + "@jest/environment" "^26.6.1" + "@jest/types" "^26.6.1" + expect "^26.6.1" -"@jest/reporters@^26.4.1": - version "26.4.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.4.1.tgz#3b4d6faf28650f3965f8b97bc3d114077fb71795" - integrity sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ== +"@jest/reporters@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.1.tgz#582ede05278cf5eeffe58bc519f4a35f54fbcb0d" + integrity sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.3.0" - "@jest/test-result" "^26.3.0" - "@jest/transform" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/console" "^26.6.1" + "@jest/test-result" "^26.6.1" + "@jest/transform" "^26.6.1" + "@jest/types" "^26.6.1" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" @@ -445,73 +445,73 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.0.2" - jest-haste-map "^26.3.0" - jest-resolve "^26.4.0" - jest-util "^26.3.0" - jest-worker "^26.3.0" + jest-haste-map "^26.6.1" + jest-resolve "^26.6.1" + jest-util "^26.6.1" + jest-worker "^26.6.1" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^5.0.1" + v8-to-istanbul "^6.0.1" optionalDependencies: node-notifier "^8.0.0" -"@jest/source-map@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.3.0.tgz#0e646e519883c14c551f7b5ae4ff5f1bfe4fc3d9" - integrity sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ== +"@jest/source-map@^26.5.0": + version "26.5.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.5.0.tgz#98792457c85bdd902365cd2847b58fff05d96367" + integrity sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g== dependencies: callsites "^3.0.0" graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.3.0.tgz#46cde01fa10c0aaeb7431bf71e4a20d885bc7fdb" - integrity sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg== +"@jest/test-result@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.1.tgz#d75698d8a06aa663e8936663778c831512330cc1" + integrity sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg== dependencies: - "@jest/console" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/console" "^26.6.1" + "@jest/types" "^26.6.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.4.2": - version "26.4.2" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz#58a3760a61eec758a2ce6080201424580d97cbba" - integrity sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog== +"@jest/test-sequencer@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz#34216ac2c194b0eeebde30d25424d1134703fd2e" + integrity sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ== dependencies: - "@jest/test-result" "^26.3.0" + "@jest/test-result" "^26.6.1" graceful-fs "^4.2.4" - jest-haste-map "^26.3.0" - jest-runner "^26.4.2" - jest-runtime "^26.4.2" + jest-haste-map "^26.6.1" + jest-runner "^26.6.1" + jest-runtime "^26.6.1" -"@jest/transform@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.3.0.tgz#c393e0e01459da8a8bfc6d2a7c2ece1a13e8ba55" - integrity sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A== +"@jest/transform@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.1.tgz#f70786f96e0f765947b4fb4f54ffcfb7bd783711" + integrity sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" 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.3.0" + jest-haste-map "^26.6.1" jest-regex-util "^26.0.0" - jest-util "^26.3.0" + jest-util "^26.6.1" micromatch "^4.0.2" pirates "^4.0.1" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^26.3.0": - version "26.3.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.3.0.tgz#97627bf4bdb72c55346eef98e3b3f7ddc4941f71" - integrity sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ== +"@jest/types@^26.6.1": + version "26.6.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.1.tgz#2638890e8031c0bc8b4681e0357ed986e2f866c5" + integrity sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" @@ -585,7 +585,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== @@ -653,10 +653,10 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.1.tgz#be148756d5480a84cde100324c03a86ae5739fb5" integrity sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ== -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== +"@types/stack-utils@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" + integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== "@types/yargs-parser@*": version "15.0.0" @@ -948,16 +948,16 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== -babel-jest@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.3.0.tgz#10d0ca4b529ca3e7d1417855ef7d7bd6fc0c3463" - integrity sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g== +babel-jest@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.1.tgz#07bd7bec14de47fe0f2c9a139741329f1f41788b" + integrity sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA== dependencies: - "@jest/transform" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/transform" "^26.6.1" + "@jest/types" "^26.6.1" "@types/babel__core" "^7.1.7" babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.3.0" + babel-preset-jest "^26.5.0" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" @@ -973,10 +973,10 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.2.0: - version "26.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz#bdd0011df0d3d513e5e95f76bd53b51147aca2dd" - integrity sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA== +babel-plugin-jest-hoist@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz#3916b3a28129c29528de91e5784a44680db46385" + integrity sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1000,12 +1000,12 @@ babel-preset-current-node-syntax@^0.1.3: "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -babel-preset-jest@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz#ed6344506225c065fd8a0b53e191986f74890776" - integrity sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw== +babel-preset-jest@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz#f1b166045cd21437d1188d29f7fba470d5bdb0e7" + integrity sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA== dependencies: - babel-plugin-jest-hoist "^26.2.0" + babel-plugin-jest-hoist "^26.5.0" babel-preset-current-node-syntax "^0.1.3" balanced-match@^1.0.0: @@ -1190,6 +1190,11 @@ ci-info@^2.0.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cjs-module-lexer@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz#9e31f7fe701f5fcee5793f77ab4e58fa8dcde8bc" + integrity sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ== + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1269,28 +1274,27 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -combined-stream@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" -commander@6.1.0, commander@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" - integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== +commander@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" + integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== commander@^2.7.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" +commander@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.1.0.tgz#f8d722b78103141006b66f4c7ba1e97315ba75bc" + integrity sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1300,11 +1304,7 @@ compare-versions@^3.6.0: resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== -component-emitter@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -component-emitter@^1.2.1: +component-emitter@^1.2.1, component-emitter@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -1349,16 +1349,17 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookiejar@^2.1.0: +cookiejar@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1440,12 +1441,6 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - debug@^4.0.1, debug@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -1534,10 +1529,10 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.3.0.tgz#62a59b1b29ab7fd27cef2a33ae52abe73042d0a2" - integrity sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig== +diff-sequences@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd" + integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q== dir-glob@^3.0.1: version "3.0.1" @@ -1718,14 +1713,14 @@ eslint-config-airbnb-base@14.2.0: object.assign "^4.1.0" object.entries "^1.1.2" -eslint-config-prettier@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" - integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== +eslint-config-prettier@6.15.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== dependencies: get-stdin "^6.0.0" -eslint-import-resolver-node@^0.3.3: +eslint-import-resolver-node@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== @@ -1752,17 +1747,17 @@ eslint-module-utils@^2.6.0: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-import@2.22.0: - version "2.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" - integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== +eslint-plugin-import@2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" + eslint-import-resolver-node "^0.3.4" eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" @@ -1771,10 +1766,10 @@ eslint-plugin-import@2.22.0: resolve "^1.17.0" tsconfig-paths "^3.9.0" -eslint-plugin-jest@^24.0.2: - version "24.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.0.2.tgz#4bf0fcdc86289d702a7dacb430b4363482af773b" - integrity sha512-DSBLNpkKDOpUJQkTGSs5sVJWsu0nDyQ2rYxkr0Eh7nrkc5bMUr/dlDbtTj3l8y6UaCVsem6rryF1OZrKnz1S5g== +eslint-plugin-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz#6708037d7602e5288ce877fd0103f329dc978361" + integrity sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg== dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" @@ -1785,7 +1780,7 @@ eslint-plugin-prettier@3.1.4: dependencies: prettier-linter-helpers "^1.0.0" -eslint-scope@^5.0.0, eslint-scope@^5.1.0: +eslint-scope@^5.0.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -1815,22 +1810,22 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.9.0: - version "7.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337" - integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA== +eslint@7.12.1: + version "7.12.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801" + integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg== dependencies: "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.1.3" + "@eslint/eslintrc" "^0.2.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" + eslint-scope "^5.1.1" eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" + eslint-visitor-keys "^2.0.0" espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" @@ -1958,16 +1953,16 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expect@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.4.2.tgz#36db120928a5a2d7d9736643032de32f24e1b2a1" - integrity sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA== +expect@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.1.tgz#e1e053cdc43b21a452b36fc7cc9401e4603949c1" + integrity sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" ansi-styles "^4.0.0" jest-get-type "^26.3.0" - jest-matcher-utils "^26.4.2" - jest-message-util "^26.3.0" + jest-matcher-utils "^26.6.1" + jest-message-util "^26.6.1" jest-regex-util "^26.0.0" express@4.17.1: @@ -2021,7 +2016,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -2084,6 +2079,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fast-safe-stringify@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + fastq@^1.6.0: version "1.8.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" @@ -2196,12 +2196,13 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== dependencies: asynckit "^0.4.0" - combined-stream "1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" form-data@~2.3.2: @@ -2213,10 +2214,10 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formidable@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" - integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg== +formidable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" + integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== forwarded@~0.1.2: version "0.1.2" @@ -2582,11 +2583,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -inherits@2.0.4: +inherits@2.0.4, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2651,6 +2652,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" + integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -2825,7 +2833,7 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2891,67 +2899,67 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.3.0.tgz#68fb2a7eb125f50839dab1f5a17db3607fe195b1" - integrity sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g== +jest-changed-files@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.1.tgz#2fac3dc51297977ee883347948d8e3d37c417fba" + integrity sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" execa "^4.0.0" throat "^5.0.0" -jest-cli@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.4.2.tgz#24afc6e4dfc25cde4c7ec4226fb7db5f157c21da" - integrity sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw== +jest-cli@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.1.tgz#8952242fa812c05bd129abf7c022424045b7fd67" + integrity sha512-aPLoEjlwFrCWhiPpW5NUxQA1X1kWsAnQcQ0SO/fHsCvczL3W75iVAcH9kP6NN+BNqZcHNEvkhxT5cDmBfEAh+w== dependencies: - "@jest/core" "^26.4.2" - "@jest/test-result" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/core" "^26.6.1" + "@jest/test-result" "^26.6.1" + "@jest/types" "^26.6.1" 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.4.2" - jest-util "^26.3.0" - jest-validate "^26.4.2" + jest-config "^26.6.1" + jest-util "^26.6.1" + jest-validate "^26.6.1" prompts "^2.0.1" - yargs "^15.3.1" + yargs "^15.4.1" -jest-config@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.4.2.tgz#da0cbb7dc2c131ffe831f0f7f2a36256e6086558" - integrity sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A== +jest-config@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.1.tgz#8c343fbdd9c24ad003e261f73583c3c020f32b42" + integrity sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g== dependencies: "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.4.2" - "@jest/types" "^26.3.0" - babel-jest "^26.3.0" + "@jest/test-sequencer" "^26.6.1" + "@jest/types" "^26.6.1" + babel-jest "^26.6.1" chalk "^4.0.0" deepmerge "^4.2.2" glob "^7.1.1" graceful-fs "^4.2.4" - jest-environment-jsdom "^26.3.0" - jest-environment-node "^26.3.0" + jest-environment-jsdom "^26.6.1" + jest-environment-node "^26.6.1" jest-get-type "^26.3.0" - jest-jasmine2 "^26.4.2" + jest-jasmine2 "^26.6.1" jest-regex-util "^26.0.0" - jest-resolve "^26.4.0" - jest-util "^26.3.0" - jest-validate "^26.4.2" + jest-resolve "^26.6.1" + jest-util "^26.6.1" + jest-validate "^26.6.1" micromatch "^4.0.2" - pretty-format "^26.4.2" + pretty-format "^26.6.1" -jest-diff@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.4.2.tgz#a1b7b303bcc534aabdb3bd4a7caf594ac059f5aa" - integrity sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ== +jest-diff@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.1.tgz#38aa194979f454619bb39bdee299fb64ede5300c" + integrity sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg== dependencies: chalk "^4.0.0" - diff-sequences "^26.3.0" + diff-sequences "^26.5.0" jest-get-type "^26.3.0" - pretty-format "^26.4.2" + pretty-format "^26.6.1" jest-docblock@^26.0.0: version "26.0.0" @@ -2960,130 +2968,130 @@ jest-docblock@^26.0.0: dependencies: detect-newline "^3.0.0" -jest-each@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.4.2.tgz#bb14f7f4304f2bb2e2b81f783f989449b8b6ffae" - integrity sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA== +jest-each@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.1.tgz#e968e88309a3e2ae9648634af8f89d8ee5acfddd" + integrity sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" chalk "^4.0.0" jest-get-type "^26.3.0" - jest-util "^26.3.0" - pretty-format "^26.4.2" + jest-util "^26.6.1" + pretty-format "^26.6.1" -jest-environment-jsdom@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz#3b749ba0f3a78e92ba2c9ce519e16e5dd515220c" - integrity sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA== +jest-environment-jsdom@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz#63093bf89daee6139616568a43633b84cf7aac21" + integrity sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA== dependencies: - "@jest/environment" "^26.3.0" - "@jest/fake-timers" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/environment" "^26.6.1" + "@jest/fake-timers" "^26.6.1" + "@jest/types" "^26.6.1" "@types/node" "*" - jest-mock "^26.3.0" - jest-util "^26.3.0" - jsdom "^16.2.2" - -jest-environment-node@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.3.0.tgz#56c6cfb506d1597f94ee8d717072bda7228df849" - integrity sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw== - dependencies: - "@jest/environment" "^26.3.0" - "@jest/fake-timers" "^26.3.0" - "@jest/types" "^26.3.0" + jest-mock "^26.6.1" + jest-util "^26.6.1" + jsdom "^16.4.0" + +jest-environment-node@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.1.tgz#4d73d8b33c26989a92a0ed3ad0bfd6f7a196d9bd" + integrity sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg== + dependencies: + "@jest/environment" "^26.6.1" + "@jest/fake-timers" "^26.6.1" + "@jest/types" "^26.6.1" "@types/node" "*" - jest-mock "^26.3.0" - jest-util "^26.3.0" + jest-mock "^26.6.1" + jest-util "^26.6.1" jest-get-type@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== -jest-haste-map@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.3.0.tgz#c51a3b40100d53ab777bfdad382d2e7a00e5c726" - integrity sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA== +jest-haste-map@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.1.tgz#97e96f5fd7576d980307fbe6160b10c016b543d4" + integrity sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" "@types/graceful-fs" "^4.1.2" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.4" jest-regex-util "^26.0.0" - jest-serializer "^26.3.0" - jest-util "^26.3.0" - jest-worker "^26.3.0" + jest-serializer "^26.5.0" + jest-util "^26.6.1" + jest-worker "^26.6.1" micromatch "^4.0.2" sane "^4.0.3" walker "^1.0.7" optionalDependencies: fsevents "^2.1.2" -jest-jasmine2@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz#18a9d5bec30904267ac5e9797570932aec1e2257" - integrity sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA== +jest-jasmine2@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz#11c92603d1fa97e3c33404359e69d6cec7e57017" + integrity sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw== dependencies: "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.3.0" - "@jest/source-map" "^26.3.0" - "@jest/test-result" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/environment" "^26.6.1" + "@jest/source-map" "^26.5.0" + "@jest/test-result" "^26.6.1" + "@jest/types" "^26.6.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.4.2" + expect "^26.6.1" is-generator-fn "^2.0.0" - jest-each "^26.4.2" - jest-matcher-utils "^26.4.2" - jest-message-util "^26.3.0" - jest-runtime "^26.4.2" - jest-snapshot "^26.4.2" - jest-util "^26.3.0" - pretty-format "^26.4.2" + jest-each "^26.6.1" + jest-matcher-utils "^26.6.1" + jest-message-util "^26.6.1" + jest-runtime "^26.6.1" + jest-snapshot "^26.6.1" + jest-util "^26.6.1" + pretty-format "^26.6.1" throat "^5.0.0" -jest-leak-detector@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz#c73e2fa8757bf905f6f66fb9e0070b70fa0f573f" - integrity sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA== +jest-leak-detector@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz#f63e46dc4e3aa30d29b40ae49966a15730d25bbe" + integrity sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA== dependencies: jest-get-type "^26.3.0" - pretty-format "^26.4.2" + pretty-format "^26.6.1" -jest-matcher-utils@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz#fa81f3693f7cb67e5fc1537317525ef3b85f4b06" - integrity sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q== +jest-matcher-utils@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz#bc90822d352c91c2ec1814731327691d06598400" + integrity sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg== dependencies: chalk "^4.0.0" - jest-diff "^26.4.2" + jest-diff "^26.6.1" jest-get-type "^26.3.0" - pretty-format "^26.4.2" + pretty-format "^26.6.1" -jest-message-util@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.3.0.tgz#3bdb538af27bb417f2d4d16557606fd082d5841a" - integrity sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA== +jest-message-util@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.1.tgz#d62c20c0fe7be10bfd6020b675abb9b5fa933ff3" + integrity sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw== dependencies: "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.3.0" - "@types/stack-utils" "^1.0.1" + "@jest/types" "^26.6.1" + "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.4" micromatch "^4.0.2" slash "^3.0.0" stack-utils "^2.0.2" -jest-mock@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.3.0.tgz#ee62207c3c5ebe5f35b760e1267fee19a1cfdeba" - integrity sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q== +jest-mock@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.1.tgz#6c12a92a82fc833f81a5b6de6b67d78386e276a3" + integrity sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -3096,170 +3104,172 @@ jest-regex-util@^26.0.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== -jest-resolve-dependencies@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz#739bdb027c14befb2fe5aabbd03f7bab355f1dc5" - integrity sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ== +jest-resolve-dependencies@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz#e9d091a159ad198c029279737a8b4c507791d75c" + integrity sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" jest-regex-util "^26.0.0" - jest-snapshot "^26.4.2" + jest-snapshot "^26.6.1" -jest-resolve@^26.4.0: - version "26.4.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.4.0.tgz#6dc0af7fb93e65b73fec0368ca2b76f3eb59a6d7" - integrity sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg== +jest-resolve@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.1.tgz#e9a9130cc069620d5aeeb87043dd9e130b68c6a1" + integrity sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" chalk "^4.0.0" graceful-fs "^4.2.4" jest-pnp-resolver "^1.2.2" - jest-util "^26.3.0" + jest-util "^26.6.1" read-pkg-up "^7.0.1" - resolve "^1.17.0" + resolve "^1.18.1" slash "^3.0.0" -jest-runner@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.4.2.tgz#c3ec5482c8edd31973bd3935df5a449a45b5b853" - integrity sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g== +jest-runner@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.1.tgz#a945971b5a23740c1fe20e372a38de668b7c76bf" + integrity sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA== dependencies: - "@jest/console" "^26.3.0" - "@jest/environment" "^26.3.0" - "@jest/test-result" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/console" "^26.6.1" + "@jest/environment" "^26.6.1" + "@jest/test-result" "^26.6.1" + "@jest/types" "^26.6.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.7.1" exit "^0.1.2" graceful-fs "^4.2.4" - jest-config "^26.4.2" + jest-config "^26.6.1" jest-docblock "^26.0.0" - jest-haste-map "^26.3.0" - jest-leak-detector "^26.4.2" - jest-message-util "^26.3.0" - jest-resolve "^26.4.0" - jest-runtime "^26.4.2" - jest-util "^26.3.0" - jest-worker "^26.3.0" + jest-haste-map "^26.6.1" + jest-leak-detector "^26.6.1" + jest-message-util "^26.6.1" + jest-resolve "^26.6.1" + jest-runtime "^26.6.1" + jest-util "^26.6.1" + jest-worker "^26.6.1" source-map-support "^0.5.6" throat "^5.0.0" -jest-runtime@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.4.2.tgz#94ce17890353c92e4206580c73a8f0c024c33c42" - integrity sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ== - dependencies: - "@jest/console" "^26.3.0" - "@jest/environment" "^26.3.0" - "@jest/fake-timers" "^26.3.0" - "@jest/globals" "^26.4.2" - "@jest/source-map" "^26.3.0" - "@jest/test-result" "^26.3.0" - "@jest/transform" "^26.3.0" - "@jest/types" "^26.3.0" +jest-runtime@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.1.tgz#9a131e7b4f0bc6beefd62e7443f757c1d5fa9dec" + integrity sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ== + dependencies: + "@jest/console" "^26.6.1" + "@jest/environment" "^26.6.1" + "@jest/fake-timers" "^26.6.1" + "@jest/globals" "^26.6.1" + "@jest/source-map" "^26.5.0" + "@jest/test-result" "^26.6.1" + "@jest/transform" "^26.6.1" + "@jest/types" "^26.6.1" "@types/yargs" "^15.0.0" chalk "^4.0.0" + cjs-module-lexer "^0.4.2" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-config "^26.4.2" - jest-haste-map "^26.3.0" - jest-message-util "^26.3.0" - jest-mock "^26.3.0" + jest-config "^26.6.1" + jest-haste-map "^26.6.1" + jest-message-util "^26.6.1" + jest-mock "^26.6.1" jest-regex-util "^26.0.0" - jest-resolve "^26.4.0" - jest-snapshot "^26.4.2" - jest-util "^26.3.0" - jest-validate "^26.4.2" + jest-resolve "^26.6.1" + jest-snapshot "^26.6.1" + jest-util "^26.6.1" + jest-validate "^26.6.1" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.3.1" + yargs "^15.4.1" -jest-serializer@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.3.0.tgz#1c9d5e1b74d6e5f7e7f9627080fa205d976c33ef" - integrity sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow== +jest-serializer@^26.5.0: + version "26.5.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.5.0.tgz#f5425cc4c5f6b4b355f854b5f0f23ec6b962bc13" + integrity sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA== dependencies: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.4.2.tgz#87d3ac2f2bd87ea8003602fbebd8fcb9e94104f6" - integrity sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg== +jest-snapshot@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.1.tgz#469e9d0b749496aea7dad0d7e5e5c88b91cdb4cc" + integrity sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA== dependencies: "@babel/types" "^7.0.0" - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" + "@types/babel__traverse" "^7.0.4" "@types/prettier" "^2.0.0" chalk "^4.0.0" - expect "^26.4.2" + expect "^26.6.1" graceful-fs "^4.2.4" - jest-diff "^26.4.2" + jest-diff "^26.6.1" jest-get-type "^26.3.0" - jest-haste-map "^26.3.0" - jest-matcher-utils "^26.4.2" - jest-message-util "^26.3.0" - jest-resolve "^26.4.0" + jest-haste-map "^26.6.1" + jest-matcher-utils "^26.6.1" + jest-message-util "^26.6.1" + jest-resolve "^26.6.1" natural-compare "^1.4.0" - pretty-format "^26.4.2" + pretty-format "^26.6.1" semver "^7.3.2" -jest-util@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.3.0.tgz#a8974b191df30e2bf523ebbfdbaeb8efca535b3e" - integrity sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw== +jest-util@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.1.tgz#4cc0d09ec57f28d12d053887eec5dc976a352e9b" + integrity sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" "@types/node" "*" chalk "^4.0.0" graceful-fs "^4.2.4" is-ci "^2.0.0" micromatch "^4.0.2" -jest-validate@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.4.2.tgz#e871b0dfe97747133014dcf6445ee8018398f39c" - integrity sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ== +jest-validate@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.1.tgz#28730eb8570d60968d9d06f1a8c94d922167bd2a" + integrity sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" camelcase "^6.0.0" chalk "^4.0.0" jest-get-type "^26.3.0" leven "^3.1.0" - pretty-format "^26.4.2" + pretty-format "^26.6.1" -jest-watcher@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.3.0.tgz#f8ef3068ddb8af160ef868400318dc4a898eed08" - integrity sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ== +jest-watcher@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.1.tgz#debfa34e9c5c3e735593403794fe53d2955bfabc" + integrity sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw== dependencies: - "@jest/test-result" "^26.3.0" - "@jest/types" "^26.3.0" + "@jest/test-result" "^26.6.1" + "@jest/types" "^26.6.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.3.0" + jest-util "^26.6.1" string-length "^4.0.1" -jest-worker@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f" - integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw== +jest-worker@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.1.tgz#c2ae8cde6802cc14056043f997469ec170d9c32a" + integrity sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^7.0.0" -jest@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.4.2.tgz#7e8bfb348ec33f5459adeaffc1a25d5752d9d312" - integrity sha512-LLCjPrUh98Ik8CzW8LLVnSCfLaiY+wbK53U7VxnFSX7Q+kWC4noVeDvGWIFw0Amfq1lq2VfGm7YHWSLBV62MJw== +jest@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.1.tgz#821e8280d2bdeeed40ac7bc43941dceff0f1b650" + integrity sha512-f+ahfqw3Ffy+9vA7sWFGpTmhtKEMsNAZiWBVXDkrpIO73zIz22iimjirnV78kh/eWlylmvLh/0WxHN6fZraZdA== dependencies: - "@jest/core" "^26.4.2" + "@jest/core" "^26.6.1" import-local "^3.0.2" - jest-cli "^26.4.2" + jest-cli "^26.6.1" js-tokens@^4.0.0: version "4.0.0" @@ -3286,7 +3296,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsdom@^16.2.2: +jsdom@^16.4.0: version "16.4.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== @@ -3435,10 +3445,10 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.4.0.tgz#d18628f737328e0bbbf87d183f4020930e9a984e" - integrity sha512-uaiX4U5yERUSiIEQc329vhCTDDwUcSvKdRLsNomkYLRzijk3v8V9GWm2Nz0RMVB87VcuzLvtgy6OsjoH++QHIg== +lint-staged@10.5.0: + version "10.5.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.0.tgz#c923c2447a84c595874f3de696778736227e7a7a" + integrity sha512-gjC9+HGkBubOF+Yyoj9pd52Qfm/kYB+dRX1UOgWjHKvSDYl+VHkZXlBMlqSZa2cH3Kp5/uNL480sV6e2dTgXSg== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" @@ -3596,7 +3606,7 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: +methods@1.1.2, methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -3661,10 +3671,15 @@ mime-types@~2.1.24: dependencies: mime-db "1.40.0" -mime@1.6.0, mime@^1.4.1: +mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" +mime@^2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -4180,19 +4195,15 @@ prettier@2.1.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== -pretty-format@^26.4.2: - version "26.4.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237" - integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA== +pretty-format@^26.6.1: + version "26.6.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.1.tgz#af9a2f63493a856acddeeb11ba6bcf61989660a8" + integrity sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA== dependencies: - "@jest/types" "^26.3.0" + "@jest/types" "^26.6.1" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^16.12.0" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + react-is "^17.0.1" progress@^2.0.0: version "2.0.0" @@ -4236,7 +4247,12 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.5.1, qs@~6.5.2: +qs@^6.9.4: + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + +qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -4255,10 +4271,10 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -react-is@^16.12.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== read-pkg-up@^2.0.0: version "2.0.0" @@ -4302,18 +4318,14 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.3.5: - version "2.3.6" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -4424,6 +4436,14 @@ resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: dependencies: path-parse "^1.0.6" +resolve@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -4473,11 +4493,11 @@ rxjs@^6.6.2: dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4896,11 +4916,12 @@ string.prototype.trimstart@^1.0.1: define-properties "^1.1.3" es-abstract "^1.17.5" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: - safe-buffer "~5.1.0" + safe-buffer "~5.2.0" stringify-object@^3.3.0: version "3.3.0" @@ -4949,29 +4970,30 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -superagent@^3.8.3: - version "3.8.3" - resolved "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz#460ea0dbdb7d5b11bc4f78deba565f86a178e128" - integrity sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA== - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.1.0" - debug "^3.1.0" - extend "^3.0.0" - form-data "^2.3.1" - formidable "^1.2.0" - methods "^1.1.1" - mime "^1.4.1" - qs "^6.5.1" - readable-stream "^2.3.5" - -supertest@4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz#c2234dbdd6dc79b6f15b99c8d6577b90e4ce3f36" - integrity sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ== +superagent@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6" + integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg== dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.2" + debug "^4.1.1" + fast-safe-stringify "^2.0.7" + form-data "^3.0.0" + formidable "^1.2.2" methods "^1.1.2" - superagent "^3.8.3" + mime "^2.4.6" + qs "^6.9.4" + readable-stream "^3.6.0" + semver "^7.3.2" + +supertest@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-5.0.0.tgz#771aedfeb0a95466cc5d100d5d11288736fd25da" + integrity sha512-2JAWpPrUOZF4hHH5ZTCN2xjKXvJS3AEwPNXl0HUseHsfcXFvMy9kcsufIHCNAmQ5hlGCvgeAqaR5PBEouN3hlQ== + dependencies: + methods "1.1.2" + superagent "6.1.0" supports-color@^5.3.0: version "5.5.0" @@ -5254,9 +5276,10 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= utils-merge@1.0.1: version "1.0.1" @@ -5277,10 +5300,10 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== -v8-to-istanbul@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz#0608f5b49a481458625edb058488607f25498ba5" - integrity sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q== +v8-to-istanbul@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz#7ef0e32faa10f841fe4c1b0f8de96ed067c0be1e" + integrity sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -5454,7 +5477,7 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^15.3.1: +yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==