diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9c9f82c17d..a428836011 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: - name: Build run: npm run build - name: Run tests - run: npm test -- --coverage --verbose && npm run test:types + run: npm test -- --coverage --verbose - name: Coverage uses: codecov/codecov-action@v1 with: @@ -66,11 +66,21 @@ jobs: node-version: 16 - name: Dependencies uses: bahmutov/npm-install@v1 + - name: Determine version + uses: ./config/version-pr + id: determine-version + env: + PR_NUMBER: ${{ github.event.number }} - name: Publish to npm run: | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> .npmrc - npm run version:pr npm publish --access public --tag experimental env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - PR_NUMBER: ${{ github.event.number }} + - name: Comment version on PR + uses: NejcZdovc/comment-pr@v1 + with: + message: "🎉 Experimental release [published on npm](https://www.npmjs.com/package/next-auth/v/${{ env.VERSION }})!\n\n```sh\nnpm i next-auth@${{ env.VERSION }}\n```\n```sh\nyarn add next-auth@${{ env.VERSION }}\n```" + env: + VERSION: ${{ steps.determine-version.outputs.version }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 396d639f2f..825a6a244e 100644 --- a/.gitignore +++ b/.gitignore @@ -24,25 +24,16 @@ node_modules # Generated files .docusaurus .cache-loader -/internals /providers -/types/providers/* -!types/providers/index.d.ts -!types/providers/email.d.ts -!types/providers/credentials.d.ts -!types/providers/oauth.d.ts +/client +/css +/lib +/server +/jwt +/react /adapters.d.ts -/adapters.js -/client.d.ts -/client.js /index.d.ts /index.js -/jwt.d.ts -/jwt.js -/errors.js -/errors.d.ts -/react.js -/react.d.ts # Development app app/next-auth diff --git a/config/babel.config.js b/config/babel.config.js index 51dedf29a9..db48f18d44 100644 --- a/config/babel.config.js +++ b/config/babel.config.js @@ -2,28 +2,54 @@ // https://nextjs.org/docs/getting-started#system-requirements // https://nextjs.org/docs/basic-features/supported-browsers-features -module.exports = { - presets: [["@babel/preset-env", { targets: { node: "12" } }]], - plugins: [ - "@babel/plugin-proposal-optional-catch-binding", - "@babel/plugin-transform-runtime", - ], - comments: false, - overrides: [ - { - test: ["../src/client/**"], +module.exports = (api) => { + const isTest = api.env("test") + if (isTest) { + return { presets: [ - ["@babel/preset-env", { targets: { ie: "11" } }], + "@babel/preset-env", ["@babel/preset-react", { runtime: "automatic" }], + ["@babel/preset-typescript", { isTSX: true, allExtensions: true }], ], - }, - { - test: ["../src/server/pages/**"], - presets: ["preact"], - }, - { - test: ["../src/**/*.test.js"], - presets: [["@babel/preset-react", { runtime: "automatic" }]], - }, - ], + } + } + return { + presets: [ + ["@babel/preset-env", { targets: { node: 12 } }], + "@babel/preset-typescript", + ], + plugins: [ + "@babel/plugin-proposal-optional-catch-binding", + "@babel/plugin-transform-runtime", + ], + ignore: [ + "../src/**/__tests__/**", + "../src/adapters.ts", + "../src/lib/types.ts", + ], + comments: false, + overrides: [ + { + test: ["../src/react/index.tsx"], + presets: [ + ["@babel/preset-env", { targets: { ie: 11 } }], + ["@babel/preset-react", { runtime: "automatic" }], + ], + }, + { + test: ["../src/server/pages/*.tsx"], + presets: ["preact"], + plugins: [ + [ + "jsx-pragmatic", + { + module: "preact", + export: "h", + import: "h", + }, + ], + ], + }, + ], + } } diff --git a/config/build.js b/config/build.js deleted file mode 100644 index b75b3ab253..0000000000 --- a/config/build.js +++ /dev/null @@ -1,108 +0,0 @@ -const fs = require("fs-extra") -const path = require("path") - -const MODULE_ENTRIES = { - SERVER: "index", - REACT: "react", - ADAPTERS: "adapters", - JWT: "jwt", -} - -// Building submodule entries - -const BUILD_TARGETS = { - [`${MODULE_ENTRIES.SERVER}.js`]: - "module.exports = require('./dist/server').default\n", - [`${MODULE_ENTRIES.REACT}.js`]: - "module.exports = require('./dist/client/react').default\n", - [`${MODULE_ENTRIES.JWT}.js`]: - "module.exports = require('./dist/lib/jwt').default\n", -} - -Object.entries(BUILD_TARGETS).forEach(([target, content]) => { - fs.writeFile(path.join(process.cwd(), target), content, (err) => { - if (err) throw err - console.log(`[build] created "${target}" in root folder`) - }) -}) - -// Building types -fs.mkdirSync("providers", { recursive: true }) - -const TYPES_TARGETS = [ - `${MODULE_ENTRIES.SERVER}.d.ts`, - `${MODULE_ENTRIES.REACT}-client.d.ts`, - `${MODULE_ENTRIES.ADAPTERS}.d.ts`, - "providers", - `${MODULE_ENTRIES.JWT}.d.ts`, - "internals", -] - -TYPES_TARGETS.forEach((target) => { - fs.copy( - path.resolve("types", target), - path.join( - process.cwd(), - target.startsWith("react-client") ? "react.d.ts" : target - ), - (err) => { - if (err) throw err - console.log(`[types] copying "${target}" to root folder`) - } - ) -}) - -// Generate provider types - -const providersDirPath = path.join(process.cwd(), "/src/providers") - -const oauthProviderFiles = fs - .readdirSync(providersDirPath, "utf8") - .filter((f) => f !== "credentials.js" && f !== "email.js") - -let type = `export type OAuthProviderType =\n` - -oauthProviderFiles.forEach((file) => { - const provider = fs.readFileSync(path.join(providersDirPath, file), "utf8") - const fileName = file.split(".")[0] - try { - // NOTE: If this fails, the default export probably wasn't a named function. - // Always use a named function as default export. - // Eg.: export default function YourProvider ... - const { functionName } = provider.match( - /export default function (?.+)\s?\(/ - ).groups - - type += ` | "${functionName}"\n` - const providerModule = `import { OAuthConfig } from "." - -declare module "next-auth/providers/${fileName}" { - export default function ${functionName}Provider( - options: Partial - ): OAuthConfig -} -` - - fs.writeFile( - path.join("types/providers", `${fileName}.d.ts`), - providerModule - ) - - console.log( - `[types] created module declaration for "${functionName}" provider` - ) - } catch (error) { - console.error( - [ - `\nThe provider file '${file}' should have a single named default export`, - "Example: 'export default function YourProvider'\n\n", - ].join("\n") - ) - process.exit(1) - } -}) - -fs.writeFile( - path.join(process.cwd(), "types/providers/oauth-providers.d.ts"), - type -) diff --git a/config/jest-setup.js b/config/jest-setup.js index ba4d1b6f0b..54051de04d 100644 --- a/config/jest-setup.js +++ b/config/jest-setup.js @@ -1,2 +1,3 @@ +import "regenerator-runtime/runtime" import "@testing-library/jest-dom" import "whatwg-fetch" diff --git a/config/jest.config.js b/config/jest.config.js index 0f3d7e8e12..c6a983c017 100644 --- a/config/jest.config.js +++ b/config/jest.config.js @@ -1,7 +1,10 @@ /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { transform: { - "\\.js$": ["babel-jest", { configFile: "./config/babel.config.js" }], + "\\.(js|jsx|ts|tsx)$": [ + "babel-jest", + { configFile: "./config/babel.config.js" }, + ], }, rootDir: "../src", setupFilesAfterEnv: ["../config/jest-setup.js"], diff --git a/config/version-pr/action.yml b/config/version-pr/action.yml new file mode 100644 index 0000000000..b7ce08e5e8 --- /dev/null +++ b/config/version-pr/action.yml @@ -0,0 +1,8 @@ +name: "Determine version" +description: "Determines npm package version based on PR number and commit SHA" +outputs: + version: + description: "npm package version" +runs: + using: "node12" + main: "index.js" diff --git a/config/version-pr.js b/config/version-pr/index.js similarity index 64% rename from config/version-pr.js rename to config/version-pr/index.js index 9f2d6606d5..55dbf75dd5 100644 --- a/config/version-pr.js +++ b/config/version-pr/index.js @@ -1,5 +1,6 @@ const fs = require("fs-extra") const path = require("path") +const core = require("@actions/core") try { const packageJSONPath = path.join(process.cwd(), "package.json") @@ -8,10 +9,10 @@ try { const sha8 = process.env.GITHUB_SHA.substr(0, 8) const prNumber = process.env.PR_NUMBER - packageJSON.version = `0.0.0-pr.${prNumber}.${sha8}` - + const packageVersion = `0.0.0-pr.${prNumber}.${sha8}` + packageJSON.version = packageVersion + core.setOutput("version", packageVersion) fs.writeFileSync(packageJSONPath, JSON.stringify(packageJSON)) } catch (error) { - console.error("Could not set PR version", error) - process.exit(1) + core.setFailed(error.message) } diff --git a/config/wrap-css.js b/config/wrap-css.js index e70dc7116f..d59d7892d2 100644 --- a/config/wrap-css.js +++ b/config/wrap-css.js @@ -5,14 +5,13 @@ // To work around this issue, this script is a manual step that wraps CSS in a // JavaScript file that has the compiled CSS embedded in it, and exports only // a function that returns the CSS as a string. -const fs = require('fs') -const path = require('path') +const fs = require("fs") +const path = require("path") -const pathToCssJs = path.join(__dirname, '../dist/css/index.js') -const pathToCss = path.join(__dirname, '../dist/css/index.css') - -const css = fs.readFileSync(pathToCss, 'utf8') +const pathToCss = path.join(__dirname, "../css/index.css") +const css = fs.readFileSync(pathToCss, "utf8") const cssWithEscapedQuotes = css.replace(/"/gm, '\\"') -const js = `module.exports = function() { return "${cssWithEscapedQuotes}" }` +const js = `module.exports = function() { return "${cssWithEscapedQuotes}" }` +const pathToCssJs = path.join(__dirname, "../css/index.js") fs.writeFileSync(pathToCssJs, js) diff --git a/package-lock.json b/package-lock.json index 6093f005a5..3a40090533 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,27 +23,30 @@ "preact-render-to-string": "^5.1.19" }, "devDependencies": { + "@actions/core": "^1.4.0", "@babel/cli": "^7.14.5", "@babel/core": "^7.14.6", "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", "@babel/plugin-transform-runtime": "^7.14.5", "@babel/preset-env": "^7.14.7", "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^12.0.0", "@testing-library/react-hooks": "^7.0.1", "@testing-library/user-event": "^13.1.9", - "@types/nodemailer": "^6.4.2", + "@types/nodemailer": "^6.4.4", "@types/oauth": "^0.9.1", - "@types/react": "^17.0.11", - "@typescript-eslint/eslint-plugin": "^4.28.0", - "@typescript-eslint/parser": "^4.28.0", + "@types/react": "^17.0.19", + "@types/react-dom": "^17.0.9", + "@typescript-eslint/eslint-plugin": "^4.29.2", + "@typescript-eslint/parser": "^4.29.2", "autoprefixer": "^10.2.6", "babel-jest": "^27.0.5", + "babel-plugin-jsx-pragmatic": "^1.0.2", "babel-preset-preact": "^2.0.0", "conventional-changelog-conventionalcommits": "4.6.0", "cssnano": "^5.0.6", - "dtslint": "^4.1.0", "eslint": "^7.29.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard-with-typescript": "^20.0.0", @@ -62,7 +65,7 @@ "pretty-quick": "^3.1.1", "react": "^17.0.2", "react-dom": "^17.0.2", - "typescript": "^4.3.4", + "typescript": "^4.3.5", "whatwg-fetch": "^3.6.2" }, "peerDependencies": { @@ -76,6 +79,12 @@ } } }, + "node_modules/@actions/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.5.0.tgz", + "integrity": "sha512-eDOLH1Nq9zh+PJlYLqEMkS/jLQxhksPNmUGNBHfa4G+tQmnIhzpctxmchETtVGyBOvXgOVVpYuE40+eS4cUnwQ==", + "dev": true + }, "node_modules/@babel/cli": { "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.8.tgz", @@ -1574,6 +1583,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz", + "integrity": "sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", @@ -1728,6 +1754,23 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", @@ -1805,77 +1848,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@definitelytyped/header-parser": { - "version": "0.0.87", - "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.87.tgz", - "integrity": "sha512-fwxajaVUf4mbRWOLwUJFHyscqrrxsaybtBDBgfEr/kB4R25qbQFX2bD7rIf/5UOS7cj9l/dyVbTRxUf1OzofUg==", - "dev": true, - "dependencies": { - "@definitelytyped/typescript-versions": "^0.0.87", - "@types/parsimmon": "^1.10.1", - "parsimmon": "^1.13.0" - } - }, - "node_modules/@definitelytyped/typescript-versions": { - "version": "0.0.87", - "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.87.tgz", - "integrity": "sha512-RNXQXmr64eDcoCrAKbk8v2cuj+a/5C0Bz6C2tjSJC1p477pRJMO2AmTKLJZrF8LSbCrTcZx9U5TlkMyjV17WSw==", - "dev": true - }, - "node_modules/@definitelytyped/utils": { - "version": "0.0.87", - "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.87.tgz", - "integrity": "sha512-R3hZhpHHM82fjPGKf7VMsUA1C2x2hJoxmaWNlts7CMBtW0SMtJHPuEvzJxLCx5jHZDaGHei3K4ziHhOf1BLHFg==", - "dev": true, - "dependencies": { - "@definitelytyped/typescript-versions": "^0.0.87", - "@types/node": "^14.14.35", - "charm": "^1.0.2", - "fs-extra": "^8.1.0", - "fstream": "^1.0.12", - "npm-registry-client": "^8.6.0", - "tar": "^2.2.2", - "tar-stream": "^2.1.4" - } - }, - "node_modules/@definitelytyped/utils/node_modules/@types/node": { - "version": "14.17.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.12.tgz", - "integrity": "sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw==", - "dev": true - }, - "node_modules/@definitelytyped/utils/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@definitelytyped/utils/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@definitelytyped/utils/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -1911,18 +1883,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2006,16 +1966,16 @@ } }, "node_modules/@jest/console": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", - "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.1.0.tgz", + "integrity": "sha512-+Vl+xmLwAXLNlqT61gmHEixeRbS4L8MUzAjtpBCOPWH+izNI/dR16IeXjkXJdRtIVWVSf9DO1gdp67B1XorZhQ==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.0.6", - "jest-util": "^27.0.6", + "jest-message-util": "^27.1.0", + "jest-util": "^27.1.0", "slash": "^3.0.0" }, "engines": { @@ -2102,35 +2062,35 @@ } }, "node_modules/@jest/core": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", - "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.1.0.tgz", + "integrity": "sha512-3l9qmoknrlCFKfGdrmiQiPne+pUR4ALhKwFTYyOeKw6egfDwJkO21RJ1xf41rN8ZNFLg5W+w6+P4fUqq4EMRWA==", "dev": true, "dependencies": { - "@jest/console": "^27.0.6", - "@jest/reporters": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/reporters": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.0.6", - "jest-config": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-message-util": "^27.0.6", + "jest-changed-files": "^27.1.0", + "jest-config": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-resolve-dependencies": "^27.0.6", - "jest-runner": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", - "jest-watcher": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-resolve-dependencies": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "jest-watcher": "^27.1.0", "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -2287,62 +2247,62 @@ } }, "node_modules/@jest/environment": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", - "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.1.0.tgz", + "integrity": "sha512-wRp50aAMY2w1U2jP1G32d6FUVBNYqmk8WaGkiIEisU48qyDV0WPtw3IBLnl7orBeggveommAkuijY+RzVnNDOQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", - "jest-mock": "^27.0.6" + "jest-mock": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", - "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.1.0.tgz", + "integrity": "sha512-22Zyn8il8DzpS+30jJNVbTlm7vAtnfy1aYvNeOEHloMlGy1PCYLHa4PWlSws0hvNsMM5bON6GISjkLoQUV3oMA==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^27.0.6", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6" + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/globals": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", - "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.1.0.tgz", + "integrity": "sha512-73vLV4aNHAlAgjk0/QcSIzzCZSqVIPbmFROJJv9D3QUR7BI4f517gVdJpSrCHxuRH3VZFhe0yGG/tmttlMll9g==", "dev": true, "dependencies": { - "@jest/environment": "^27.0.6", - "@jest/types": "^27.0.6", - "expect": "^27.0.6" + "@jest/environment": "^27.1.0", + "@jest/types": "^27.1.0", + "expect": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", - "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.1.0.tgz", + "integrity": "sha512-5T/zlPkN2HnK3Sboeg64L5eC8iiaZueLpttdktWTJsvALEtP2YMkC5BQxwjRWQACG9SwDmz+XjjkoxXUDMDgdw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -2353,10 +2313,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -2487,13 +2447,13 @@ } }, "node_modules/@jest/test-result": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", - "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.1.0.tgz", + "integrity": "sha512-Aoz00gpDL528ODLghat3QSy6UBTD5EmmpjrhZZMK/v1Q2/rRRqTGnFxHuEkrD4z/Py96ZdOHxIWkkCKRpmnE1A==", "dev": true, "dependencies": { - "@jest/console": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/types": "^27.1.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -2502,36 +2462,36 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", - "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.1.0.tgz", + "integrity": "sha512-lnCWawDr6Z1DAAK9l25o3AjmKGgcutq1iIbp+hC10s/HxnB8ZkUsYq1FzjOoxxZ5hW+1+AthBtvS4x9yno3V1A==", "dev": true, "dependencies": { - "@jest/test-result": "^27.0.6", + "@jest/test-result": "^27.1.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", - "jest-runtime": "^27.0.6" + "jest-haste-map": "^27.1.0", + "jest-runtime": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", - "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.1.0.tgz", + "integrity": "sha512-ZRGCA2ZEVJ00ubrhkTG87kyLbN6n55g1Ilq0X9nJb5bX3MhMp3O6M7KG+LvYu+nZRqG5cXsQnJEdZbdpTAV8pQ==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", + "jest-haste-map": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-util": "^27.0.6", + "jest-util": "^27.1.0", "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -2689,9 +2649,9 @@ } }, "node_modules/@jest/types": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", - "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.1.0.tgz", + "integrity": "sha512-pRP5cLIzN7I7Vp6mHKRSaZD7YpBTK7hawx5si8trMKqk4+WOdK8NEKOTO2G8PKWD1HbKMVckVB6/XHh/olhf2g==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -3532,12 +3492,6 @@ "@types/node": "*" } }, - "node_modules/@types/parsimmon": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.6.tgz", - "integrity": "sha512-FwAQwMRbkhx0J6YELkwIpciVzCcgEqXEbIrIn3a2P5d3kGEHQ3wVhlN3YdVepYP+bZzCYO6OjmD4o9TGOZ40rA==", - "dev": true - }, "node_modules/@types/prettier": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", @@ -3994,50 +3948,6 @@ "node": ">=0.10.0" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "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" - } - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4169,15 +4079,6 @@ "node": ">=8" } }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -4208,15 +4109,6 @@ "util": "^0.12.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -4318,101 +4210,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "node_modules/babel-code-frame/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-code-frame/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/babel-jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", - "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.1.0.tgz", + "integrity": "sha512-6NrdqzaYemALGCuR97QkC/FkFIEBWP5pw5TMJoUHZTVXyOgocujp6A0JE2V6gE0HtqAAv6VKU/nI+OCR1Z4gHA==", "dev": true, "dependencies": { - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^27.0.6", @@ -4546,6 +4351,15 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/babel-plugin-jsx-pragmatic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-1.0.2.tgz", + "integrity": "sha1-QeK+uGQiNfNLKnqxLKOeByAbjlk=", + "dev": true, + "dependencies": { + "babel-plugin-syntax-jsx": "^6.0.0" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", @@ -4585,6 +4399,12 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -4691,15 +4511,6 @@ } ] }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4730,18 +4541,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "dependencies": { - "inherits": "~2.0.0" - }, - "engines": { - "node": "0.4 || >=0.5.8" - } - }, "node_modules/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -4945,27 +4744,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -5088,12 +4872,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5123,15 +4901,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "node_modules/charm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", - "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1" - } - }, "node_modules/chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -5394,14 +5163,14 @@ } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "node_modules/clone": { @@ -5431,16 +5200,6 @@ "node": ">= 0.12.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -5500,12 +5259,6 @@ "node": ">= 0.8" } }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -5544,76 +5297,30 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.0.tgz", + "integrity": "sha512-sj9tj3z5cnHaSJCYObA9nISf7eq/YjscLPoq6nmew4SiOjxqL2KRpK20fjnjVbpNDjJ2HR3MoVcWKXwbVvzS0A==", "dev": true, - "engines": [ - "node >= 0.8" - ], "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "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" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.0.tgz", - "integrity": "sha512-sj9tj3z5cnHaSJCYObA9nISf7eq/YjscLPoq6nmew4SiOjxqL2KRpK20fjnjVbpNDjJ2HR3MoVcWKXwbVvzS0A==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/convert-source-map": { @@ -6023,18 +5730,6 @@ "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-uri-to-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", @@ -6075,15 +5770,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", @@ -6197,13 +5883,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -6241,15 +5920,6 @@ "node": ">=8" } }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", @@ -6406,108 +6076,10 @@ "node": ">=8" } }, - "node_modules/dts-critic": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.3.9.tgz", - "integrity": "sha512-kI8QE+gvvWP9r/57KtSzJ78jBKAccOkSBQLqcif/8K7LbM+zlpJPDKAE0fI436fYej9/aL9ILsoKMc5hE0lwSg==", - "dev": true, - "dependencies": { - "@definitelytyped/header-parser": "latest", - "command-exists": "^1.2.8", - "rimraf": "^3.0.2", - "semver": "^6.2.0", - "tmp": "^0.2.1", - "yargs": "^15.3.1" - }, - "engines": { - "node": ">=10.17.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/dtslint": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-4.1.5.tgz", - "integrity": "sha512-fsuFGA2F9PBZTviMOH35m60KGkTt9ZugfVfOWKIz+l97epnWEcUI0xwHsI4z5j12dSlt3/N1qBJOr/IA34VfJw==", - "dev": true, - "dependencies": { - "@definitelytyped/header-parser": "latest", - "@definitelytyped/typescript-versions": "latest", - "@definitelytyped/utils": "latest", - "dts-critic": "latest", - "fs-extra": "^6.0.1", - "json-stable-stringify": "^1.0.1", - "strip-json-comments": "^2.0.1", - "tslint": "5.14.0", - "tsutils": "^2.29.0", - "yargs": "^15.1.0" - }, - "bin": { - "dtslint": "bin/index.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">= 3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.7.0-dev || >= 3.8.0-dev || >= 3.9.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/dtslint/node_modules/fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/dtslint/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dtslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/dtslint/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/electron-to-chromium": { - "version": "1.3.819", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.819.tgz", - "integrity": "sha512-vH3jJLd+tMwrQcYlZJUSjUMlq2JacHuIKl4rT0ZEAdY1Lxk95dBg+rc69ahIPGdKPPWgaN4wjt2f0BopFF3wjQ==", + "version": "1.3.820", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.820.tgz", + "integrity": "sha512-5cFwDmo2yzEA9hn55KZ9+cX/b6DSFvpKz8Hb2fiDmriXWB+DBoXKXmncQwNRFBBTlUdsvPHCoy594OoMLAO0Tg==", "dev": true }, "node_modules/elliptic": { @@ -7351,18 +6923,6 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7644,16 +7204,16 @@ "optional": true }, "node_modules/expect": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", - "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.1.0.tgz", + "integrity": "sha512-9kJngV5hOJgkFil4F/uXm3hVBubUK2nERVfvqNNwxxuW8ZOUwSTTSysgfzckYtv/LBzj/LJXbiAF7okHCXgdug==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "ansi-styles": "^5.0.0", "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", "jest-regex-util": "^27.0.6" }, "engines": { @@ -7672,12 +7232,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -7705,18 +7259,6 @@ "node": ">=4" } }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -7750,15 +7292,6 @@ "node": ">=0.10.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8004,15 +7537,6 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -8053,12 +7577,6 @@ "node": ">=0.10.0" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -8099,33 +7617,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -8146,74 +7637,6 @@ "node": ">=8" } }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8298,15 +7721,6 @@ "node": ">=0.10.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -8431,29 +7845,6 @@ "node": ">= 10.x" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8466,27 +7857,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", @@ -8532,13 +7902,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -8719,21 +8082,6 @@ "node": ">= 6" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -9567,12 +8915,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -9684,14 +9026,14 @@ } }, "node_modules/jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", - "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.1.0.tgz", + "integrity": "sha512-pSQDVwRSwb109Ss13lcMtdfS9r8/w2Zz8+mTUA9VORD66GflCdl8nUFCqM96geOD2EBwWCNURrNAfQsLIDNBdg==", "dev": true, "dependencies": { - "@jest/core": "^27.0.6", + "@jest/core": "^27.1.0", "import-local": "^3.0.2", - "jest-cli": "^27.0.6" + "jest-cli": "^27.1.0" }, "bin": { "jest": "bin/jest.js" @@ -9709,12 +9051,12 @@ } }, "node_modules/jest-changed-files": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", - "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.1.0.tgz", + "integrity": "sha512-eRcb13TfQw0xiV2E98EmiEgs9a5uaBIqJChyl0G7jR9fCIvGjXovnDS6Zbku3joij4tXYcSK4SE1AXqOlUxjWg==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "execa": "^5.0.0", "throat": "^6.0.1" }, @@ -9723,27 +9065,27 @@ } }, "node_modules/jest-circus": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", - "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.1.0.tgz", + "integrity": "sha512-6FWtHs3nZyZlMBhRf1wvAC5CirnflbGJAY1xssSAnERLiiXQRH+wY2ptBVtXjX4gz4AA2EwRV57b038LmifRbA==", "dev": true, "dependencies": { - "@jest/environment": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.0.6", + "expect": "^27.1.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -9832,21 +9174,21 @@ } }, "node_modules/jest-cli": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", - "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.1.0.tgz", + "integrity": "sha512-h6zPUOUu+6oLDrXz0yOWY2YXvBLk8gQinx4HbZ7SF4V3HzasQf+ncoIbKENUMwXyf54/6dBkYXvXJos+gOHYZw==", "dev": true, "dependencies": { - "@jest/core": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/core": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-config": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "prompts": "^2.0.1", "yargs": "^16.0.3" }, @@ -9896,17 +9238,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9927,105 +9258,52 @@ }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/jest-config": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", - "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.1.0.tgz", + "integrity": "sha512-GMo7f76vMYUA3b3xOdlcKeKQhKcBIgurjERO2hojo0eLkKPGcw7fyIoanH+m6KOP2bLad+fGnF8aWOJYxzNPeg==", "dev": true, "dependencies": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.0.6", - "@jest/types": "^27.0.6", - "babel-jest": "^27.0.6", + "@jest/test-sequencer": "^27.1.0", + "@jest/types": "^27.1.0", + "babel-jest": "^27.1.0", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "is-ci": "^3.0.0", - "jest-circus": "^27.0.6", - "jest-environment-jsdom": "^27.0.6", - "jest-environment-node": "^27.0.6", + "jest-circus": "^27.1.0", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.0.6", + "jest-jasmine2": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-runner": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "micromatch": "^4.0.4", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10168,15 +9446,15 @@ } }, "node_modules/jest-diff": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", - "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.0.tgz", + "integrity": "sha512-rjfopEYl58g/SZTsQFmspBODvMSytL16I+cirnScWTLkQVXYVZfxm78DFfdIIXc05RCYuGjxJqrdyG4PIFzcJg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10265,16 +9543,16 @@ } }, "node_modules/jest-each": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", - "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.1.0.tgz", + "integrity": "sha512-K/cNvQlmDqQMRHF8CaQ0XPzCfjP5HMJc2bIJglrIqI9fjwpNqITle63IWE+wq4p+3v+iBgh7Wq0IdGpLx5xjDg==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6" + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10351,17 +9629,17 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", - "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.1.0.tgz", + "integrity": "sha512-JbwOcOxh/HOtsj56ljeXQCUJr3ivnaIlM45F5NBezFLVYdT91N5UofB1ux2B1CATsQiudcHdgTaeuqGXJqjJYQ==", "dev": true, "dependencies": { - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0", "jsdom": "^16.6.0" }, "engines": { @@ -10369,17 +9647,17 @@ } }, "node_modules/jest-environment-node": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", - "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.1.0.tgz", + "integrity": "sha512-JIyJ8H3wVyM4YCXp7njbjs0dIT87yhGlrXCXhDKNIg1OjurXr6X38yocnnbXvvNyqVTqSI4M9l+YfPKueqL1lw==", "dev": true, "dependencies": { - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6" + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10395,12 +9673,12 @@ } }, "node_modules/jest-haste-map": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", - "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.1.0.tgz", + "integrity": "sha512-7mz6LopSe+eA6cTFMf10OfLLqRoIPvmMyz5/OnSXnHO7hB0aDP1iIeLWCXzAcYU5eIJVpHr12Bk9yyq2fTW9vg==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -10408,8 +9686,8 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -10492,28 +9770,28 @@ } }, "node_modules/jest-jasmine2": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", - "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.1.0.tgz", + "integrity": "sha512-Z/NIt0wBDg3przOW2FCWtYjMn3Ip68t0SL60agD/e67jlhTyV3PIF8IzT9ecwqFbeuUSO2OT8WeJgHcalDGFzQ==", "dev": true, "dependencies": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.0.6", + "@jest/environment": "^27.1.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.0.6", + "expect": "^27.1.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", "throat": "^6.0.1" }, "engines": { @@ -10591,28 +9869,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", - "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.1.0.tgz", + "integrity": "sha512-oHvSkz1E80VyeTKBvZNnw576qU+cVqRXUD3/wKXh1zpaki47Qty2xeHg2HKie9Hqcd2l4XwircgNOWb/NiGqdA==", "dev": true, "dependencies": { "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", - "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.1.0.tgz", + "integrity": "sha512-VmAudus2P6Yt/JVBRdTPFhUzlIN8DYJd+et5Rd9QDsO/Z82Z4iwGjo43U8Z+PTiz8CBvKvlb6Fh3oKy39hykkQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.0.6", + "jest-diff": "^27.1.0", "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10689,18 +9967,18 @@ } }, "node_modules/jest-message-util": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", - "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.1.0.tgz", + "integrity": "sha512-Eck8NFnJ5Sg36R9XguD65cf2D5+McC+NF5GIdEninoabcuoOfWrID5qJhufq5FB0DRKoiyxB61hS7MKoMD0trQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.0.6", + "pretty-format": "^27.1.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -10846,12 +10124,12 @@ } }, "node_modules/jest-mock": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", - "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.1.0.tgz", + "integrity": "sha512-iT3/Yhu7DwAg/0HvvLCqLvrTKTRMyJlrrfJYWzuLSf9RCAxBoIXN3HoymZxMnYsC3eD8ewGbUa9jUknwBenx2w==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/node": "*" }, "engines": { @@ -10885,18 +10163,19 @@ } }, "node_modules/jest-resolve": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", - "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.1.0.tgz", + "integrity": "sha512-TXvzrLyPg0vLOwcWX38ZGYeEztSEmW+cQQKqc4HKDUwun31wsBXwotRlUz4/AYU/Fq4GhbMd/ileIWZEtcdmIA==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "escalade": "^3.1.1", "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "resolve": "^1.20.0", "slash": "^3.0.0" }, @@ -10905,14 +10184,14 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", - "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.0.tgz", + "integrity": "sha512-Kq5XuDAELuBnrERrjFYEzu/A+i2W7l9HnPWqZEeKGEQ7m1R+6ndMbdXCVCx29Se1qwLZLgvoXwinB3SPIaitMQ==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.0.6" + "jest-snapshot": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -10998,31 +10277,31 @@ } }, "node_modules/jest-runner": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", - "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.1.0.tgz", + "integrity": "sha512-ZWPKr9M5w5gDplz1KsJ6iRmQaDT/yyAFLf18fKbb/+BLWsR1sCNC2wMT0H7pP3gDcBz0qZ6aJraSYUNAGSJGaw==", "dev": true, "dependencies": { - "@jest/console": "^27.0.6", - "@jest/environment": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.0.6", - "jest-environment-node": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-leak-detector": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-leak-detector": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -11101,34 +10380,35 @@ } }, "node_modules/jest-runtime": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", - "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.1.0.tgz", + "integrity": "sha512-okiR2cpGjY0RkWmUGGado6ETpFOi9oG3yV0CioYdoktkVxy5Hv0WRLWnJFuArSYS8cHMCNcceUUMGiIfgxCO9A==", "dev": true, "dependencies": { - "@jest/console": "^27.0.6", - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/globals": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/globals": "^27.1.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-mock": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.0.3" @@ -11168,17 +10448,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runtime/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -11227,59 +10496,6 @@ "node": ">=8" } }, - "node_modules/jest-runtime/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-runtime/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-runtime/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-serializer": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", @@ -11294,9 +10510,9 @@ } }, "node_modules/jest-snapshot": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", - "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.1.0.tgz", + "integrity": "sha512-eaeUBoEjuuRwmiRI51oTldUsKOohB1F6fPqWKKILuDi/CStxzp2IWekVUXbuHHoz5ik33ioJhshiHpgPFbYgcA==", "dev": true, "dependencies": { "@babel/core": "^7.7.2", @@ -11305,23 +10521,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.0.6", + "expect": "^27.1.0", "graceful-fs": "^4.2.4", - "jest-diff": "^27.0.6", + "jest-diff": "^27.1.0", "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-util": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", "natural-compare": "^1.4.0", - "pretty-format": "^27.0.6", + "pretty-format": "^27.1.0", "semver": "^7.3.2" }, "engines": { @@ -11414,12 +10630,12 @@ } }, "node_modules/jest-util": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", - "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.1.0.tgz", + "integrity": "sha512-edSLD2OneYDKC6gZM1yc+wY/877s/fuJNoM1k3sOEpzFyeptSmke3SLnk1dDHk9CgTA+58mnfx3ew3J11Kes/w==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -11501,17 +10717,17 @@ } }, "node_modules/jest-validate": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", - "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.1.0.tgz", + "integrity": "sha512-QiJ+4XuSuMsfPi9zvdO//IrSRSlG6ybJhOpuqYSsuuaABaNT84h0IoD6vvQhThBOKT+DIKvl5sTM0l6is9+SRA==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" @@ -11600,17 +10816,17 @@ } }, "node_modules/jest-watcher": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", - "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.1.0.tgz", + "integrity": "sha512-ivaWTrA46aHWdgPDgPypSHiNQjyKnLBpUIHeBaGg11U+pDzZpkffGlcB1l1a014phmG0mHgkOHtOgiqJQM6yKQ==", "dev": true, "dependencies": { - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.0.6", + "jest-util": "^27.1.0", "string-length": "^4.0.1" }, "engines": { @@ -11688,9 +10904,9 @@ } }, "node_modules/jest-worker": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", - "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.0.tgz", + "integrity": "sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==", "dev": true, "dependencies": { "@types/node": "*", @@ -11767,12 +10983,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "node_modules/jsdom": { "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", @@ -11854,39 +11064,18 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "dependencies": { - "jsonify": "~0.0.0" - } - }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -11914,30 +11103,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "node_modules/keyv": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", @@ -12544,18 +11709,6 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/mri": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", @@ -12633,17 +11786,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/msw/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/msw/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -12695,32 +11837,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/msw/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/msw/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/msw/node_modules/yargs": { "version": "17.1.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", @@ -12739,15 +11855,6 @@ "node": ">=12" } }, - "node_modules/msw/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/multimatch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", @@ -13394,58 +12501,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/npm-registry-client": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", - "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.2", - "graceful-fs": "^4.1.6", - "normalize-package-data": "~1.0.1 || ^2.0.0", - "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "once": "^1.3.3", - "request": "^2.74.0", - "retry": "^0.10.0", - "safe-buffer": "^5.1.1", - "semver": "2 >=2.2.1 || 3.x || 4 || 5", - "slide": "^1.1.3", - "ssri": "^5.2.4" - }, - "optionalDependencies": { - "npmlog": "2 || ^3.1.0 || ^4.0.0" - } - }, - "node_modules/npm-registry-client/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -13458,19 +12513,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "node_modules/nth-check": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", @@ -13483,16 +12525,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -13504,15 +12536,6 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -13885,15 +12908,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -13903,16 +12917,6 @@ "node": ">=0.10.0" } }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -14043,12 +13047,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "node_modules/parsimmon": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.18.0.tgz", - "integrity": "sha512-EtVsGuQfDgwGgXzsSDe+5egRPwbcgKRd/omQ1L3Oj2pHy0gYqd+Q7zrBIQ7P/BN6DWUP9vV45HIgZHCmssdzMg==", - "dev": true - }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -14123,12 +13121,6 @@ "node": ">=0.12" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -14416,21 +13408,10 @@ "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/postcss-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/postcss-cli/node_modules/color-convert": { @@ -14496,59 +13477,6 @@ "node": ">=8" } }, - "node_modules/postcss-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/postcss-cli/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-cli/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-cli/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-colormin": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", @@ -15087,12 +14015,12 @@ } }, "node_modules/pretty-format": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", - "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", "dev": true, "dependencies": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" @@ -15356,15 +14284,6 @@ "teleport": ">=0.2.0" } }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/querystring": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", @@ -15864,74 +14783,6 @@ "node": ">=0.10" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15950,12 +14801,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -16034,15 +14879,6 @@ "node": ">=0.12" } }, - "node_modules/retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -16175,12 +15011,6 @@ "semver": "bin/semver.js" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/set-cookie-parser": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", @@ -16340,15 +15170,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -16638,40 +15459,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.1" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -16993,12 +15780,15 @@ } }, "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/styled-jsx": { @@ -17190,34 +15980,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", - "dev": true, - "dependencies": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -17285,15 +16047,15 @@ "dev": true }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "dependencies": { - "rimraf": "^3.0.0" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=8.17.0" + "node": ">=0.6.0" } }, "node_modules/tmpl": { @@ -17502,63 +16264,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tslint": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", - "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" - } - }, - "node_modules/tslint/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -17580,24 +16285,6 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -17631,12 +16318,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -17911,16 +16592,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -17960,15 +16631,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "dependencies": { - "builtins": "^1.0.3" - } - }, "node_modules/vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", @@ -17979,20 +16641,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -18126,12 +16774,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/which-typed-array": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.6.tgz", @@ -18152,63 +16794,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -18219,17 +16804,20 @@ } }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, - "engines": { - "node": ">=8" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -18334,10 +16922,13 @@ } }, "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { "version": "4.0.0", @@ -18354,38 +16945,30 @@ } }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/yocto-queue": { @@ -18402,6 +16985,12 @@ } }, "dependencies": { + "@actions/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.5.0.tgz", + "integrity": "sha512-eDOLH1Nq9zh+PJlYLqEMkS/jLQxhksPNmUGNBHfa4G+tQmnIhzpctxmchETtVGyBOvXgOVVpYuE40+eS4cUnwQ==", + "dev": true + }, "@babel/cli": { "version": "7.14.8", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.8.tgz", @@ -19407,6 +17996,17 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, + "@babel/plugin-transform-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz", + "integrity": "sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + } + }, "@babel/plugin-transform-unicode-escapes": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", @@ -19534,6 +18134,17 @@ "@babel/plugin-transform-react-pure-annotations": "^7.14.5" } }, + "@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + } + }, "@babel/runtime": { "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", @@ -19596,73 +18207,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@definitelytyped/header-parser": { - "version": "0.0.87", - "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.87.tgz", - "integrity": "sha512-fwxajaVUf4mbRWOLwUJFHyscqrrxsaybtBDBgfEr/kB4R25qbQFX2bD7rIf/5UOS7cj9l/dyVbTRxUf1OzofUg==", - "dev": true, - "requires": { - "@definitelytyped/typescript-versions": "^0.0.87", - "@types/parsimmon": "^1.10.1", - "parsimmon": "^1.13.0" - } - }, - "@definitelytyped/typescript-versions": { - "version": "0.0.87", - "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.87.tgz", - "integrity": "sha512-RNXQXmr64eDcoCrAKbk8v2cuj+a/5C0Bz6C2tjSJC1p477pRJMO2AmTKLJZrF8LSbCrTcZx9U5TlkMyjV17WSw==", - "dev": true - }, - "@definitelytyped/utils": { - "version": "0.0.87", - "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.87.tgz", - "integrity": "sha512-R3hZhpHHM82fjPGKf7VMsUA1C2x2hJoxmaWNlts7CMBtW0SMtJHPuEvzJxLCx5jHZDaGHei3K4ziHhOf1BLHFg==", - "dev": true, - "requires": { - "@definitelytyped/typescript-versions": "^0.0.87", - "@types/node": "^14.14.35", - "charm": "^1.0.2", - "fs-extra": "^8.1.0", - "fstream": "^1.0.12", - "npm-registry-client": "^8.6.0", - "tar": "^2.2.2", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "@types/node": { - "version": "14.17.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.12.tgz", - "integrity": "sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -19689,12 +18233,6 @@ "type-fest": "^0.20.2" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -19765,16 +18303,16 @@ "dev": true }, "@jest/console": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", - "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.1.0.tgz", + "integrity": "sha512-+Vl+xmLwAXLNlqT61gmHEixeRbS4L8MUzAjtpBCOPWH+izNI/dR16IeXjkXJdRtIVWVSf9DO1gdp67B1XorZhQ==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^27.0.6", - "jest-util": "^27.0.6", + "jest-message-util": "^27.1.0", + "jest-util": "^27.1.0", "slash": "^3.0.0" }, "dependencies": { @@ -19836,35 +18374,35 @@ } }, "@jest/core": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", - "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.1.0.tgz", + "integrity": "sha512-3l9qmoknrlCFKfGdrmiQiPne+pUR4ALhKwFTYyOeKw6egfDwJkO21RJ1xf41rN8ZNFLg5W+w6+P4fUqq4EMRWA==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/reporters": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/reporters": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^27.0.6", - "jest-config": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-message-util": "^27.0.6", + "jest-changed-files": "^27.1.0", + "jest-config": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-resolve-dependencies": "^27.0.6", - "jest-runner": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", - "jest-watcher": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-resolve-dependencies": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", + "jest-watcher": "^27.1.0", "micromatch": "^4.0.4", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -19973,53 +18511,53 @@ } }, "@jest/environment": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", - "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.1.0.tgz", + "integrity": "sha512-wRp50aAMY2w1U2jP1G32d6FUVBNYqmk8WaGkiIEisU48qyDV0WPtw3IBLnl7orBeggveommAkuijY+RzVnNDOQ==", "dev": true, "requires": { - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", - "jest-mock": "^27.0.6" + "jest-mock": "^27.1.0" } }, "@jest/fake-timers": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", - "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.1.0.tgz", + "integrity": "sha512-22Zyn8il8DzpS+30jJNVbTlm7vAtnfy1aYvNeOEHloMlGy1PCYLHa4PWlSws0hvNsMM5bON6GISjkLoQUV3oMA==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@sinonjs/fake-timers": "^7.0.2", "@types/node": "*", - "jest-message-util": "^27.0.6", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6" + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" } }, "@jest/globals": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", - "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.1.0.tgz", + "integrity": "sha512-73vLV4aNHAlAgjk0/QcSIzzCZSqVIPbmFROJJv9D3QUR7BI4f517gVdJpSrCHxuRH3VZFhe0yGG/tmttlMll9g==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/types": "^27.0.6", - "expect": "^27.0.6" + "@jest/environment": "^27.1.0", + "@jest/types": "^27.1.0", + "expect": "^27.1.0" } }, "@jest/reporters": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", - "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.1.0.tgz", + "integrity": "sha512-5T/zlPkN2HnK3Sboeg64L5eC8iiaZueLpttdktWTJsvALEtP2YMkC5BQxwjRWQACG9SwDmz+XjjkoxXUDMDgdw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -20030,10 +18568,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", @@ -20124,45 +18662,45 @@ } }, "@jest/test-result": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", - "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.1.0.tgz", + "integrity": "sha512-Aoz00gpDL528ODLghat3QSy6UBTD5EmmpjrhZZMK/v1Q2/rRRqTGnFxHuEkrD4z/Py96ZdOHxIWkkCKRpmnE1A==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/types": "^27.1.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", - "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.1.0.tgz", + "integrity": "sha512-lnCWawDr6Z1DAAK9l25o3AjmKGgcutq1iIbp+hC10s/HxnB8ZkUsYq1FzjOoxxZ5hW+1+AthBtvS4x9yno3V1A==", "dev": true, "requires": { - "@jest/test-result": "^27.0.6", + "@jest/test-result": "^27.1.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", - "jest-runtime": "^27.0.6" + "jest-haste-map": "^27.1.0", + "jest-runtime": "^27.1.0" } }, "@jest/transform": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", - "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.1.0.tgz", + "integrity": "sha512-ZRGCA2ZEVJ00ubrhkTG87kyLbN6n55g1Ilq0X9nJb5bX3MhMp3O6M7KG+LvYu+nZRqG5cXsQnJEdZbdpTAV8pQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", + "jest-haste-map": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-util": "^27.0.6", + "jest-util": "^27.1.0", "micromatch": "^4.0.4", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -20277,9 +18815,9 @@ } }, "@jest/types": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", - "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.1.0.tgz", + "integrity": "sha512-pRP5cLIzN7I7Vp6mHKRSaZD7YpBTK7hawx5si8trMKqk4+WOdK8NEKOTO2G8PKWD1HbKMVckVB6/XHh/olhf2g==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -20961,12 +19499,6 @@ "@types/node": "*" } }, - "@types/parsimmon": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.6.tgz", - "integrity": "sha512-FwAQwMRbkhx0J6YELkwIpciVzCcgEqXEbIrIn3a2P5d3kGEHQ3wVhlN3YdVepYP+bZzCYO6OjmD4o9TGOZ40rA==", - "dev": true - }, "@types/prettier": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", @@ -21304,52 +19836,6 @@ } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -21445,15 +19931,6 @@ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -21486,12 +19963,6 @@ "util": "^0.12.0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -21556,85 +20027,14 @@ "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, "babel-jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", - "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.1.0.tgz", + "integrity": "sha512-6NrdqzaYemALGCuR97QkC/FkFIEBWP5pw5TMJoUHZTVXyOgocujp6A0JE2V6gE0HtqAAv6VKU/nI+OCR1Z4gHA==", "dev": true, "requires": { - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.0.0", "babel-preset-jest": "^27.0.6", @@ -21734,6 +20134,15 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-jsx-pragmatic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-1.0.2.tgz", + "integrity": "sha1-QeK+uGQiNfNLKnqxLKOeByAbjlk=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.0.0" + } + }, "babel-plugin-polyfill-corejs2": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", @@ -21764,6 +20173,12 @@ "@babel/helper-define-polyfill-provider": "^0.2.2" } }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, "babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", @@ -21843,15 +20258,6 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -21876,15 +20282,6 @@ "readable-stream": "^3.4.0" } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -22063,24 +20460,12 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -22174,12 +20559,6 @@ "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -22203,15 +20582,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "charm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", - "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", - "dev": true, - "requires": { - "inherits": "^2.0.1" - } - }, "chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -22418,14 +20788,14 @@ "dev": true }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "clone": { @@ -22448,13 +20818,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -22508,12 +20871,6 @@ "delayed-stream": "~1.0.0" } }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true - }, "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -22539,53 +20896,15 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "console-browserify": { "version": "1.2.0", @@ -22593,13 +20912,6 @@ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -22939,15 +21251,6 @@ "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "data-uri-to-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", @@ -22974,12 +21277,6 @@ "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, "decimal.js": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", @@ -23065,13 +21362,6 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -23100,12 +21390,6 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, "diff-sequences": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", @@ -23224,89 +21508,10 @@ "is-obj": "^2.0.0" } }, - "dts-critic": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.3.9.tgz", - "integrity": "sha512-kI8QE+gvvWP9r/57KtSzJ78jBKAccOkSBQLqcif/8K7LbM+zlpJPDKAE0fI436fYej9/aL9ILsoKMc5hE0lwSg==", - "dev": true, - "requires": { - "@definitelytyped/header-parser": "latest", - "command-exists": "^1.2.8", - "rimraf": "^3.0.2", - "semver": "^6.2.0", - "tmp": "^0.2.1", - "yargs": "^15.3.1" - } - }, - "dtslint": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-4.1.5.tgz", - "integrity": "sha512-fsuFGA2F9PBZTviMOH35m60KGkTt9ZugfVfOWKIz+l97epnWEcUI0xwHsI4z5j12dSlt3/N1qBJOr/IA34VfJw==", - "dev": true, - "requires": { - "@definitelytyped/header-parser": "latest", - "@definitelytyped/typescript-versions": "latest", - "@definitelytyped/utils": "latest", - "dts-critic": "latest", - "fs-extra": "^6.0.1", - "json-stable-stringify": "^1.0.1", - "strip-json-comments": "^2.0.1", - "tslint": "5.14.0", - "tsutils": "^2.29.0", - "yargs": "^15.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", - "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "electron-to-chromium": { - "version": "1.3.819", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.819.tgz", - "integrity": "sha512-vH3jJLd+tMwrQcYlZJUSjUMlq2JacHuIKl4rT0ZEAdY1Lxk95dBg+rc69ahIPGdKPPWgaN4wjt2f0BopFF3wjQ==", + "version": "1.3.820", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.820.tgz", + "integrity": "sha512-5cFwDmo2yzEA9hn55KZ9+cX/b6DSFvpKz8Hb2fiDmriXWB+DBoXKXmncQwNRFBBTlUdsvPHCoy594OoMLAO0Tg==", "dev": true }, "elliptic": { @@ -23661,12 +21866,6 @@ "lru-cache": "^6.0.0" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -24150,16 +22349,16 @@ } }, "expect": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", - "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.1.0.tgz", + "integrity": "sha512-9kJngV5hOJgkFil4F/uXm3hVBubUK2nERVfvqNNwxxuW8ZOUwSTTSysgfzckYtv/LBzj/LJXbiAF7okHCXgdug==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "ansi-styles": "^5.0.0", "jest-get-type": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", "jest-regex-util": "^27.0.6" }, "dependencies": { @@ -24171,12 +22370,6 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -24196,17 +22389,6 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } } }, "extglob": { @@ -24238,12 +22420,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -24439,12 +22615,6 @@ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, "form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -24472,12 +22642,6 @@ "map-cache": "^0.2.2" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -24508,29 +22672,6 @@ "dev": true, "optional": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -24548,64 +22689,6 @@ "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.4.2.tgz", "integrity": "sha512-2BggwLEJOTfXzKq4Tl2bIT37p0IqqKkblH4e0cMp2sXTdmwg/ADBKMxvxaEytYYcgdxgng8+acsi3WgMVUl6CQ==" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -24663,15 +22746,6 @@ "dev": true, "optional": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -24765,22 +22839,6 @@ "integrity": "sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -24790,23 +22848,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", @@ -24834,13 +22875,6 @@ "has-symbols": "^1.0.2" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -24986,17 +23020,6 @@ "debug": "4" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -25594,12 +23617,6 @@ "dev": true, "optional": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -25685,49 +23702,49 @@ } }, "jest": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", - "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.1.0.tgz", + "integrity": "sha512-pSQDVwRSwb109Ss13lcMtdfS9r8/w2Zz8+mTUA9VORD66GflCdl8nUFCqM96geOD2EBwWCNURrNAfQsLIDNBdg==", "dev": true, "requires": { - "@jest/core": "^27.0.6", + "@jest/core": "^27.1.0", "import-local": "^3.0.2", - "jest-cli": "^27.0.6" + "jest-cli": "^27.1.0" } }, "jest-changed-files": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", - "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.1.0.tgz", + "integrity": "sha512-eRcb13TfQw0xiV2E98EmiEgs9a5uaBIqJChyl0G7jR9fCIvGjXovnDS6Zbku3joij4tXYcSK4SE1AXqOlUxjWg==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "execa": "^5.0.0", "throat": "^6.0.1" } }, "jest-circus": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", - "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.1.0.tgz", + "integrity": "sha512-6FWtHs3nZyZlMBhRf1wvAC5CirnflbGJAY1xssSAnERLiiXQRH+wY2ptBVtXjX4gz4AA2EwRV57b038LmifRbA==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", - "expect": "^27.0.6", + "expect": "^27.1.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" @@ -25791,21 +23808,21 @@ } }, "jest-cli": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", - "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.1.0.tgz", + "integrity": "sha512-h6zPUOUu+6oLDrXz0yOWY2YXvBLk8gQinx4HbZ7SF4V3HzasQf+ncoIbKENUMwXyf54/6dBkYXvXJos+gOHYZw==", "dev": true, "requires": { - "@jest/core": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/core": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", - "jest-config": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-config": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "prompts": "^2.0.1", "yargs": "^16.0.3" }, @@ -25829,17 +23846,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -25869,74 +23875,36 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, "jest-config": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", - "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.1.0.tgz", + "integrity": "sha512-GMo7f76vMYUA3b3xOdlcKeKQhKcBIgurjERO2hojo0eLkKPGcw7fyIoanH+m6KOP2bLad+fGnF8aWOJYxzNPeg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^27.0.6", - "@jest/types": "^27.0.6", - "babel-jest": "^27.0.6", + "@jest/test-sequencer": "^27.1.0", + "@jest/types": "^27.1.0", + "babel-jest": "^27.1.0", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", "is-ci": "^3.0.0", - "jest-circus": "^27.0.6", - "jest-environment-jsdom": "^27.0.6", - "jest-environment-node": "^27.0.6", + "jest-circus": "^27.1.0", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", "jest-get-type": "^27.0.6", - "jest-jasmine2": "^27.0.6", + "jest-jasmine2": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-runner": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-runner": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "micromatch": "^4.0.4", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "dependencies": { "ansi-styles": { @@ -26034,15 +24002,15 @@ } }, "jest-diff": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", - "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.1.0.tgz", + "integrity": "sha512-rjfopEYl58g/SZTsQFmspBODvMSytL16I+cirnScWTLkQVXYVZfxm78DFfdIIXc05RCYuGjxJqrdyG4PIFzcJg==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "dependencies": { "ansi-styles": { @@ -26106,16 +24074,16 @@ } }, "jest-each": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", - "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.1.0.tgz", + "integrity": "sha512-K/cNvQlmDqQMRHF8CaQ0XPzCfjP5HMJc2bIJglrIqI9fjwpNqITle63IWE+wq4p+3v+iBgh7Wq0IdGpLx5xjDg==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6" + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0" }, "dependencies": { "ansi-styles": { @@ -26170,32 +24138,32 @@ } }, "jest-environment-jsdom": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", - "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.1.0.tgz", + "integrity": "sha512-JbwOcOxh/HOtsj56ljeXQCUJr3ivnaIlM45F5NBezFLVYdT91N5UofB1ux2B1CATsQiudcHdgTaeuqGXJqjJYQ==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6", + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0", "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", - "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.1.0.tgz", + "integrity": "sha512-JIyJ8H3wVyM4YCXp7njbjs0dIT87yhGlrXCXhDKNIg1OjurXr6X38yocnnbXvvNyqVTqSI4M9l+YfPKueqL1lw==", "dev": true, "requires": { - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", - "jest-mock": "^27.0.6", - "jest-util": "^27.0.6" + "jest-mock": "^27.1.0", + "jest-util": "^27.1.0" } }, "jest-get-type": { @@ -26205,12 +24173,12 @@ "dev": true }, "jest-haste-map": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", - "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.1.0.tgz", + "integrity": "sha512-7mz6LopSe+eA6cTFMf10OfLLqRoIPvmMyz5/OnSXnHO7hB0aDP1iIeLWCXzAcYU5eIJVpHr12Bk9yyq2fTW9vg==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -26219,8 +24187,8 @@ "graceful-fs": "^4.2.4", "jest-regex-util": "^27.0.6", "jest-serializer": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", "micromatch": "^4.0.4", "walker": "^1.0.7" }, @@ -26281,28 +24249,28 @@ } }, "jest-jasmine2": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", - "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.1.0.tgz", + "integrity": "sha512-Z/NIt0wBDg3przOW2FCWtYjMn3Ip68t0SL60agD/e67jlhTyV3PIF8IzT9ecwqFbeuUSO2OT8WeJgHcalDGFzQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^27.0.6", + "@jest/environment": "^27.1.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^27.0.6", + "expect": "^27.1.0", "is-generator-fn": "^2.0.0", - "jest-each": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "pretty-format": "^27.0.6", + "jest-each": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "pretty-format": "^27.1.0", "throat": "^6.0.1" }, "dependencies": { @@ -26358,25 +24326,25 @@ } }, "jest-leak-detector": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", - "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.1.0.tgz", + "integrity": "sha512-oHvSkz1E80VyeTKBvZNnw576qU+cVqRXUD3/wKXh1zpaki47Qty2xeHg2HKie9Hqcd2l4XwircgNOWb/NiGqdA==", "dev": true, "requires": { "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" } }, "jest-matcher-utils": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", - "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.1.0.tgz", + "integrity": "sha512-VmAudus2P6Yt/JVBRdTPFhUzlIN8DYJd+et5Rd9QDsO/Z82Z4iwGjo43U8Z+PTiz8CBvKvlb6Fh3oKy39hykkQ==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.0.6", + "jest-diff": "^27.1.0", "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "dependencies": { "ansi-styles": { @@ -26431,18 +24399,18 @@ } }, "jest-message-util": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", - "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.1.0.tgz", + "integrity": "sha512-Eck8NFnJ5Sg36R9XguD65cf2D5+McC+NF5GIdEninoabcuoOfWrID5qJhufq5FB0DRKoiyxB61hS7MKoMD0trQ==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.4", - "pretty-format": "^27.0.6", + "pretty-format": "^27.1.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -26548,12 +24516,12 @@ } }, "jest-mock": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", - "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.1.0.tgz", + "integrity": "sha512-iT3/Yhu7DwAg/0HvvLCqLvrTKTRMyJlrrfJYWzuLSf9RCAxBoIXN3HoymZxMnYsC3eD8ewGbUa9jUknwBenx2w==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/node": "*" } }, @@ -26571,18 +24539,19 @@ "dev": true }, "jest-resolve": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", - "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.1.0.tgz", + "integrity": "sha512-TXvzrLyPg0vLOwcWX38ZGYeEztSEmW+cQQKqc4HKDUwun31wsBXwotRlUz4/AYU/Fq4GhbMd/ileIWZEtcdmIA==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "chalk": "^4.0.0", "escalade": "^3.1.1", "graceful-fs": "^4.2.4", + "jest-haste-map": "^27.1.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "resolve": "^1.20.0", "slash": "^3.0.0" }, @@ -26645,42 +24614,42 @@ } }, "jest-resolve-dependencies": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", - "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.1.0.tgz", + "integrity": "sha512-Kq5XuDAELuBnrERrjFYEzu/A+i2W7l9HnPWqZEeKGEQ7m1R+6ndMbdXCVCx29Se1qwLZLgvoXwinB3SPIaitMQ==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-snapshot": "^27.0.6" + "jest-snapshot": "^27.1.0" } }, "jest-runner": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", - "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.1.0.tgz", + "integrity": "sha512-ZWPKr9M5w5gDplz1KsJ6iRmQaDT/yyAFLf18fKbb/+BLWsR1sCNC2wMT0H7pP3gDcBz0qZ6aJraSYUNAGSJGaw==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/environment": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "jest-docblock": "^27.0.6", - "jest-environment-jsdom": "^27.0.6", - "jest-environment-node": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-leak-detector": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-runtime": "^27.0.6", - "jest-util": "^27.0.6", - "jest-worker": "^27.0.6", + "jest-environment-jsdom": "^27.1.0", + "jest-environment-node": "^27.1.0", + "jest-haste-map": "^27.1.0", + "jest-leak-detector": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-runtime": "^27.1.0", + "jest-util": "^27.1.0", + "jest-worker": "^27.1.0", "source-map-support": "^0.5.6", "throat": "^6.0.1" }, @@ -26737,34 +24706,35 @@ } }, "jest-runtime": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", - "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.1.0.tgz", + "integrity": "sha512-okiR2cpGjY0RkWmUGGado6ETpFOi9oG3yV0CioYdoktkVxy5Hv0WRLWnJFuArSYS8cHMCNcceUUMGiIfgxCO9A==", "dev": true, "requires": { - "@jest/console": "^27.0.6", - "@jest/environment": "^27.0.6", - "@jest/fake-timers": "^27.0.6", - "@jest/globals": "^27.0.6", + "@jest/console": "^27.1.0", + "@jest/environment": "^27.1.0", + "@jest/fake-timers": "^27.1.0", + "@jest/globals": "^27.1.0", "@jest/source-map": "^27.0.6", - "@jest/test-result": "^27.0.6", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/yargs": "^16.0.0", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-haste-map": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-mock": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-mock": "^27.1.0", "jest-regex-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-snapshot": "^27.0.6", - "jest-util": "^27.0.6", - "jest-validate": "^27.0.6", + "jest-resolve": "^27.1.0", + "jest-snapshot": "^27.1.0", + "jest-util": "^27.1.0", + "jest-validate": "^27.1.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", "yargs": "^16.0.3" @@ -26789,17 +24759,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -26835,44 +24794,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -26887,9 +24808,9 @@ } }, "jest-snapshot": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", - "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.1.0.tgz", + "integrity": "sha512-eaeUBoEjuuRwmiRI51oTldUsKOohB1F6fPqWKKILuDi/CStxzp2IWekVUXbuHHoz5ik33ioJhshiHpgPFbYgcA==", "dev": true, "requires": { "@babel/core": "^7.7.2", @@ -26898,23 +24819,23 @@ "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", "@babel/types": "^7.0.0", - "@jest/transform": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/transform": "^27.1.0", + "@jest/types": "^27.1.0", "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^27.0.6", + "expect": "^27.1.0", "graceful-fs": "^4.2.4", - "jest-diff": "^27.0.6", + "jest-diff": "^27.1.0", "jest-get-type": "^27.0.6", - "jest-haste-map": "^27.0.6", - "jest-matcher-utils": "^27.0.6", - "jest-message-util": "^27.0.6", - "jest-resolve": "^27.0.6", - "jest-util": "^27.0.6", + "jest-haste-map": "^27.1.0", + "jest-matcher-utils": "^27.1.0", + "jest-message-util": "^27.1.0", + "jest-resolve": "^27.1.0", + "jest-util": "^27.1.0", "natural-compare": "^1.4.0", - "pretty-format": "^27.0.6", + "pretty-format": "^27.1.0", "semver": "^7.3.2" }, "dependencies": { @@ -26979,12 +24900,12 @@ } }, "jest-util": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", - "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.1.0.tgz", + "integrity": "sha512-edSLD2OneYDKC6gZM1yc+wY/877s/fuJNoM1k3sOEpzFyeptSmke3SLnk1dDHk9CgTA+58mnfx3ew3J11Kes/w==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -27044,17 +24965,17 @@ } }, "jest-validate": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", - "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.1.0.tgz", + "integrity": "sha512-QiJ+4XuSuMsfPi9zvdO//IrSRSlG6ybJhOpuqYSsuuaABaNT84h0IoD6vvQhThBOKT+DIKvl5sTM0l6is9+SRA==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^27.0.6", "leven": "^3.1.0", - "pretty-format": "^27.0.6" + "pretty-format": "^27.1.0" }, "dependencies": { "ansi-styles": { @@ -27115,17 +25036,17 @@ } }, "jest-watcher": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", - "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.1.0.tgz", + "integrity": "sha512-ivaWTrA46aHWdgPDgPypSHiNQjyKnLBpUIHeBaGg11U+pDzZpkffGlcB1l1a014phmG0mHgkOHtOgiqJQM6yKQ==", "dev": true, "requires": { - "@jest/test-result": "^27.0.6", - "@jest/types": "^27.0.6", + "@jest/test-result": "^27.1.0", + "@jest/types": "^27.1.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^27.0.6", + "jest-util": "^27.1.0", "string-length": "^4.0.1" }, "dependencies": { @@ -27181,9 +25102,9 @@ } }, "jest-worker": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", - "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.0.tgz", + "integrity": "sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==", "dev": true, "requires": { "@types/node": "*", @@ -27238,12 +25159,6 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsdom": { "version": "16.7.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", @@ -27304,39 +25219,18 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -27356,24 +25250,6 @@ "universalify": "^2.0.0" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "keyv": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", @@ -27868,15 +25744,6 @@ } } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "mri": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", @@ -27935,17 +25802,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -27982,23 +25838,6 @@ "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, "yargs": { "version": "17.1.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", @@ -28013,12 +25852,6 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -28547,54 +26380,6 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "npm-registry-client": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", - "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", - "dev": true, - "requires": { - "concat-stream": "^1.5.2", - "graceful-fs": "^4.1.6", - "normalize-package-data": "~1.0.1 || ^2.0.0", - "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "npmlog": "2 || ^3.1.0 || ^4.0.0", - "once": "^1.3.3", - "request": "^2.74.0", - "retry": "^0.10.0", - "safe-buffer": "^5.1.1", - "semver": "2 >=2.2.1 || 3.x || 4 || 5", - "slide": "^1.1.3", - "ssri": "^5.2.4" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -28604,19 +26389,6 @@ "path-key": "^3.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nth-check": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", @@ -28626,13 +26398,6 @@ "boolbase": "^1.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -28644,12 +26409,6 @@ "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=" }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -28925,28 +26684,12 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -29043,12 +26786,6 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, - "parsimmon": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/parsimmon/-/parsimmon-1.18.0.tgz", - "integrity": "sha512-EtVsGuQfDgwGgXzsSDe+5egRPwbcgKRd/omQ1L3Oj2pHy0gYqd+Q7zrBIQ7P/BN6DWUP9vV45HIgZHCmssdzMg==", - "dev": true - }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -29105,12 +26842,6 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -29323,17 +27054,6 @@ "supports-color": "^7.1.0" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -29381,44 +27101,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -29757,12 +27439,12 @@ "dev": true }, "pretty-format": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", - "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "version": "27.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.1.0.tgz", + "integrity": "sha512-4aGaud3w3rxAO6OXmK3fwBFQ0bctIOG3/if+jYEFGNGIs0EvuidQm3bZ9mlP2/t9epLNC/12czabfy7TZNSwVA==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.0", "ansi-regex": "^5.0.0", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" @@ -29962,12 +27644,6 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, "querystring": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", @@ -30361,63 +28037,6 @@ "dev": true, "optional": true }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -30430,12 +28049,6 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -30498,12 +28111,6 @@ "dev": true, "optional": true }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -30600,12 +28207,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "set-cookie-parser": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", @@ -30734,12 +28335,6 @@ } } }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -30994,32 +28589,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -31282,9 +28851,9 @@ } }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "styled-jsx": { @@ -31442,30 +29011,6 @@ } } }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -31521,12 +29066,12 @@ "dev": true }, "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "rimraf": "^3.0.0" + "os-tmpdir": "~1.0.2" } }, "tmpl": { @@ -31693,50 +29238,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "tslint": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.14.0.tgz", - "integrity": "sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -31752,21 +29253,6 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -31788,12 +29274,6 @@ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -32015,12 +29495,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -32056,32 +29530,12 @@ "spdx-expression-parse": "^3.0.0" } }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, "vendors": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -32194,12 +29648,6 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "which-typed-array": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.6.tgz", @@ -32214,53 +29662,6 @@ "is-typed-array": "^1.1.6" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -32268,9 +29669,9 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -32353,9 +29754,9 @@ "dev": true }, "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { @@ -32370,33 +29771,25 @@ "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true }, "yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index 97a5c43a8d..2bbe292534 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "repository": "https://github.com/nextauthjs/next-auth.git", "author": "Iain Collins ", "main": "index.js", - "types": "./index.d.ts", + "module": "index.js", + "types": "index.d.ts", "keywords": [ "react", "nodejs", @@ -20,39 +21,46 @@ "nextauth" ], "exports": { - ".": "./dist/server/index.js", - "./jwt": "./dist/lib/jwt.js", - "./react": "./dist/client/react.js", - "./providers/*": "./dist/providers/*.js" + ".": { + "import": "./index.js" + }, + "./jwt": { + "import": "./jwt/index.js" + }, + "./react": { + "import": "./react/index.js" + }, + "./providers/*": { + "import": "./providers/*.js" + } }, "scripts": { "build": "npm run build:js && npm run build:css", - "build:js": "node ./config/build.js && babel --config-file ./config/babel.config.js src --out-dir dist", - "build:css": "postcss --config config/postcss.config.js src/**/*.css --base src --dir dist && node config/wrap-css.js", + "clean": "rm -rf client css lib providers server jwt react index.d.ts index.js adapters.d.ts", + "build:js": "npm run clean && tsc && babel --config-file ./config/babel.config.js src --out-dir . --extensions \".tsx,.ts,.js,.jsx\"", + "build:css": "postcss --config config/postcss.config.js src/**/*.css --base src --dir . && node config/wrap-css.js", "dev:setup": "npm i && npm run build:css && cd app && npm i", "dev": "cd app && npm run dev", "watch": "npm run watch:js | npm run watch:css", - "watch:js": "babel --config-file ./config/babel.config.js --watch src --out-dir dist", - "watch:css": "postcss --config config/postcss.config.js --watch src/**/*.css --base src --dir dist", + "watch:js": "tsc --watch", + "watch:css": "postcss --config config/postcss.config.js --watch src/**/*.css --base src --dir .", "test": "jest --config ./config/jest.config.js", - "test:ci": "npm run lint && npm run test:types && npm run test -- --ci", - "test:types": "dtslint types --onlyTestTsNext", + "test:ci": "npm run lint && npm run test -- --ci", "prepublishOnly": "npm run build", "lint": "eslint .", "lint:fix": "eslint . --fix", "version:pr": "node ./config/version-pr" }, "files": [ - "dist", - "index.js", - "index.d.ts", + "lib", + "css", + "jwt", + "react", "providers", - "adapters.d.ts", - "react.js", - "react.d.ts", - "jwt.js", - "jwt.d.ts", - "internals" + "server", + "index.d.ts", + "index.js", + "adapters.d.ts" ], "license": "ISC", "dependencies": { @@ -75,27 +83,30 @@ } }, "devDependencies": { + "@actions/core": "^1.4.0", "@babel/cli": "^7.14.5", "@babel/core": "^7.14.6", "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", "@babel/plugin-transform-runtime": "^7.14.5", "@babel/preset-env": "^7.14.7", "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^12.0.0", "@testing-library/react-hooks": "^7.0.1", "@testing-library/user-event": "^13.1.9", - "@types/nodemailer": "^6.4.2", + "@types/nodemailer": "^6.4.4", "@types/oauth": "^0.9.1", - "@types/react": "^17.0.11", - "@typescript-eslint/eslint-plugin": "^4.28.0", - "@typescript-eslint/parser": "^4.28.0", + "@types/react": "^17.0.19", + "@types/react-dom": "^17.0.9", + "@typescript-eslint/eslint-plugin": "^4.29.2", + "@typescript-eslint/parser": "^4.29.2", "autoprefixer": "^10.2.6", "babel-jest": "^27.0.5", + "babel-plugin-jsx-pragmatic": "^1.0.2", "babel-preset-preact": "^2.0.0", "conventional-changelog-conventionalcommits": "4.6.0", "cssnano": "^5.0.6", - "dtslint": "^4.1.0", "eslint": "^7.29.0", "eslint-config-prettier": "^8.3.0", "eslint-config-standard-with-typescript": "^20.0.0", @@ -114,7 +125,7 @@ "pretty-quick": "^3.1.1", "react": "^17.0.2", "react-dom": "^17.0.2", - "typescript": "^4.3.4", + "typescript": "^4.3.5", "whatwg-fetch": "^3.6.2" }, "prettier": { @@ -131,11 +142,12 @@ ], "ignorePatterns": [ "node_modules", - "test", "next-env.d.ts", "types", ".next", - "dist" + "dist", + "/server", + "/react.js" ], "globals": { "localStorage": "readonly", @@ -145,7 +157,9 @@ "rules": { "camelcase": "off", "@typescript-eslint/naming-convention": "off", - "@typescript-eslint/strict-boolean-expressions": "off" + "@typescript-eslint/strict-boolean-expressions": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/restrict-template-expressions": "off" }, "overrides": [ { diff --git a/types/adapters.d.ts b/src/adapters.ts similarity index 70% rename from types/adapters.d.ts rename to src/adapters.ts index 5cc213a8f6..e8f9339cd5 100644 --- a/types/adapters.d.ts +++ b/src/adapters.ts @@ -1,5 +1,4 @@ -import { Account, User } from "." -import { Awaitable } from "./internals/utils" +import { Account, User, Awaitable } from "." export interface AdapterUser extends User { id: string @@ -57,54 +56,54 @@ export interface VerificationToken { * [Create a custom adapter](https://next-auth.js.org/tutorials/creating-a-database-adapter) */ export interface Adapter { - createUser(user: Omit): Awaitable - getUser(id: string): Awaitable - getUserByEmail(email: string): Awaitable + createUser: (user: Omit) => Awaitable + getUser: (id: string) => Awaitable + getUserByEmail: (email: string) => Awaitable /** Using the provider id and the id of the user for a specific account, get the user. */ - getUserByAccount( + getUserByAccount: ( providerAccountId: Pick - ): Awaitable - updateUser(user: Partial): Awaitable + ) => Awaitable + updateUser: (user: Partial) => Awaitable /** @todo Implement */ - deleteUser?( + deleteUser?: ( userId: string - ): Promise | Awaitable - linkAccount( + ) => Promise | Awaitable + linkAccount: ( account: Account - ): Promise | Awaitable + ) => Promise | Awaitable /** @todo Implement */ - unlinkAccount?( + unlinkAccount?: ( providerAccountId: Pick - ): Promise | Awaitable + ) => Promise | Awaitable /** Creates a session for the user and returns it. */ - createSession(session: { + createSession: (session: { sessionToken: string userId: string expires: Date - }): Awaitable - getSessionAndUser( + }) => Awaitable + getSessionAndUser: ( sessionToken: string - ): Awaitable<{ session: AdapterSession; user: AdapterUser } | null> - updateSession( + ) => Awaitable<{ session: AdapterSession; user: AdapterUser } | null> + updateSession: ( session: Partial & Pick - ): Awaitable + ) => Awaitable /** * Deletes a session from the database. * It is preferred that this method also returns the session * that is being deleted for logging purposes. */ - deleteSession( + deleteSession: ( sessionToken: string - ): Promise | Awaitable - createVerificationToken?( + ) => Promise | Awaitable + createVerificationToken?: ( verificationToken: VerificationToken - ): Awaitable + ) => Awaitable /** * Return verification token from the database * and delete it so it cannot be used again. */ - useVerificationToken?(params: { + useVerificationToken?: (params: { identifier: string token: string - }): Awaitable + }) => Awaitable } diff --git a/src/client/__tests__/client-provider.test.js b/src/client/__tests__/client-provider.test.js index e28c8798eb..e7dac687f3 100644 --- a/src/client/__tests__/client-provider.test.js +++ b/src/client/__tests__/client-provider.test.js @@ -2,7 +2,7 @@ import { rest } from "msw" import { render, screen, waitFor } from "@testing-library/react" import { server, mockSession } from "./helpers/mocks" import { printFetchCalls } from "./helpers/utils" -import { SessionProvider, useSession, signOut, getSession } from "../react" +import { SessionProvider, useSession, signOut, getSession } from "../../react" const origDocumentVisibility = document.visibilityState const fetchSpy = jest.spyOn(global, "fetch") diff --git a/src/client/__tests__/csrf.test.js b/src/client/__tests__/csrf.test.js index 134c285489..ef9ca000c8 100644 --- a/src/client/__tests__/csrf.test.js +++ b/src/client/__tests__/csrf.test.js @@ -3,7 +3,7 @@ import userEvent from "@testing-library/user-event" import { render, screen, waitFor } from "@testing-library/react" import { server, mockCSRFToken } from "./helpers/mocks" import logger from "../../lib/logger" -import { getCsrfToken } from "../react" +import { getCsrfToken } from "../../react" import { rest } from "msw" jest.mock("../../lib/logger", () => ({ diff --git a/src/client/__tests__/providers.test.js b/src/client/__tests__/providers.test.js index 3a7476814e..58e37db082 100644 --- a/src/client/__tests__/providers.test.js +++ b/src/client/__tests__/providers.test.js @@ -2,7 +2,7 @@ import { useState } from "react" import userEvent from "@testing-library/user-event" import { render, screen, waitFor } from "@testing-library/react" import { server, mockProviders } from "./helpers/mocks" -import { getProviders } from "../react" +import { getProviders } from "../../react" import logger from "../../lib/logger" import { rest } from "msw" diff --git a/src/client/__tests__/session.test.js b/src/client/__tests__/session.test.js index 82e27b1dbe..44d4a62175 100644 --- a/src/client/__tests__/session.test.js +++ b/src/client/__tests__/session.test.js @@ -3,7 +3,7 @@ import { rest } from "msw" import { server, mockSession } from "./helpers/mocks" import logger from "../../lib/logger" import { useState, useEffect } from "react" -import { getSession } from "../react" +import { getSession } from "../../react" import { getBroadcastEvents } from "./helpers/utils" jest.mock("../../lib/logger", () => ({ diff --git a/src/client/__tests__/sign-in.test.js b/src/client/__tests__/sign-in.test.js index 5be0cb5025..2f243300f7 100644 --- a/src/client/__tests__/sign-in.test.js +++ b/src/client/__tests__/sign-in.test.js @@ -8,7 +8,7 @@ import { mockEmailResponse, mockGithubResponse, } from "./helpers/mocks" -import { signIn } from "../react" +import { signIn } from "../../react" import { rest } from "msw" const { location } = window diff --git a/src/client/__tests__/sign-out.test.js b/src/client/__tests__/sign-out.test.js index 3fea55abfb..5e35724377 100644 --- a/src/client/__tests__/sign-out.test.js +++ b/src/client/__tests__/sign-out.test.js @@ -2,7 +2,7 @@ import { useState } from "react" import userEvent from "@testing-library/user-event" import { render, screen, waitFor } from "@testing-library/react" import { server, mockSignOutResponse } from "./helpers/mocks" -import { signOut } from "../react" +import { signOut } from "../../react" import { rest } from "msw" import { getBroadcastEvents } from "./helpers/utils" diff --git a/src/client/__tests__/use-session-hook.test.js b/src/client/__tests__/use-session-hook.test.js index 7b00ff652c..7fc4d9c8b2 100644 --- a/src/client/__tests__/use-session-hook.test.js +++ b/src/client/__tests__/use-session-hook.test.js @@ -1,7 +1,7 @@ import { rest } from "msw" import { renderHook } from "@testing-library/react-hooks" import { render, waitFor } from "@testing-library/react" -import { SessionProvider, useSession, signOut } from "../react" +import { SessionProvider, useSession, signOut } from "../../react" import { server, mockSession } from "./helpers/mocks" const origConsoleError = console.error diff --git a/src/css/index.js b/src/css/index.ts similarity index 56% rename from src/css/index.js rename to src/css/index.ts index a1021c3dc4..96eba6ca0b 100644 --- a/src/css/index.js +++ b/src/css/index.ts @@ -1,11 +1,11 @@ // To support serverless targets (which don't work if you try to read in things // like CSS files at run time) this file is replaced in production builds with // a function that returns compiled CSS (embedded as a string in the function). -import fs from 'fs' -import path from 'path' +import fs from "fs" +import path from "path" -const pathToCss = path.join(process.cwd(), '/dist/css/index.css') +const pathToCss = path.join(process.cwd(), "/src/css/index.css") -export default function css () { - return fs.readFileSync(pathToCss, 'utf8') +export default function css() { + return fs.readFileSync(pathToCss, "utf8") } diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000000..24402d0e87 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,2 @@ +export { default } from "./server" +export * from "./server/types" diff --git a/src/lib/jwt.js b/src/jwt/index.ts similarity index 83% rename from src/lib/jwt.js rename to src/jwt/index.ts index 6a8545cd39..c38269cabd 100644 --- a/src/lib/jwt.js +++ b/src/jwt/index.ts @@ -1,6 +1,10 @@ import crypto from "crypto" import jose from "jose" -import logger from "./logger" +import logger from "../lib/logger" +import { NextApiRequest } from "next" +import type { JWT, JWTDecodeParams, JWTEncodeParams } from "./types" + +export * from "./types" // Set default algorithm to use for auto-generated signing key const DEFAULT_SIGNATURE_ALGORITHM = "HS512" @@ -28,7 +32,7 @@ export async function encode({ zip: "DEF", }, encryption = DEFAULT_ENCRYPTION_ENABLED, -} = {}) { +}: JWTEncodeParams) { // Signing Key const _signingKey = signingKey ? jose.JWK.asKey(JSON.parse(signingKey)) @@ -65,7 +69,7 @@ export async function decode({ algorithms: [DEFAULT_ENCRYPTION_ALGORITHM], }, encryption = DEFAULT_ENCRYPTION_ENABLED, -} = {}) { +}: JWTDecodeParams): Promise { if (!token) return null let tokenToVerify = token @@ -91,19 +95,26 @@ export async function decode({ : getDerivedSigningKey(secret) // Verify token - return jose.JWT.verify(tokenToVerify, _signingKey, verificationOptions) + return jose.JWT.verify( + tokenToVerify, + _signingKey, + verificationOptions + ) as JWT | null } -/** - * Server-side method to retrieve the JWT from `req`. - * @param {{ - * req: NextApiRequest - * secureCookie?: boolean - * cookieName?: string - * raw?: boolean - * }} params - */ -export async function getToken(params) { +export type GetTokenParams = { + req: NextApiRequest + secureCookie?: boolean + cookieName?: string + raw?: R + decode?: typeof decode + secret?: string +} & Omit + +/** [Documentation](https://next-auth.js.org/tutorials/securing-pages-and-api-routes#using-gettoken) */ +export async function getToken( + params?: GetTokenParams +): Promise { const { req, // Use secure prefix for cookie name, unless URL is NEXTAUTH_URL is http:// @@ -117,7 +128,7 @@ export async function getToken(params) { : "next-auth.session-token", raw = false, decode: _decode = decode, - } = params + } = params ?? {} if (!req) throw new Error("Must pass `req` to JWT getToken()") // Try to get token from cookie @@ -132,12 +143,15 @@ export async function getToken(params) { } if (raw) { + // @ts-expect-error return token } try { - return _decode({ token, ...params }) + // @ts-expect-error + return await _decode({ token, ...params }) } catch { + // @ts-expect-error return null } } @@ -159,6 +173,7 @@ function hkdf(secret, { byteLength, encryptionInfo, digest = "sha256" }) { ) ) } + // eslint-disable-next-line @typescript-eslint/no-var-requires return require("futoin-hkdf")(secret, byteLength, { info: encryptionInfo, hash: digest, diff --git a/types/jwt.d.ts b/src/jwt/types.ts similarity index 65% rename from types/jwt.d.ts rename to src/jwt/types.ts index 0841dc9473..c9a57f122d 100644 --- a/types/jwt.d.ts +++ b/src/jwt/types.ts @@ -1,5 +1,5 @@ -import { JWT as JoseJWT, JWE } from "jose" -import { NextApiRequest } from "./internals/utils" +import type { JWT as JoseJWT, JWE } from "jose" +import { decode, encode } from "." export interface DefaultJWT extends Record { name?: string | null @@ -26,8 +26,6 @@ export interface JWTEncodeParams { encryption?: boolean } -export function encode(params?: JWTEncodeParams): Promise - export interface JWTDecodeParams { token?: string maxAge?: number @@ -41,22 +39,6 @@ export interface JWTDecodeParams { encryption?: boolean } -export function decode(params?: JWTDecodeParams): Promise - -export type GetTokenParams = { - req: NextApiRequest - secureCookie?: boolean - cookieName?: string - raw?: R - decode?: typeof decode - secret?: string -} & Omit - -/** [Documentation](https://next-auth.js.org/tutorials/securing-pages-and-api-routes#using-gettoken) */ -export function getToken( - params?: GetTokenParams -): Promise - export interface JWTOptions { secret: string maxAge: number diff --git a/src/lib/client.ts b/src/lib/client.ts new file mode 100644 index 0000000000..f11411da9e --- /dev/null +++ b/src/lib/client.ts @@ -0,0 +1,106 @@ +import type { IncomingMessage } from "http" +import type { LoggerInstance, Session } from ".." + +export interface NextAuthClientConfig { + baseUrl: string + basePath: string + baseUrlServer: string + basePathServer: string + /** Stores last session response */ + _session?: Session | null | undefined + /** Used for timestamp since last sycned (in seconds) */ + _lastSync: number + /** + * Stores the `SessionProvider`'s session update method to be able to + * trigger session updates from places like `signIn` or `signOut` + */ + _getSession: (...args: any[]) => any +} + +export interface CtxOrReq { + req?: IncomingMessage + ctx?: { req: IncomingMessage } +} + +/** + * If passed 'appContext' via getInitialProps() in _app.js + * then get the req object from ctx and use that for the + * req value to allow `fetchData` to + * work seemlessly in getInitialProps() on server side + * pages *and* in _app.js. + */ +export async function fetchData( + path: string, + __NEXTAUTH: NextAuthClientConfig, + logger: LoggerInstance, + { ctx, req = ctx?.req }: CtxOrReq = {} +): Promise { + try { + const options = req?.headers.cookie + ? { headers: { cookie: req.headers.cookie } } + : {} + const res = await fetch(`${apiBaseUrl(__NEXTAUTH)}/${path}`, options) + const data = await res.json() + if (!res.ok) throw data + return Object.keys(data).length > 0 ? data : null // Return null if data empty + } catch (error) { + logger.error("CLIENT_FETCH_ERROR", { + error, + path, + ...(req ? { header: req.headers } : {}), + }) + return null + } +} + +export function apiBaseUrl(__NEXTAUTH: NextAuthClientConfig) { + if (typeof window === "undefined") { + // Return absolute path when called server side + return `${__NEXTAUTH.baseUrlServer}${__NEXTAUTH.basePathServer}` + } + // Return relative path when called client side + return __NEXTAUTH.basePath +} + +/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */ +export function now() { + return Math.floor(Date.now() / 1000) +} + +export interface BroadcastMessage { + event?: "session" + data?: { trigger?: "signout" | "getSession" } + clientId: string + timestamp: number +} + +/** + * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) + * Only not using it directly, because Safari does not support it. + * + * https://caniuse.com/?search=broadcastchannel + */ +export function BroadcastChannel(name = "nextauth.message") { + return { + /** Get notified by other tabs/windows. */ + receive(onReceive: (message: BroadcastMessage) => void) { + const handler = (event) => { + if (event.key !== name) return + const message: BroadcastMessage = JSON.parse(event.newValue) + if (message?.event !== "session" || !message?.data) return + + onReceive(message) + } + window.addEventListener("storage", handler) + return () => window.removeEventListener("storage", handler) + }, + /** Notify other tabs/windows. */ + post(message) { + if (typeof window === "undefined") return + localStorage.setItem( + name, + JSON.stringify({ ...message, timestamp: now() }) + ) + }, + } +} diff --git a/src/lib/logger.js b/src/lib/logger.ts similarity index 63% rename from src/lib/logger.js rename to src/lib/logger.ts index bec48e534d..bc54dafbc0 100644 --- a/src/lib/logger.js +++ b/src/lib/logger.ts @@ -1,4 +1,4 @@ -import { UnknownError } from "./errors" +import { UnknownError } from "../server/errors" /** Makes sure that error is always serializable */ function formatError(o) { @@ -12,8 +12,31 @@ function formatError(o) { return o } -/** @type {import("types").LoggerInstance} */ -const _logger = { +/** + * Override any of the methods, and the rest will use the default logger. + * + * [Documentation](https://next-auth.js.org/configuration/options#logger) + */ +export interface LoggerInstance { + warn: ( + code: + | "JWT_AUTO_GENERATED_SIGNING_KEY" + | "JWT_AUTO_GENERATED_ENCRYPTION_KEY" + | "NEXTAUTH_URL" + ) => void + error: ( + code: string, + /** + * Either an instance of (JSON serializable) Error + * or an object that contains some debug information. + * (Error is still available through `metadata.error`) + */ + metadata: Error | { error: Error; [key: string]: unknown } + ) => void + debug: (code: string, metadata: unknown) => void +} + +const _logger: LoggerInstance = { error(code, metadata) { metadata = formatError(metadata) console.error( @@ -38,9 +61,8 @@ const _logger = { /** * Override the built-in logger. * Any `undefined` level will use the default logger. - * @param {Partial} newLogger */ -export function setLogger(newLogger = {}) { +export function setLogger(newLogger: Partial = {}) { if (newLogger.error) _logger.error = newLogger.error if (newLogger.warn) _logger.warn = newLogger.warn if (newLogger.debug) _logger.debug = newLogger.debug @@ -48,13 +70,11 @@ export function setLogger(newLogger = {}) { export default _logger -/** - * Serializes client-side log messages and sends them to the server - * @param {import("types").LoggerInstance} logger - * @param {string} basePath - * @return {import("types").LoggerInstance} - */ -export function proxyLogger(logger = _logger, basePath) { +/** Serializes client-side log messages and sends them to the server */ +export function proxyLogger( + logger: LoggerInstance = _logger, + basePath?: string +): LoggerInstance { try { if (typeof window === "undefined") { return logger @@ -77,7 +97,7 @@ export function proxyLogger(logger = _logger, basePath) { return fetch(url, { method: "POST", body, keepalive: true }) } } - return clientLogger + return clientLogger as LoggerInstance } catch { return _logger } diff --git a/src/lib/merge.js b/src/lib/merge.ts similarity index 71% rename from src/lib/merge.js rename to src/lib/merge.ts index 1cd971caba..965a850785 100644 --- a/src/lib/merge.js +++ b/src/lib/merge.ts @@ -1,20 +1,12 @@ // Source: https://stackoverflow.com/a/34749873/5364135 -/** - * Simple object check. - * @param item - * @returns {boolean} - */ -function isObject(item) { +/** Simple object check */ +function isObject(item: any): boolean { return item && typeof item === "object" && !Array.isArray(item) } -/** - * Deep merge two objects. - * @param target - * @param ...sources - */ -export function merge(target, ...sources) { +/** Deep merge two objects */ +export function merge(target: any, ...sources: any[]) { if (!sources.length) return target const source = sources.shift() diff --git a/src/lib/parse-url.js b/src/lib/parse-url.ts similarity index 53% rename from src/lib/parse-url.js rename to src/lib/parse-url.ts index 7fe606f967..fa170c343f 100644 --- a/src/lib/parse-url.js +++ b/src/lib/parse-url.ts @@ -1,27 +1,29 @@ /** - * Simple universal (client/server) function to split host and path + * Simple universal (client/server) function to split host and path. * We use this rather than a library because we need to use the same logic both * client and server side and we only need to parse out the host and path, while * supporting a default value, so a simple split is sufficent. - * @param {string} url + * @todo Use `URL` instead of custom parsing. (Remember: `protocol` is not standard) */ -export default function parseUrl (url) { +export default function parseUrl(url?: string) { // Default values - const defaultHost = 'http://localhost:3000' - const defaultPath = '/api/auth' + const defaultHost = "http://localhost:3000" + const defaultPath = "/api/auth" - if (!url) { url = `${defaultHost}${defaultPath}` } + if (!url) { + url = `${defaultHost}${defaultPath}` + } // Default to HTTPS if no protocol explictly specified - const protocol = url.startsWith('http:') ? 'http' : 'https' + const protocol = url.startsWith("http:") ? "http" : "https" // Normalize URLs by stripping protocol and no trailing slash - url = url.replace(/^https?:\/\//, '').replace(/\/$/, '') + url = url.replace(/^https?:\/\//, "").replace(/\/$/, "") // Simple split based on first / - const [_host, ..._path] = url.split('/') + const [_host, ..._path] = url.split("/") const baseUrl = _host ? `${protocol}://${_host}` : defaultHost - const basePath = _path.length > 0 ? `/${_path.join('/')}` : defaultPath + const basePath = _path.length > 0 ? `/${_path.join("/")}` : defaultPath return { baseUrl, basePath } } diff --git a/types/internals/index.d.ts b/src/lib/types.ts similarity index 59% rename from types/internals/index.d.ts rename to src/lib/types.ts index 35e8bd1c0a..f2ecd7b25d 100644 --- a/types/internals/index.d.ts +++ b/src/lib/types.ts @@ -1,5 +1,6 @@ -import { Awaitable, NextApiRequest, NextApiResponse } from "./utils" -import { +import type { NextApiRequest, NextApiResponse } from "next" + +import type { CallbacksOptions, CookiesOptions, EventCallbacks, @@ -7,16 +8,22 @@ import { PagesOptions, SessionOptions, Theme, + Awaitable, } from ".." -import { Provider } from "../providers" -import { JWTOptions } from "../jwt" -import { Adapter } from "../adapters" +import type { Provider } from "../providers" +import type { JWTOptions } from "../jwt" +import type { Adapter } from "../adapters" + +// Below are types that are only supposed be used by next-auth internally + +/** @internal */ export type InternalProvider = Provider & { signinUrl: string callbackUrl: string } +/** @internal */ export interface InternalOptions< P extends InternalProvider = InternalProvider > { @@ -43,19 +50,23 @@ export interface InternalOptions< pages: Partial jwt: JWTOptions events: Partial - adapter: Adapter + adapter?: Adapter callbacks: CallbacksOptions cookies: CookiesOptions callbackUrl: string } +/** @internal */ export interface NextAuthRequest extends NextApiRequest { options: InternalOptions } -export type NextAuthResponse = NextApiResponse +/** @internal */ +export type NextAuthResponse = NextApiResponse -export type NextAuthApiHandler = ( +/** @internal */ +// eslint-disable-next-line @typescript-eslint/no-invalid-void-type +export type NextAuthApiHandler = ( req: NextAuthRequest, - res: NextAuthResponse -) => Awaitable + res: NextAuthResponse +) => Awaitable diff --git a/src/providers/42.js b/src/providers/42.js index aaa7e5e01b..a479df0c54 100644 --- a/src/providers/42.js +++ b/src/providers/42.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function FortyTwo(options) { return { id: "42-school", diff --git a/src/providers/apple.js b/src/providers/apple.js index c84b74839b..f0f92cb003 100644 --- a/src/providers/apple.js +++ b/src/providers/apple.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Apple(options) { return { id: "apple", diff --git a/src/providers/atlassian.js b/src/providers/atlassian.js index cb8d0aea97..bc8b9456ac 100644 --- a/src/providers/atlassian.js +++ b/src/providers/atlassian.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Atlassian(options) { return { id: "atlassian", diff --git a/src/providers/auth0.js b/src/providers/auth0.ts similarity index 71% rename from src/providers/auth0.js rename to src/providers/auth0.ts index 2a5baff67f..71617a87b7 100644 --- a/src/providers/auth0.js +++ b/src/providers/auth0.ts @@ -1,5 +1,6 @@ -/** @type {import("types/providers").OAuthProvider} */ -export default function Auth0(options) { +import { OAuthConfig, OAuthUserConfig } from "./oauth" + +export default function Auth0(options: OAuthUserConfig): OAuthConfig { return { id: "auth0", name: "Auth0", @@ -8,7 +9,7 @@ export default function Auth0(options) { authorization: { params: { scope: "openid email profile" } }, checks: ["pkce", "state"], idToken: true, - profile(profile) { + profile(profile: any) { return { id: profile.sub, name: profile.nickname, @@ -17,5 +18,5 @@ export default function Auth0(options) { } }, options, - } + } as any } diff --git a/src/providers/azure-ad-b2c.js b/src/providers/azure-ad-b2c.js index 572ba5da88..ae909b8aaa 100644 --- a/src/providers/azure-ad-b2c.js +++ b/src/providers/azure-ad-b2c.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function AzureADB2C(options) { const { tenantName, primaryUserFlow } = options diff --git a/src/providers/azure-ad.js b/src/providers/azure-ad.js index b3ad817b23..539e841b7f 100644 --- a/src/providers/azure-ad.js +++ b/src/providers/azure-ad.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function AzureAD(options) { const tenant = options.tenantId ?? "common" diff --git a/src/providers/battlenet.js b/src/providers/battlenet.js index 186fd62f2a..349790a03d 100644 --- a/src/providers/battlenet.js +++ b/src/providers/battlenet.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function BattleNet(options) { const { region } = options const base = diff --git a/src/providers/box.js b/src/providers/box.js index 3953e8c4c8..da0386bf7c 100644 --- a/src/providers/box.js +++ b/src/providers/box.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Box(options) { return { id: "box", diff --git a/src/providers/bungie.js b/src/providers/bungie.js index 090d101ccf..dc6c998fa2 100644 --- a/src/providers/bungie.js +++ b/src/providers/bungie.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Bungie(options) { return { id: "bungie", diff --git a/src/providers/cognito.js b/src/providers/cognito.js index 9b903b7a77..78f3cb59c7 100644 --- a/src/providers/cognito.js +++ b/src/providers/cognito.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Cognito(options) { return { id: "cognito", diff --git a/src/providers/coinbase.js b/src/providers/coinbase.js index c32876a941..1a2cb1d4a0 100644 --- a/src/providers/coinbase.js +++ b/src/providers/coinbase.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Coinbase(options) { return { id: "coinbase", diff --git a/src/providers/credentials.js b/src/providers/credentials.js deleted file mode 100644 index 9998cf44c7..0000000000 --- a/src/providers/credentials.js +++ /dev/null @@ -1,10 +0,0 @@ -export default function Credentials(options) { - return { - id: "credentials", - name: "Credentials", - type: "credentials", - authorize: null, - credentials: null, - options, - } -} diff --git a/src/providers/credentials.ts b/src/providers/credentials.ts new file mode 100644 index 0000000000..ec5d3f8344 --- /dev/null +++ b/src/providers/credentials.ts @@ -0,0 +1,38 @@ +import { NextApiRequest } from "next" +import { CommonProviderOptions } from "." +import { User, Awaitable } from ".." + +export interface CredentialInput { + label?: string + type?: string + value?: string + placeholder?: string +} + +export interface CredentialsConfig< + C extends Record = {} +> extends CommonProviderOptions { + type: "credentials" + credentials: C + authorize: ( + credentials: Record, + req: NextApiRequest + ) => Awaitable<(Omit | { id?: string }) | null> +} + +export type CredentialsProvider = >( + options: Partial> +) => CredentialsConfig + +export type CredentialsProviderType = "Credentials" + +export default function Credentials( + options: Partial +): CredentialsConfig { + return { + id: "credentials", + name: "Credentials", + type: "credentials", + options, + } as any +} diff --git a/src/providers/discord.js b/src/providers/discord.js index 067d18fc36..3065e8f336 100644 --- a/src/providers/discord.js +++ b/src/providers/discord.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Discord(options) { return { id: "discord", diff --git a/src/providers/dropbox.js b/src/providers/dropbox.js index 76d75d77c2..c26bbf3d83 100644 --- a/src/providers/dropbox.js +++ b/src/providers/dropbox.js @@ -27,6 +27,7 @@ * - [Dropbox Documentation](https://developers.dropbox.com/oauth-guide) * - [Configuration](https://www.dropbox.com/developers/apps) */ +/** @type {import(".").OAuthProvider} */ export default function Dropbox(options) { return { id: "dropbox", diff --git a/src/providers/email.js b/src/providers/email.ts similarity index 61% rename from src/providers/email.js rename to src/providers/email.ts index cbfe0520a8..955e4ee914 100644 --- a/src/providers/email.js +++ b/src/providers/email.ts @@ -1,8 +1,56 @@ -// @ts-check -import nodemailer from "nodemailer" +import { createTransport } from "nodemailer" -/** @type {import("providers").EmailProvider} */ -export default function Email(options) { +import { CommonProviderOptions } from "." +import { Options as SMTPConnectionOptions } from "nodemailer/lib/smtp-connection" +import { Awaitable } from ".." + +export interface EmailConfig extends CommonProviderOptions { + type: "email" + // TODO: Make use of https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html + server: string | SMTPConnectionOptions + /** @default "NextAuth " */ + from?: string + /** + * How long until the e-mail can be used to log the user in, + * in seconds. Defaults to 1 day + * @default 86400 + */ + maxAge?: number + sendVerificationRequest: (params: { + identifier: string + url: string + expires: Date + provider: EmailConfig + token: string + }) => Awaitable + /** + * By default, we are generating a random verification token. + * You can make it predictable or modify it as you like with this method. + * @example + * ```js + * Providers.Email({ + * async generateVerificationToken() { + * return "ABC123" + * } + * }) + * ``` + * [Documentation](https://next-auth.js.org/providers/email#customising-the-verification-token) + */ + generateVerificationToken?: () => Awaitable + /** If defined, it is used to hash the verification token when saving to the database . */ + secret?: string + options: EmailUserConfig +} + +export type EmailUserConfig = Partial> + +export type EmailProvider = (options: EmailUserConfig) => EmailConfig + +// TODO: Rename to Token provider +// when started working on https://github.com/nextauthjs/next-auth/discussions/1465 +export type EmailProviderType = "Email" + +export default function Email(options: EmailUserConfig): EmailConfig { return { id: "email", type: "email", @@ -25,7 +73,7 @@ export default function Email(options) { }) { const { host } = new URL(url) console.log(server) - const transport = nodemailer.createTransport(server) + const transport = createTransport(server) await transport.sendMail({ to: email, from, @@ -39,7 +87,7 @@ export default function Email(options) { } // Email HTML body -function html({ url, host, email }) { +function html({ url, host, email }: Record<"url" | "host" | "email", string>) { // Insert invisible space into domains and email address to prevent both the // email address and the domain from being turned into a hyperlink by email // clients like Outlook and Apple mail, as this is confusing because it seems @@ -90,6 +138,6 @@ function html({ url, host, email }) { } // Email Text body (fallback for email clients that don't render HTML, e.g. feature phones) -function text({ url, host }) { +function text({ url, host }: Record<"url" | "host", string>) { return `Sign in to ${host}\n${url}\n\n` } diff --git a/src/providers/eveonline.js b/src/providers/eveonline.js index 10ef311ffa..f09bde30a8 100644 --- a/src/providers/eveonline.js +++ b/src/providers/eveonline.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function EVEOnline(options) { return { id: "eveonline", diff --git a/src/providers/facebook.js b/src/providers/facebook.ts similarity index 52% rename from src/providers/facebook.js rename to src/providers/facebook.ts index d2c36d4872..3fb89dc318 100644 --- a/src/providers/facebook.js +++ b/src/providers/facebook.ts @@ -1,5 +1,14 @@ -/** @type {import("types/providers").OAuthProvider} */ -export default function Facebook(options) { +import { Profile } from "src" +import { OAuthConfig, OAuthUserConfig } from "./oauth" + +export interface FacebookProfile extends Profile { + id: string + picture: { data: { url: string } } +} + +export default function Facebook

( + options: OAuthUserConfig

+): OAuthConfig

{ return { id: "facebook", name: "Facebook", @@ -10,9 +19,11 @@ export default function Facebook(options) { url: "https://graph.facebook.com/me", // https://developers.facebook.com/docs/graph-api/reference/user/#fields params: { fields: "id,name,email,picture" }, - request({ tokens, client, provider }) { - return client.userinfo(tokens.access_token, { - params: provider.userinfo.params, + async request({ tokens, client, provider }) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return await client.userinfo(tokens.access_token!, { + // @ts-expect-error + params: provider.userinfo?.params, }) }, }, diff --git a/src/providers/faceit.js b/src/providers/faceit.js index 90483d2780..503d2823cf 100644 --- a/src/providers/faceit.js +++ b/src/providers/faceit.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function FACEIT(options) { return { id: "faceit", diff --git a/src/providers/foursquare.js b/src/providers/foursquare.js index e44f2d0969..86c0cc322e 100644 --- a/src/providers/foursquare.js +++ b/src/providers/foursquare.js @@ -1,4 +1,5 @@ -/** @type {import("types/providers").OAuthProvider} */ +/** @type {import("src/providers").OAuthProvider} */ +/** @type {import(".").OAuthProvider} */ export default function Foursquare(options) { const { apiVersion = "20210801" } = options return { diff --git a/src/providers/freshbooks.js b/src/providers/freshbooks.js index 7045eb7807..6301008f06 100644 --- a/src/providers/freshbooks.js +++ b/src/providers/freshbooks.js @@ -1,20 +1,22 @@ +/** @type {import(".").OAuthProvider} */ export default function Freshbooks(options) { return { - id: 'freshbooks', - name: 'Freshbooks', - type: 'oauth', - version: '2.0', - params: { grant_type: 'authorization_code' }, - accessTokenUrl: 'https://api.freshbooks.com/auth/oauth/token', - authorizationUrl: 'https://auth.freshbooks.com/service/auth/oauth/authorize?response_type=code', - profileUrl: 'https://api.freshbooks.com/auth/api/v1/users/me', - async profile(profile) { - return { - id: profile.response.id, - name: `${profile.response.first_name} ${profile.response.last_name}`, - email: profile.response.email, - }; - }, - ...options - }; + id: "freshbooks", + name: "Freshbooks", + type: "oauth", + version: "2.0", + params: { grant_type: "authorization_code" }, + accessTokenUrl: "https://api.freshbooks.com/auth/oauth/token", + authorizationUrl: + "https://auth.freshbooks.com/service/auth/oauth/authorize?response_type=code", + profileUrl: "https://api.freshbooks.com/auth/api/v1/users/me", + async profile(profile) { + return { + id: profile.response.id, + name: `${profile.response.first_name} ${profile.response.last_name}`, + email: profile.response.email, + } + }, + ...options, + } } diff --git a/src/providers/fusionauth.js b/src/providers/fusionauth.js index c916e0565a..83990744a6 100644 --- a/src/providers/fusionauth.js +++ b/src/providers/fusionauth.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function FusionAuth(options) { return { id: "fusionauth", diff --git a/src/providers/github.js b/src/providers/github.js index df14fcd112..0723a45a42 100644 --- a/src/providers/github.js +++ b/src/providers/github.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function GitHub(options) { return { id: "github", diff --git a/src/providers/gitlab.js b/src/providers/gitlab.js index 353fcc7d3a..318d646d4f 100644 --- a/src/providers/gitlab.js +++ b/src/providers/gitlab.js @@ -1,4 +1,5 @@ -/** @type {import("types/providers").OAuthProvider} */ +/** @type {import("src/providers").OAuthProvider} */ +/** @type {import(".").OAuthProvider} */ export default function GitLab(options) { return { id: "gitlab", diff --git a/src/providers/google.js b/src/providers/google.ts similarity index 62% rename from src/providers/google.js rename to src/providers/google.ts index 3d0485cb72..b307d8510b 100644 --- a/src/providers/google.js +++ b/src/providers/google.ts @@ -1,4 +1,14 @@ -export default function Google(options) { +import { Profile } from ".." +import { OAuthConfig, OAuthUserConfig } from "./oauth" + +export interface GoogleProfile extends Profile { + sub: string + picture: string +} + +export default function Google

( + options: OAuthUserConfig +): OAuthConfig

{ return { id: "google", name: "Google", diff --git a/src/providers/identity-server4.js b/src/providers/identity-server4.js index d0ce034f8e..b105712b10 100644 --- a/src/providers/identity-server4.js +++ b/src/providers/identity-server4.js @@ -1,4 +1,4 @@ -/** @return {import("types/providers").OAuthConfig} */ +/** @type {import(".").OAuthProvider} */ export default function IdentityServer4(options) { return { id: "identity-server4", diff --git a/types/providers/index.d.ts b/src/providers/index.ts similarity index 96% rename from types/providers/index.d.ts rename to src/providers/index.ts index 5116df703f..8d7ceb8167 100644 --- a/types/providers/index.d.ts +++ b/src/providers/index.ts @@ -18,6 +18,7 @@ export interface CommonProviderOptions { id: string name: string type: ProviderType + options?: Record } export type Provider = OAuthConfig | EmailConfig | CredentialsConfig diff --git a/src/providers/instagram.js b/src/providers/instagram.js index 2aa1fcdd25..ac16c0e22a 100644 --- a/src/providers/instagram.js +++ b/src/providers/instagram.js @@ -1,5 +1,5 @@ /** - * @type {import("types/providers").OAuthProvider} options + * @type {import("src/providers").OAuthProvider} options * @example * * ```js @@ -24,6 +24,7 @@ * ``` * [NextAuth.js Documentation](https://next-auth.js.org/providers/instagram) | [Instagram Documentation](https://developers.facebook.com/docs/instagram-basic-display-api/getting-started) | [Configuration](https://developers.facebook.com/apps) */ +/** @type {import(".").OAuthProvider} */ export default function Instagram(options) { return { id: "instagram", diff --git a/src/providers/kakao.js b/src/providers/kakao.js index f72acbfced..834642fbd6 100644 --- a/src/providers/kakao.js +++ b/src/providers/kakao.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Kakao(options) { return { id: "kakao", diff --git a/src/providers/keycloak.js b/src/providers/keycloak.js index 8fa9affe24..324eaa41e3 100644 --- a/src/providers/keycloak.js +++ b/src/providers/keycloak.js @@ -1,4 +1,4 @@ -/** @type {import("types/providers").OAuthProvider} */ +/** @type {import("src/providers").OAuthProvider} */ export default function Keycloak(options) { return { id: "keycloak", @@ -13,7 +13,7 @@ export default function Keycloak(options) { id: profile.sub, name: profile.name ?? profile.preferred_username, email: profile.email, - image: null + image: null, } }, options, diff --git a/src/providers/line.js b/src/providers/line.js index d3daeb38e9..27c74eddb1 100644 --- a/src/providers/line.js +++ b/src/providers/line.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function LINE(options) { return { id: "line", diff --git a/src/providers/linkedin.js b/src/providers/linkedin.js index e92db8d8a9..16a898897a 100644 --- a/src/providers/linkedin.js +++ b/src/providers/linkedin.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function LinkedIn(options) { return { id: "linkedin", diff --git a/src/providers/mailchimp.js b/src/providers/mailchimp.js index 1705d7a32b..9b815e4a92 100644 --- a/src/providers/mailchimp.js +++ b/src/providers/mailchimp.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Mailchimp(options) { return { id: "mailchimp", diff --git a/src/providers/mailru.js b/src/providers/mailru.js index c9db73581e..eee3cfd5fe 100644 --- a/src/providers/mailru.js +++ b/src/providers/mailru.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function MailRu(options) { return { id: "mailru", diff --git a/src/providers/medium.js b/src/providers/medium.js index fcb72087af..4ec8792ff0 100644 --- a/src/providers/medium.js +++ b/src/providers/medium.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Medium(options) { return { id: "medium", diff --git a/src/providers/naver.js b/src/providers/naver.js index b1a1979cfb..2b2c7a134b 100644 --- a/src/providers/naver.js +++ b/src/providers/naver.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Naver(options) { return { id: "naver", diff --git a/src/providers/netlify.js b/src/providers/netlify.js index 48b4f79316..7c31aed0bb 100644 --- a/src/providers/netlify.js +++ b/src/providers/netlify.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Netlify(options) { return { id: "netlify", diff --git a/types/providers/oauth.d.ts b/src/providers/oauth.ts similarity index 87% rename from types/providers/oauth.d.ts rename to src/providers/oauth.ts index 7b39940a31..99b7703d77 100644 --- a/types/providers/oauth.d.ts +++ b/src/providers/oauth.ts @@ -1,6 +1,5 @@ -import { CommonProviderOptions } from "." -import { Profile, TokenSet, User } from ".." -import { Awaitable } from "../internals/utils" +import { CommonProviderOptions } from "../providers" +import { Profile, TokenSet, User, Awaitable } from ".." import { AuthorizationParameters, @@ -11,8 +10,8 @@ import { OpenIDCallbackChecks, } from "openid-client" -import { OAuthProviderType } from "./oauth-providers" -export { OAuthProviderType } +// TODO: generate +export type OAuthProviderType = string type ChecksType = "pkce" | "state" | "both" | "none" @@ -74,14 +73,14 @@ export interface OAuthConfig

= Profile> * * [Authorization endpoint](https://datatracker.ietf.org/doc/html/rfc6749#section-3.1) */ - authorization: EndpointHandler + authorization?: EndpointHandler /** * Endpoint that returns OAuth 2/OIDC tokens and information about them. * This includes `access_token`, `id_token`, `refresh_token`, etc. * * [Token endpoint](https://datatracker.ietf.org/doc/html/rfc6749#section-3.2) */ - token: EndpointHandler< + token?: EndpointHandler< UrlParams, { /** @@ -105,13 +104,13 @@ export interface OAuthConfig

= Profile> */ userinfo?: EndpointHandler type: "oauth" - version: string + version?: string accessTokenUrl?: string requestTokenUrl?: string - profile(profile: P, tokens: TokenSet): Awaitable + profile?: (profile: P, tokens: TokenSet) => Awaitable checks?: ChecksType | ChecksType[] - clientId: string - clientSecret: + clientId?: string + clientSecret?: | string // TODO: only allow for Apple | Record<"appleId" | "teamId" | "privateKey" | "keyId", string> @@ -136,7 +135,13 @@ export interface OAuthConfig

= Profile> * We will perform a deep-merge of these values * with the default configuration. */ - options?: Omit, "options"> + options?: OAuthUserConfig

} +export type OAuthUserConfig

= Profile> = Omit< + Partial>, + "options" | "type" +> & + Required, "clientId" | "clientSecret">> + export type OAuthProvider = (options: Partial) => OAuthConfig diff --git a/src/providers/okta.js b/src/providers/okta.js index cf1c1962f2..de7e4abbf9 100644 --- a/src/providers/okta.js +++ b/src/providers/okta.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Okta(options) { return { id: "okta", diff --git a/src/providers/onelogin.js b/src/providers/onelogin.js index a848363cc4..c8593ae661 100644 --- a/src/providers/onelogin.js +++ b/src/providers/onelogin.js @@ -1,4 +1,4 @@ -/** @returns {import("types/providers").OAuthConfig} */ +/** @type {import(".").OAuthProvider} */ export default function OneLogin(options) { return { id: "onelogin", diff --git a/src/providers/osso.js b/src/providers/osso.js index 252104223e..6a1e001b5e 100644 --- a/src/providers/osso.js +++ b/src/providers/osso.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Osso(options) { return { id: "osso", diff --git a/src/providers/reddit.js b/src/providers/reddit.js index 8ce35d2a96..814b32e005 100644 --- a/src/providers/reddit.js +++ b/src/providers/reddit.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Reddit(options) { return { id: "reddit", diff --git a/src/providers/salesforce.js b/src/providers/salesforce.js index f4d07c1a66..40b1a0eca9 100644 --- a/src/providers/salesforce.js +++ b/src/providers/salesforce.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Salesforce(options) { return { id: "salesforce", diff --git a/src/providers/slack.js b/src/providers/slack.js index 7897ab4b74..ecc9fd8150 100644 --- a/src/providers/slack.js +++ b/src/providers/slack.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Slack(options) { return { id: "slack", diff --git a/src/providers/spotify.js b/src/providers/spotify.js index 4873153366..9bc29823fd 100644 --- a/src/providers/spotify.js +++ b/src/providers/spotify.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Spotify(options) { return { id: "spotify", diff --git a/src/providers/strava.js b/src/providers/strava.js index fb17fc8d46..4840930afc 100644 --- a/src/providers/strava.js +++ b/src/providers/strava.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Strava(options) { return { id: "strava", diff --git a/src/providers/twitch.js b/src/providers/twitch.js index df5db03e2c..f56e2a59fd 100644 --- a/src/providers/twitch.js +++ b/src/providers/twitch.js @@ -1,4 +1,4 @@ -/** @return {import("types/providers").OAuthConfig} */ +/** @type {import(".").OAuthProvider} */ export default function Twitch(options) { return { wellKnown: "https://id.twitch.tv/oauth2/.well-known/openid-configuration", diff --git a/src/providers/twitter.js b/src/providers/twitter.js index d343cec5ff..199fdcf6d2 100644 --- a/src/providers/twitter.js +++ b/src/providers/twitter.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Twitter(options) { return { id: "twitter", diff --git a/src/providers/vk.js b/src/providers/vk.js index e56e5d23b5..8530e1e4b8 100644 --- a/src/providers/vk.js +++ b/src/providers/vk.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function VK(options) { const apiVersion = "5.126" // https://vk.com/dev/versions diff --git a/src/providers/wordpress.js b/src/providers/wordpress.js index aedbd53239..22a7288554 100644 --- a/src/providers/wordpress.js +++ b/src/providers/wordpress.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function WordPress(options) { return { id: "wordpress", diff --git a/src/providers/workos.js b/src/providers/workos.js index 90d84f63ae..d5d6378b4b 100644 --- a/src/providers/workos.js +++ b/src/providers/workos.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function WorkOS(options) { const { issuer = "https://api.workos.com/" } = options diff --git a/src/providers/yandex.js b/src/providers/yandex.js index db8a3c1b33..01dd1e98cf 100644 --- a/src/providers/yandex.js +++ b/src/providers/yandex.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Yandex(options) { return { id: "yandex", diff --git a/src/providers/zoho.js b/src/providers/zoho.js index 5136bc2787..27c3eca835 100644 --- a/src/providers/zoho.js +++ b/src/providers/zoho.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Zoho(options) { return { id: "zoho", diff --git a/src/providers/zoom.js b/src/providers/zoom.js index 0c58305c05..0f8f442317 100644 --- a/src/providers/zoom.js +++ b/src/providers/zoom.js @@ -1,3 +1,4 @@ +/** @type {import(".").OAuthProvider} */ export default function Zoom(options) { return { id: "zoom", diff --git a/src/client/react.js b/src/react/index.tsx similarity index 62% rename from src/client/react.js rename to src/react/index.tsx index b7f3f3c568..6efd1bdc36 100644 --- a/src/client/react.js +++ b/src/react/index.tsx @@ -8,10 +8,32 @@ // // We use HTTP POST requests with CSRF Tokens to protect against CSRF attacks. -// eslint-disable-next-line no-use-before-define import * as React from "react" import _logger, { proxyLogger } from "../lib/logger" import parseUrl from "../lib/parse-url" +import { Session } from ".." +import { + BroadcastChannel, + CtxOrReq, + apiBaseUrl, + fetchData, + now, + NextAuthClientConfig, +} from "../lib/client" + +import type { + ClientSafeProvider, + RedirectableProvider, + SessionProviderProps, + SignInAuthorisationParams, + SignInOptions, + SignInResponse, + SignOutParams, + SignOutResponse, + UseSessionOptions, +} from "./types" + +export * from "./types" // This behaviour mirrors the default behaviour for getting the site name that // happens server side in server/index.js @@ -19,17 +41,16 @@ import parseUrl from "../lib/parse-url" // relative URLs are valid in that context and so defaults to empty. // 2. When invoked server side the value is picked up from an environment // variable and defaults to 'http://localhost:3000'. -/** @type {import("types/internals/react").NextAuthConfig} */ -const __NEXTAUTH = { - baseUrl: parseUrl(process.env.NEXTAUTH_URL || process.env.VERCEL_URL).baseUrl, +const __NEXTAUTH: NextAuthClientConfig = { + baseUrl: parseUrl(process.env.NEXTAUTH_URL ?? process.env.VERCEL_URL).baseUrl, basePath: parseUrl(process.env.NEXTAUTH_URL).basePath, baseUrlServer: parseUrl( - process.env.NEXTAUTH_URL_INTERNAL || - process.env.NEXTAUTH_URL || + process.env.NEXTAUTH_URL_INTERNAL ?? + process.env.NEXTAUTH_URL ?? process.env.VERCEL_URL ).baseUrl, basePathServer: parseUrl( - process.env.NEXTAUTH_URL_INTERNAL || process.env.NEXTAUTH_URL + process.env.NEXTAUTH_URL_INTERNAL ?? process.env.NEXTAUTH_URL ).basePath, _lastSync: 0, _session: undefined, @@ -40,19 +61,34 @@ const broadcast = BroadcastChannel() const logger = proxyLogger(_logger, __NEXTAUTH.basePath) -/** @type {import("types/internals/react").SessionContext} */ -const SessionContext = React.createContext() +export type SessionContextValue = R extends true + ? + | { data: Session; status: "authenticated" } + | { data: null; status: "loading" } + : + | { data: Session; status: "authenticated" } + | { data: null; status: "unauthenticated" | "loading" } -export function useSession(options = {}) { - const value = React.useContext(SessionContext) +const SessionContext = React.createContext( + undefined +) - if (process.env.NODE_ENV !== "production" && !value) { +/** + * React Hook that gives you access + * to the logged in user's session data. + * + * [Documentation](https://next-auth.js.org/getting-started/client#usesession) + */ +export function useSession(options: UseSessionOptions) { + // @ts-expect-error Satisfy TS if branch on line below + const value: SessionContextValue = React.useContext(SessionContext) + if (!value && process.env.NODE_ENV !== "production") { throw new Error( "[next-auth]: `useSession` must be wrapped in a " ) } - const { required, onUnauthenticated } = options + const { required, onUnauthenticated } = options ?? {} const requiredAndNotLoading = required && value.status === "unauthenticated" @@ -68,44 +104,95 @@ export function useSession(options = {}) { }, [requiredAndNotLoading, onUnauthenticated]) if (requiredAndNotLoading) { - return { data: value.data, status: "loading" } + return { data: value.data, status: "loading" } as const } return value } -export async function getSession(ctx) { - const session = await _fetchData("session", ctx) +export type GetSessionParams = CtxOrReq & { + event?: "storage" | "timer" | "hidden" | string + triggerEvent?: boolean + broadcast?: boolean +} - if (ctx?.broadcast ?? true) { +export async function getSession(params?: GetSessionParams) { + const session = await fetchData( + "session", + __NEXTAUTH, + logger, + params + ) + if (params?.broadcast ?? true) { broadcast.post({ event: "session", data: { trigger: "getSession" } }) } return session } -export async function getCsrfToken(ctx) { - const response = await _fetchData("csrf", ctx) +/** + * Returns the current Cross Site Request Forgery Token (CSRF Token) + * required to make POST requests (e.g. for signing in and signing out). + * You likely only need to use this if you are not using the built-in + * `signIn()` and `signOut()` methods. + * + * [Documentation](https://next-auth.js.org/getting-started/client#getcsrftoken) + */ +export async function getCsrfToken(params?: CtxOrReq) { + const response = await fetchData<{ csrfToken: string }>( + "csrf", + __NEXTAUTH, + logger, + params + ) return response?.csrfToken } +/** + * It calls `/api/auth/providers` and returns + * a list of the currently configured authentication providers. + * It can be useful if you are creating a dynamic custom sign in page. + * + * [Documentation](https://next-auth.js.org/getting-started/client#getproviders) + */ export async function getProviders() { - return await _fetchData("providers") + return await fetchData>( + "providers", + __NEXTAUTH, + logger + ) } -export async function signIn(provider, options = {}, authorizationParams = {}) { - const { callbackUrl = window.location.href, redirect = true } = options - - const baseUrl = _apiBaseUrl() +/** + * Client-side method to initiate a signin flow + * or send the user to the signin page listing all possible providers. + * Automatically adds the CSRF token to the request. + * + * [Documentation](https://next-auth.js.org/getting-started/client#signin) + */ +export async function signIn< + P extends RedirectableProvider | undefined = undefined +>( + provider?: RedirectableProvider, + options?: SignInOptions, + authorizationParams?: SignInAuthorisationParams +): Promise< + P extends RedirectableProvider ? SignInResponse | undefined : undefined +> { + const { callbackUrl = window.location.href, redirect = true } = options ?? {} + + const baseUrl = apiBaseUrl(__NEXTAUTH) const providers = await getProviders() if (!providers) { - return window.location.replace(`${baseUrl}/error`) + window.location.replace(`${baseUrl}/error`) + return } - if (!(provider in providers)) { - return window.location.replace( + if (!provider || !(provider in providers)) { + window.location.replace( `${baseUrl}/signin?${new URLSearchParams({ callbackUrl })}` ) + return } const isCredentials = providers[provider].type === "credentials" @@ -123,6 +210,7 @@ export async function signIn(provider, options = {}, authorizationParams = {}) { headers: { "Content-Type": "application/x-www-form-urlencoded", }, + // @ts-expect-error body: new URLSearchParams({ ...options, csrfToken: await getCsrfToken(), @@ -152,34 +240,42 @@ export async function signIn(provider, options = {}, authorizationParams = {}) { status: res.status, ok: res.ok, url: error ? null : data.url, - } + } as any } -export async function signOut(options = {}) { - const { callbackUrl = window.location.href, redirect = true } = options - const baseUrl = _apiBaseUrl() +/** + * Signs the user out, by removing the session cookie. + * Automatically adds the CSRF token to the request. + * + * [Documentation](https://next-auth.js.org/getting-started/client#signout) + */ +export async function signOut( + options?: SignOutParams +): Promise { + const { callbackUrl = window.location.href } = options ?? {} + const baseUrl = apiBaseUrl(__NEXTAUTH) const fetchOptions = { method: "post", headers: { "Content-Type": "application/x-www-form-urlencoded", }, + // @ts-expect-error body: new URLSearchParams({ csrfToken: await getCsrfToken(), callbackUrl, json: true, }), } - const res = await fetch(`${baseUrl}/signout`, fetchOptions) const data = await res.json() - broadcast.post({ event: "session", data: { trigger: "signout" } }) - if (redirect) { + if (options?.redirect ?? true) { const url = data.url ?? callbackUrl window.location.replace(url) // If url contains a hash, the browser does not reload the page. We reload manually if (url.includes("#")) window.location.reload() + // @ts-expect-error return } @@ -188,8 +284,14 @@ export async function signOut(options = {}) { return data } -/** @param {import("types/react-client").SessionProviderProps} props */ -export function SessionProvider(props) { +/** + * Provider to wrap the app in to make session data available globally. + * Can also be used to throttle the number of requests to the endpoint + * `/api/auth/session`. + * + * [Documentation](https://next-auth.js.org/getting-started/client#sessionprovider) + */ +export function SessionProvider(props: SessionProviderProps) { const { children, basePath } = props if (basePath) __NEXTAUTH.basePath = basePath @@ -201,7 +303,7 @@ export function SessionProvider(props) { const hasInitialSession = props.session !== undefined /** If session was passed, initialize as already synced */ - __NEXTAUTH._lastSync = hasInitialSession ? _now() : 0 + __NEXTAUTH._lastSync = hasInitialSession ? now() : 0 const [session, setSession] = React.useState(() => { if (hasInitialSession) __NEXTAUTH._session = props.session @@ -218,7 +320,7 @@ export function SessionProvider(props) { // We should always update if we don't have a client session yet // or if there are events from other tabs/windows if (storageEvent || __NEXTAUTH._session === undefined) { - __NEXTAUTH._lastSync = _now() + __NEXTAUTH._lastSync = now() __NEXTAUTH._session = await getSession({ broadcast: !storageEvent, }) @@ -237,13 +339,13 @@ export function SessionProvider(props) { // event anyway) __NEXTAUTH._session === null || // Bail out early if the client session is not stale yet - _now() < __NEXTAUTH._lastSync + now() < __NEXTAUTH._lastSync ) { return } // An event or session staleness occurred, update the client session. - __NEXTAUTH._lastSync = _now() + __NEXTAUTH._lastSync = now() __NEXTAUTH._session = await getSession() setSession(__NEXTAUTH._session) } catch (error) { @@ -266,8 +368,8 @@ export function SessionProvider(props) { // on how the session object is being used in the client; it is // more robust to have each window/tab fetch it's own copy of the // session object rather than share it across instances. - const unsubscribe = broadcast.receive( - async () => await __NEXTAUTH._getSession({ event: "storage" }) + const unsubscribe = broadcast.receive(() => + __NEXTAUTH._getSession({ event: "storage" }) ) return () => unsubscribe() @@ -280,7 +382,6 @@ export function SessionProvider(props) { if (document.visibilityState === "visible") __NEXTAUTH._getSession({ event: "visibilitychange" }) } - document.addEventListener("visibilitychange", visibilityHandler, false) return () => document.removeEventListener("visibilitychange", visibilityHandler, false) @@ -290,16 +391,16 @@ export function SessionProvider(props) { const { refetchInterval } = props // Set up polling if (refetchInterval) { - const refetchIntervalTimer = setInterval(async () => { + const refetchIntervalTimer = setInterval(() => { if (__NEXTAUTH._session) { - await __NEXTAUTH._getSession({ event: "poll" }) + __NEXTAUTH._getSession({ event: "poll" }) } }, refetchInterval * 1000) return () => clearInterval(refetchIntervalTimer) } }, [props.refetchInterval]) - const value = React.useMemo( + const value: any = React.useMemo( () => ({ data: session, status: loading @@ -315,76 +416,3 @@ export function SessionProvider(props) { {children} ) } - -/** - * If passed 'appContext' via getInitialProps() in _app.js - * then get the req object from ctx and use that for the - * req value to allow _fetchData to - * work seamlessly in getInitialProps() on server side - * pages *and* in _app.js. - */ -async function _fetchData(path, { ctx, req = ctx?.req } = {}) { - try { - const options = req ? { headers: { cookie: req.headers.cookie } } : {} - const res = await fetch(`${_apiBaseUrl()}/${path}`, options) - const data = await res.json() - if (!res.ok) throw data - return Object.keys(data).length > 0 ? data : null // Return null if data empty - } catch (error) { - logger.error("CLIENT_FETCH_ERROR", { - error, - path, - ...(req ? { header: req.headers } : {}), - }) - return null - } -} - -function _apiBaseUrl() { - if (typeof window === "undefined") { - // Return absolute path when called server side - return `${__NEXTAUTH.baseUrlServer}${__NEXTAUTH.basePathServer}` - } - // Return relative path when called client side - return __NEXTAUTH.basePath -} - -/** Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC. */ -function _now() { - return Math.floor(Date.now() / 1000) -} - -/** - * Inspired by [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) - * Only not using it directly, because Safari does not support it. - * - * https://caniuse.com/?search=broadcastchannel - */ -function BroadcastChannel(name = "nextauth.message") { - return { - /** - * Get notified by other tabs/windows. - * @param {(message: import("types/internals/react").BroadcastMessage) => void} onReceive - */ - receive(onReceive) { - const handler = (event) => { - if (event.key !== name) return - /** @type {import("types/internals/react").BroadcastMessage} */ - const message = JSON.parse(event.newValue) - if (message?.event !== "session" || !message?.data) return - - onReceive(message) - } - window.addEventListener("storage", handler) - return () => window.removeEventListener("storage", handler) - }, - /** Notify other tabs/windows. */ - post(message) { - if (typeof window === "undefined") return - localStorage.setItem( - name, - JSON.stringify({ ...message, timestamp: _now() }) - ) - }, - } -} diff --git a/src/react/types.ts b/src/react/types.ts new file mode 100644 index 0000000000..faab918fdb --- /dev/null +++ b/src/react/types.ts @@ -0,0 +1,67 @@ +import type { Session } from ".." +import type { ProviderType } from "../providers" + +export interface UseSessionOptions { + required: R + /** Defaults to `signIn` */ + onUnauthenticated?: () => void +} + +export type RedirectableProvider = "email" | "credentials" + +export interface ClientSafeProvider { + id: string + name: string + type: ProviderType + signinUrl: string + callbackUrl: string +} + +export interface SignInOptions extends Record { + /** + * Defaults to the current URL. + * @docs https://next-auth.js.org/getting-started/client#specifying-a-callbackurl + */ + callbackUrl?: string + /** @docs https://next-auth.js.org/getting-started/client#using-the-redirect-false-option */ + redirect?: boolean +} + +export interface SignInResponse { + error: string | undefined + status: number + ok: boolean + url: string | null +} + +/** Match `inputType` of `new URLSearchParams(inputType)` */ +export type SignInAuthorisationParams = + | string + | string[][] + | Record + | URLSearchParams + +/** @docs https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */ +export interface SignOutResponse { + url: string +} + +export interface SignOutParams { + /** @docs https://next-auth.js.org/getting-started/client#specifying-a-callbackurl-1 */ + callbackUrl?: string + /** @docs https://next-auth.js.org/getting-started/client#using-the-redirect-false-option-1 */ + redirect?: R +} + +/** @docs: https://next-auth.js.org/getting-started/client#options */ +export interface SessionProviderProps { + children: React.ReactNode + session?: Session | null + baseUrl?: string + basePath?: string + /** + * A time interval (in seconds) after which the session will be re-fetched. + * If set to `0` (default), the session is not polled. + */ + refetchInterval?: number +} diff --git a/src/lib/errors.js b/src/server/errors.ts similarity index 56% rename from src/lib/errors.js rename to src/server/errors.ts index cf3823277a..4281ca38a8 100644 --- a/src/lib/errors.js +++ b/src/server/errors.ts @@ -1,3 +1,6 @@ +import { EventCallbacks, LoggerInstance } from ".." +import { Adapter } from "../adapters" + /** * Same as the default `Error`, but it is JSON serializable. * @source https://iaincollins.medium.com/error-handling-in-javascript-a6172ccdf9af @@ -33,55 +36,56 @@ export class AccountNotLinkedError extends UnknownError { name = "AccountNotLinkedError" } -export function upperSnake(s) { +type Method = (...args: any[]) => Promise + +export function upperSnake(s: string) { return s.replace(/([A-Z])/g, "_$1").toUpperCase() } -export function capitalize(s) { +export function capitalize(s: string) { return `${s[0].toUpperCase()}${s.slice(1)}` } /** * Wraps an object of methods and adds error handling. - * @param {import("types").EventCallbacks} methods - * @param {import("types").LoggerInstance} logger - * @return {import("types").EventCallbacks} */ -export function eventsErrorHandler(methods, logger) { - return Object.entries(methods).reduce((acc, [name, method]) => { - acc[name] = async (...args) => { +export function eventsErrorHandler( + methods: Partial, + logger: LoggerInstance +): Partial { + return Object.keys(methods).reduce((acc, name) => { + acc[name] = async (...args: any[]) => { try { + const method: Method = methods[name] return await method(...args) } catch (e) { logger.error(`${upperSnake(name)}_EVENT_ERROR`, e) } } return acc - }, {}) + }, methods) } -/** - * Handles adapter induced errors. - * @param {import("types/adapters").Adapter} [adapter] - * @param {import("types").LoggerInstance} logger - * @return {import("types/adapters").Adapter} - */ -export function adapterErrorHandler(adapter, logger) { +/** Handles adapter induced errors. */ +export function adapterErrorHandler( + adapter: Adapter | undefined, + logger: LoggerInstance +): Adapter | undefined { if (!adapter) return - return Object.keys(adapter).reduce((acc, method) => { - acc[method] = async (...args) => { + return Object.keys(adapter).reduce((acc, name) => { + acc[name] = async (...args: any[]) => { try { - logger.debug(`adapter_${method}`, ...args) - const adapterMethod = adapter[method] - return await adapterMethod(...args) + logger.debug(`adapter_${name}`, { args }) + const method: Method = adapter[name as any] + return await method(...args) } catch (error) { - logger.error(`adapter_error_${method}`, error) + logger.error(`adapter_error_${name}`, error) const e = new UnknownError(error) - e.name = `${capitalize(method)}Error` + e.name = `${capitalize(name)}Error` throw e } } return acc - }, {}) + }, adapter) } diff --git a/src/server/index.js b/src/server/index.ts similarity index 80% rename from src/server/index.js rename to src/server/index.ts index 0ea7c71162..15d3d3fee8 100644 --- a/src/server/index.js +++ b/src/server/index.ts @@ -1,16 +1,25 @@ -import * as jwt from "../lib/jwt" +/* eslint-disable @typescript-eslint/restrict-template-expressions */ +import * as jwt from "../jwt" import parseUrl from "../lib/parse-url" import logger, { setLogger } from "../lib/logger" import * as cookie from "./lib/cookie" -import * as defaultCallbacks from "./lib/default-callbacks" +import { defaultCallbacks } from "./lib/default-callbacks" import parseProviders from "./lib/providers" import * as routes from "./routes" import renderPage from "./pages" -import createSecret from "./lib/create-secret" import callbackUrlHandler from "./lib/callback-url-handler" import extendRes from "./lib/extend-res" import csrfTokenHandler from "./lib/csrf-token-handler" -import { eventsErrorHandler, adapterErrorHandler } from "../lib/errors" +import { eventsErrorHandler, adapterErrorHandler } from "./errors" +import createSecret from "./lib/utils" + +import type { NextApiRequest, NextApiResponse } from "next" +import type { NextAuthOptions } from "./types" +import type { + InternalOptions, + NextAuthRequest, + NextAuthResponse, +} from "../lib/types" // To work properly in production with OAuth providers the NEXTAUTH_URL // environment variable must be set. @@ -18,18 +27,17 @@ if (!process.env.NEXTAUTH_URL) { logger.warn("NEXTAUTH_URL") } -/** - * @param {import("next").NextApiRequest} req - * @param {import("next").NextApiResponse} res - * @param {import("types").NextAuthOptions} userOptions - */ -async function NextAuthHandler(req, res, userOptions) { +async function NextAuthHandler( + req: NextAuthRequest, + res: NextAuthResponse, + userOptions: NextAuthOptions +) { if (userOptions.logger) { setLogger(userOptions.logger) } // If debug enabled, set ENV VAR so that logger logs debug messages if (userOptions.debug) { - process.env._NEXTAUTH_DEBUG = true + ;(process.env._NEXTAUTH_DEBUG as any) = true } extendRes(req, res) @@ -51,14 +59,13 @@ async function NextAuthHandler(req, res, userOptions) { delete req.query.nextauth - // @todo refactor all existing references to baseUrl and basePath const { basePath, baseUrl } = parseUrl( - process.env.NEXTAUTH_URL || process.env.VERCEL_URL + process.env.NEXTAUTH_URL ?? process.env.VERCEL_URL ) const cookies = { ...cookie.defaultCookies( - userOptions.useSecureCookies || baseUrl.startsWith("https://") + userOptions.useSecureCookies ?? baseUrl.startsWith("https://") ), // Allow user cookie options to override any cookie settings above ...userOptions.cookies, @@ -68,8 +75,7 @@ async function NextAuthHandler(req, res, userOptions) { const providers = parseProviders({ providers: userOptions.providers, - baseUrl, - basePath, + base: `${baseUrl}${basePath}`, }) const provider = providers.find(({ id }) => id === providerId) @@ -87,8 +93,7 @@ async function NextAuthHandler(req, res, userOptions) { // User provided options are overriden by other options, // except for the options with special handling above - /** @type {import("types/internals").InternalOptions} */ - const options = { + const options: InternalOptions = { debug: false, pages: {}, theme: "auto", @@ -98,7 +103,7 @@ async function NextAuthHandler(req, res, userOptions) { // and are request-specific. baseUrl, basePath, - action, + action: action as InternalOptions["action"], provider, cookies, secret, @@ -127,6 +132,7 @@ async function NextAuthHandler(req, res, userOptions) { ...userOptions.callbacks, }, logger, + callbackUrl: process.env.NEXTAUTH_URL ?? "http://localhost:3000", } req.options = options @@ -142,7 +148,7 @@ async function NextAuthHandler(req, res, userOptions) { case "providers": return routes.providers(req, res) case "session": - return routes.session(req, res) + return await routes.session(req, res) case "csrf": return res.json({ csrfToken: req.options.csrfToken }) case "signin": @@ -163,7 +169,7 @@ async function NextAuthHandler(req, res, userOptions) { return render.signout() case "callback": if (provider) { - return routes.callback(req, res) + return await routes.callback(req, res) } break case "verify-request": @@ -193,7 +199,7 @@ async function NextAuthHandler(req, res, userOptions) { "EmailSignin", "CredentialsSignin", "SessionRequired", - ].includes(error) + ].includes(error as string) ) { return res.redirect(`${baseUrl}${basePath}/signin?error=${error}`) } @@ -206,14 +212,14 @@ async function NextAuthHandler(req, res, userOptions) { case "signin": // Verified CSRF Token required for all sign in routes if (req.options.csrfTokenVerified && provider) { - return routes.signin(req, res) + return await routes.signin(req, res) } return res.redirect(`${baseUrl}${basePath}/signin?csrf=true`) case "signout": // Verified CSRF Token required for signout if (req.options.csrfTokenVerified) { - return routes.signout(req, res) + return await routes.signout(req, res) } return res.redirect(`${baseUrl}${basePath}/signout?csrf=true`) case "callback": @@ -226,7 +232,7 @@ async function NextAuthHandler(req, res, userOptions) { return res.redirect(`${baseUrl}${basePath}/signin?csrf=true`) } - return routes.callback(req, res) + return await routes.callback(req, res) } break case "_log": @@ -248,11 +254,18 @@ async function NextAuthHandler(req, res, userOptions) { .end(`Error: HTTP ${req.method} is not supported for ${req.url}`) } +function NextAuth(options: NextAuthOptions): any +function NextAuth( + req: NextApiRequest, + res: NextApiResponse, + options: NextAuthOptions +): any /** Tha main entry point to next-auth */ -export default function NextAuth(...args) { +function NextAuth(...args) { if (args.length === 1) { - return (req, res) => NextAuthHandler(req, res, args[0]) + return async (req, res) => await NextAuthHandler(req, res, args[0]) } - - return NextAuthHandler(...args) + return NextAuthHandler(args[0], args[1], args[2]) } + +export default NextAuth diff --git a/src/server/lib/callback-handler.js b/src/server/lib/callback-handler.ts similarity index 89% rename from src/server/lib/callback-handler.js rename to src/server/lib/callback-handler.ts index 79b731e469..c4610e9c79 100644 --- a/src/server/lib/callback-handler.js +++ b/src/server/lib/callback-handler.ts @@ -1,7 +1,11 @@ -// @ts-check -import { AccountNotLinkedError } from "../../lib/errors" +import { AccountNotLinkedError } from "../errors" import { fromDate } from "./utils" import { randomBytes, randomUUID } from "crypto" +import { InternalOptions } from "../../lib/types" +import { AdapterSession, AdapterUser } from "../../adapters" +import { JWT } from "../../jwt" +import { Account, User } from "../.." +import { SessionToken } from "./cookie" /** * This function handles the complex flow of signing users in, and either creating, @@ -14,16 +18,12 @@ import { randomBytes, randomUUID } from "crypto" * All verification (e.g. OAuth flows or email address verificaiton flows) are * done prior to this handler being called to avoid additonal complexity in this * handler. - * @param {import("types/internals/cookies").SessionToken | null} sessionToken - * @param {import("types").User} profile - * @param {import("types").Account} account - * @param {import("types/internals").InternalOptions} options */ export default async function callbackHandler( - sessionToken, - profile, - account, - options + sessionToken: SessionToken, + profile: User, + account: Account, + options: InternalOptions ) { // Input validation if (!account?.providerAccountId || !account.type) @@ -56,17 +56,15 @@ export default async function callbackHandler( deleteSession, } = adapter - /** @type {import("types/adapters").AdapterSession | import("types/jwt").JWT | null} */ - let session = null - /** @type {import("types/adapters").AdapterUser | null} */ - let user = null + let session: AdapterSession | JWT | null = null + let user: AdapterUser | null = null let isNewUser = false if (sessionToken) { if (useJwtSession) { try { session = await jwt.decode({ ...jwt, token: sessionToken }) - if (session?.sub) { + if (session && "sub" in session && session.sub) { user = await getUser(session.sub) } } catch { @@ -101,8 +99,7 @@ export default async function callbackHandler( await events.updateUser?.({ user }) } else { const newUser = { ...profile, emailVerified: new Date() } - // @ts-ignore Force the adapter to create its own user id - delete newUser.id + delete (newUser as Omit).id // Create user account if there isn't one for the email address already user = await createUser(newUser) await events.createUser?.({ user }) @@ -132,9 +129,11 @@ export default async function callbackHandler( return { session, user, isNewUser } } // If the user is currently signed in, but the new account they are signing in - // with is already associated with another account, then we cannot link them + // with is already associated with another user, then we cannot link them // and need to return an error. - throw new AccountNotLinkedError() + throw new AccountNotLinkedError( + "The account is already associated with another user" + ) } // If there is no active session, but the account being signed in with is already // associated with a valid user then create session to sign the user in. @@ -186,7 +185,9 @@ export default async function callbackHandler( // We don't want to have two accounts with the same email address, and we don't // want to link them in case it's not safe to do so, so instead we prompt the user // to sign in via email to verify their identity and then link the accounts. - throw new AccountNotLinkedError() + throw new AccountNotLinkedError( + "Another account already exists with the same e-mail address" + ) } // If the current user is not logged in and the profile isn't linked to any user // accounts (by email or provider account id)... @@ -195,8 +196,7 @@ export default async function callbackHandler( // create a new account for the user, link it to the OAuth acccount and // create a new session for them so they are signed in with it. const newUser = { ...profile, emailVerified: null } - // @ts-ignore Force the adapter to create its own user id - delete newUser.id + delete (newUser as Omit).id user = await createUser(newUser) await events.createUser?.({ user }) diff --git a/src/server/lib/callback-url-handler.js b/src/server/lib/callback-url-handler.ts similarity index 88% rename from src/server/lib/callback-url-handler.js rename to src/server/lib/callback-url-handler.ts index a0fcd1cc38..ceaba67c06 100644 --- a/src/server/lib/callback-url-handler.js +++ b/src/server/lib/callback-url-handler.ts @@ -1,12 +1,15 @@ // @ts-check +import { NextAuthRequest, NextAuthResponse } from "../../lib/types" import * as cookie from "../lib/cookie" /** * Get callback URL based on query param / cookie + validation, * and add it to `req.options.callbackUrl`. - * @type {import("types/internals").NextAuthApiHandler} */ -export default async function callbackUrlHandler(req, res) { +export default async function callbackUrlHandler( + req: NextAuthRequest, + res: NextAuthResponse +) { const { query } = req const { body } = req const { cookies, baseUrl, callbacks } = req.options diff --git a/src/server/lib/cookie.js b/src/server/lib/cookie.ts similarity index 55% rename from src/server/lib/cookie.js rename to src/server/lib/cookie.ts index e45c06d97a..2e0a7543ef 100644 --- a/src/server/lib/cookie.js +++ b/src/server/lib/cookie.ts @@ -1,3 +1,15 @@ +// REVIEW: Is there any way to defer two types of strings? + +import { CookiesOptions } from "../.." + +/** Stringified form of `JWT`. Extract the content with `jwt.decode` */ +export type JWTString = string + +/** If `options.session.jwt` is set to `true`, this is a stringified `JWT`. In case of a database persisted session, this is the `sessionToken` of the session in the database.. */ +export type SessionToken = T extends "jwt" + ? JWTString + : string + /** * Function to set cookies server side * @@ -8,115 +20,123 @@ * As only partial functionlity is required, only the code we need has been incorporated here * (with fixes for specific issues) to keep dependancy size down. */ -export function set (res, name, value, options = {}) { +export function set( + res, + name, + value, + options: { + expires?: Date + maxAge?: number + } = {} +) { const stringValue = - typeof value === 'object' ? 'j:' + JSON.stringify(value) : String(value) + typeof value === "object" ? "j:" + JSON.stringify(value) : String(value) - if ('maxAge' in options) { - options.expires = new Date(Date.now() + options.maxAge) - options.maxAge /= 1000 + if ("maxAge" in options) { + options.expires = new Date(Date.now() + (options.maxAge ?? 0)) + options.maxAge = (options.maxAge ?? 0) / 1000 } // Preserve any existing cookies that have already been set in the same session - let setCookieHeader = res.getHeader('Set-Cookie') || [] + let setCookieHeader = res.getHeader("Set-Cookie") || [] // If not an array (i.e. a string with a single cookie) convert it into an array if (!Array.isArray(setCookieHeader)) { setCookieHeader = [setCookieHeader] } setCookieHeader.push(_serialize(name, String(stringValue), options)) - res.setHeader('Set-Cookie', setCookieHeader) + res.setHeader("Set-Cookie", setCookieHeader) } -function _serialize (name, val, options) { +function _serialize(name, val, options) { const fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/ // eslint-disable-line no-control-regex const opt = options || {} const enc = opt.encode || encodeURIComponent - if (typeof enc !== 'function') { - throw new TypeError('option encode is invalid') + if (typeof enc !== "function") { + throw new TypeError("option encode is invalid") } if (!fieldContentRegExp.test(name)) { - throw new TypeError('argument name is invalid') + throw new TypeError("argument name is invalid") } const value = enc(val) if (value && !fieldContentRegExp.test(value)) { - throw new TypeError('argument val is invalid') + throw new TypeError("argument val is invalid") } - let str = name + '=' + value + let str = `${name}=${value}` if (opt.maxAge != null) { const maxAge = opt.maxAge - 0 if (isNaN(maxAge) || !isFinite(maxAge)) { - throw new TypeError('option maxAge is invalid') + throw new TypeError("option maxAge is invalid") } - str += '; Max-Age=' + Math.floor(maxAge) + str += `; Max-Age=${Math.floor(maxAge)}` } if (opt.domain) { if (!fieldContentRegExp.test(opt.domain)) { - throw new TypeError('option domain is invalid') + throw new TypeError("option domain is invalid") } - str += '; Domain=' + opt.domain + str += `; Domain=${opt.domain}` } if (opt.path) { if (!fieldContentRegExp.test(opt.path)) { - throw new TypeError('option path is invalid') + throw new TypeError("option path is invalid") } - str += '; Path=' + opt.path + str += `; Path=${opt.path}` } else { - str += '; Path=/' + str += "; Path=/" } if (opt.expires) { let expires = opt.expires - if (typeof opt.expires.toUTCString === 'function') { + if (typeof opt.expires.toUTCString === "function") { expires = opt.expires.toUTCString() } else { const dateExpires = new Date(opt.expires) expires = dateExpires.toUTCString() } - str += '; Expires=' + expires + str += `; Expires=${expires}` } if (opt.httpOnly) { - str += '; HttpOnly' + str += "; HttpOnly" } if (opt.secure) { - str += '; Secure' + str += "; Secure" } if (opt.sameSite) { const sameSite = - typeof opt.sameSite === 'string' + typeof opt.sameSite === "string" ? opt.sameSite.toLowerCase() : opt.sameSite switch (sameSite) { case true: - str += '; SameSite=Strict' + str += "; SameSite=Strict" break - case 'lax': - str += '; SameSite=Lax' + case "lax": + str += "; SameSite=Lax" break - case 'strict': - str += '; SameSite=Strict' + case "strict": + str += "; SameSite=Strict" break - case 'none': - str += '; SameSite=None' + case "none": + str += "; SameSite=None" break default: - throw new TypeError('option sameSite is invalid') + throw new TypeError("option sameSite is invalid") } } @@ -132,48 +152,47 @@ function _serialize (name, val, options) { * For more on prefixes see https://googlechrome.github.io/samples/cookie-prefixes/ * * @TODO Review cookie settings (names, options) - * @return {import("types").CookiesOptions} */ -export function defaultCookies (useSecureCookies) { - const cookiePrefix = useSecureCookies ? '__Secure-' : '' +export function defaultCookies(useSecureCookies): CookiesOptions { + const cookiePrefix = useSecureCookies ? "__Secure-" : "" return { // default cookie options sessionToken: { name: `${cookiePrefix}next-auth.session-token`, options: { httpOnly: true, - sameSite: 'lax', - path: '/', - secure: useSecureCookies - } + sameSite: "lax", + path: "/", + secure: useSecureCookies, + }, }, callbackUrl: { name: `${cookiePrefix}next-auth.callback-url`, options: { - sameSite: 'lax', - path: '/', - secure: useSecureCookies - } + sameSite: "lax", + path: "/", + secure: useSecureCookies, + }, }, csrfToken: { // Default to __Host- for CSRF token for additional protection if using useSecureCookies // NB: The `__Host-` prefix is stricter than the `__Secure-` prefix. - name: `${useSecureCookies ? '__Host-' : ''}next-auth.csrf-token`, + name: `${useSecureCookies ? "__Host-" : ""}next-auth.csrf-token`, options: { httpOnly: true, - sameSite: 'lax', - path: '/', - secure: useSecureCookies - } + sameSite: "lax", + path: "/", + secure: useSecureCookies, + }, }, pkceCodeVerifier: { name: `${cookiePrefix}next-auth.pkce.code_verifier`, options: { httpOnly: true, - sameSite: 'lax', - path: '/', - secure: useSecureCookies - } - } + sameSite: "lax", + path: "/", + secure: useSecureCookies, + }, + }, } } diff --git a/src/server/lib/create-secret.js b/src/server/lib/create-secret.js deleted file mode 100644 index 0364156a2b..0000000000 --- a/src/server/lib/create-secret.js +++ /dev/null @@ -1,13 +0,0 @@ -import { createHash } from 'crypto' - -/** - * Secret used salt cookies and tokens (e.g. for CSRF protection). - * If no secret option is specified then it creates one on the fly - * based on options passed here. A options contains unique data, such as - * OAuth provider secrets and database credentials it should be sufficent. - */ -export default function createSecret ({ userOptions, basePath, baseUrl }) { - return userOptions.secret || createHash('sha256').update(JSON.stringify({ - baseUrl, basePath, ...userOptions - })).digest('hex') -} diff --git a/src/server/lib/csrf-token-handler.js b/src/server/lib/csrf-token-handler.ts similarity index 66% rename from src/server/lib/csrf-token-handler.js rename to src/server/lib/csrf-token-handler.ts index afb8ff2fbd..e4379176c7 100644 --- a/src/server/lib/csrf-token-handler.js +++ b/src/server/lib/csrf-token-handler.ts @@ -1,5 +1,6 @@ -import { createHash, randomBytes } from 'crypto' -import * as cookie from './cookie' +import { createHash, randomBytes } from "crypto" +import { NextAuthRequest, NextAuthResponse } from "../../lib/types" +import * as cookie from "./cookie" /** * Ensure CSRF Token cookie is set for any subsequent requests. @@ -14,19 +15,24 @@ import * as cookie from './cookie' * For more details, see the following OWASP links: * https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#double-submit-cookie * https://owasp.org/www-chapter-london/assets/slides/David_Johansson-Double_Defeat_of_Double-Submit_Cookie.pdf - * @param {import("..").NextAuthRequest} req - * @param {import("..").NextAuthResponse} res */ -export default function csrfTokenHandler (req, res) { +export default function csrfTokenHandler( + req: NextAuthRequest, + res: NextAuthResponse +) { const { cookies, secret } = req.options if (cookies.csrfToken.name in req.cookies) { - const [csrfToken, csrfTokenHash] = req.cookies[cookies.csrfToken.name].split('|') - const expectedCsrfTokenHash = createHash('sha256').update(`${csrfToken}${secret}`).digest('hex') + const [csrfToken, csrfTokenHash] = + req.cookies[cookies.csrfToken.name].split("|") + const expectedCsrfTokenHash = createHash("sha256") + .update(`${csrfToken}${secret}`) + .digest("hex") if (csrfTokenHash === expectedCsrfTokenHash) { // If hash matches then we trust the CSRF token value // If this is a POST request and the CSRF Token in the POST request matches // the cookie we have already verified is the one we have set, then the token is verified! - const csrfTokenVerified = req.method === 'POST' && csrfToken === req.body.csrfToken + const csrfTokenVerified = + req.method === "POST" && csrfToken === req.body.csrfToken req.options.csrfToken = csrfToken req.options.csrfTokenVerified = csrfTokenVerified return @@ -35,9 +41,16 @@ export default function csrfTokenHandler (req, res) { // If no csrfToken from cookie - because it's not been set yet, // or because the hash doesn't match (e.g. because it's been modifed or because the secret has changed) // create a new token. - const csrfToken = randomBytes(32).toString('hex') - const csrfTokenHash = createHash('sha256').update(`${csrfToken}${secret}`).digest('hex') + const csrfToken = randomBytes(32).toString("hex") + const csrfTokenHash = createHash("sha256") + .update(`${csrfToken}${secret}`) + .digest("hex") const csrfTokenCookie = `${csrfToken}|${csrfTokenHash}` - cookie.set(res, cookies.csrfToken.name, csrfTokenCookie, cookies.csrfToken.options) + cookie.set( + res, + cookies.csrfToken.name, + csrfTokenCookie, + cookies.csrfToken.options + ) req.options.csrfToken = csrfToken } diff --git a/src/server/lib/default-callbacks.js b/src/server/lib/default-callbacks.js deleted file mode 100644 index a4ff355135..0000000000 --- a/src/server/lib/default-callbacks.js +++ /dev/null @@ -1,24 +0,0 @@ -// @ts-check - -/** @type {import("types").CallbacksOptions["signIn"]} */ -export function signIn() { - return true -} - -/** @type {import("types").CallbacksOptions["redirect"]} */ -export function redirect({ url, baseUrl }) { - if (url.startsWith(baseUrl)) { - return url - } - return baseUrl -} - -/** @type {import("types").CallbacksOptions["session"]} */ -export function session({ session }) { - return session -} - -/** @type {import("types").CallbacksOptions["jwt"]} */ -export function jwt({ token }) { - return token -} diff --git a/src/server/lib/default-callbacks.ts b/src/server/lib/default-callbacks.ts new file mode 100644 index 0000000000..1550c81e01 --- /dev/null +++ b/src/server/lib/default-callbacks.ts @@ -0,0 +1,17 @@ +import { CallbacksOptions } from "../.." + +export const defaultCallbacks: CallbacksOptions = { + signIn() { + return true + }, + redirect({ url, baseUrl }) { + if (url.startsWith(baseUrl)) return url + return baseUrl + }, + session({ session }) { + return session + }, + jwt({ token }) { + return token + }, +} diff --git a/src/server/lib/email/signin.js b/src/server/lib/email/signin.ts similarity index 83% rename from src/server/lib/email/signin.js rename to src/server/lib/email/signin.ts index e02d23a12c..470fb41520 100644 --- a/src/server/lib/email/signin.js +++ b/src/server/lib/email/signin.ts @@ -1,18 +1,16 @@ -// @ts-check import { randomBytes } from "crypto" +import { EmailConfig } from "src/providers" +import { InternalOptions, InternalProvider } from "src/lib/types" import { hashToken } from "../utils" -/** - * @typedef {import("types/providers").EmailConfig} EmailConfig - */ - /** * Starts an e-mail login flow, by generating a token, * and sending it to the user's e-mail (with the help of a DB adapter) - * @param {string} identifier - * @param {import("types/internals").InternalOptions} options */ -export default async function email(identifier, options) { +export default async function email( + identifier: string, + options: InternalOptions +) { const { baseUrl, basePath, adapter, provider, logger, callbackUrl } = options // Generate token diff --git a/src/server/lib/extend-res.js b/src/server/lib/extend-res.ts similarity index 100% rename from src/server/lib/extend-res.js rename to src/server/lib/extend-res.ts diff --git a/src/server/lib/oauth/authorization-url.js b/src/server/lib/oauth/authorization-url.js index 2c7e20683c..6084df3219 100644 --- a/src/server/lib/oauth/authorization-url.js +++ b/src/server/lib/oauth/authorization-url.js @@ -8,13 +8,13 @@ import { createPKCE } from "../oauth/pkce-handler" * Generates an authorization/request token URL. * * [OAuth 2](https://www.oauth.com/oauth2-servers/authorization/the-authorization-request/) | [OAuth 1](https://oauth.net/core/1.0a/#auth_step2) - * @type {import("types/internals").NextAuthApiHandler} + * @type {import("src/lib/types").NextAuthApiHandler} * @returns {string} */ export default async function getAuthorizationUrl(req, res) { const { logger } = req.options try { - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = req.options.provider let params = {} diff --git a/src/server/lib/oauth/callback.js b/src/server/lib/oauth/callback.ts similarity index 75% rename from src/server/lib/oauth/callback.js rename to src/server/lib/oauth/callback.ts index c3389143fe..4a7124b2a6 100644 --- a/src/server/lib/oauth/callback.js +++ b/src/server/lib/oauth/callback.ts @@ -2,14 +2,18 @@ import { openidClient } from "./client" import { oAuth1Client } from "./client-legacy" import { getState } from "./state-handler" import { usePKCECodeVerifier } from "./pkce-handler" -import { OAuthCallbackError } from "../../../lib/errors" +import { OAuthCallbackError } from "../../errors" import { TokenSet } from "openid-client" +import { Account, LoggerInstance, Profile } from "src" +import { OAuthChecks, OAuthConfig } from "src/providers" -/** @type {import("types/internals").NextAuthApiHandler} */ -export default async function oAuthCallback(req, res) { +export default async function oAuthCallback( + req, + res +): Promise { const { logger } = req.options - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = req.options.provider const errorMessage = req.body.error ?? req.query.error @@ -28,12 +32,15 @@ export default async function oAuthCallback(req, res) { const client = await oAuth1Client(req.options) // Handle OAuth v1.x const { oauth_token, oauth_verifier } = req.query - const tokens = await client.getOAuthAccessToken( + // @ts-expect-error + const tokens: TokenSet = await client.getOAuthAccessToken( oauth_token, + // @ts-expect-error null, oauth_verifier ) - let profile = await client.get( + // @ts-expect-error + let profile: Profile = await client.get( provider.profileUrl, tokens.oauth_token, tokens.oauth_token_secret @@ -43,7 +50,7 @@ export default async function oAuthCallback(req, res) { profile = JSON.parse(profile) } - return getProfile({ profile, tokens, provider, logger }) + return await getProfile({ profile, tokens, provider, logger }) } catch (error) { logger.error("OAUTH_V1_GET_ACCESS_TOKEN_ERROR", error) throw error @@ -56,8 +63,7 @@ export default async function oAuthCallback(req, res) { /** @type {import("openid-client").TokenSet} */ let tokens - /** @type {import("types/providers").OAuthChecks} */ - const checks = { + const checks: OAuthChecks = { code_verifier: await usePKCECodeVerifier(req, res), state: getState(req), } @@ -82,8 +88,7 @@ export default async function oAuthCallback(req, res) { tokens.scope = tokens.scope.join(" ") } - /** @type {import("types").Profile} */ - let profile + let profile: Profile if (provider.userinfo?.request) { profile = await provider.userinfo.request({ provider, @@ -102,20 +107,37 @@ export default async function oAuthCallback(req, res) { // TODO: Remove/extract to Apple provider? profile.user = JSON.parse(req.body.user ?? req.query.user ?? null) - return getProfile({ profile, provider, tokens, logger }) + return await getProfile({ profile, provider, tokens, logger }) } catch (error) { logger.error("OAUTH_CALLBACK_ERROR", { error, providerId: provider.id }) throw new OAuthCallbackError(error) } } -/** - * Returns profile, raw profile and auth provider details - * @type {import("types/internals/oauth").GetProfile} - */ -async function getProfile({ profile: OAuthProfile, tokens, provider, logger }) { +export interface GetProfileParams { + profile: Profile + tokens: TokenSet + provider: OAuthConfig + logger: LoggerInstance +} + +export interface GetProfileResult { + // @ts-expect-error + profile: ReturnType | null + account: Omit | null + OAuthProfile: Profile +} + +/** Returns profile, raw profile and auth provider details */ +async function getProfile({ + profile: OAuthProfile, + tokens, + provider, + logger, +}: GetProfileParams): Promise { try { logger.debug("PROFILE_DATA", { OAuthProfile }) + // @ts-expect-error const profile = await provider.profile(OAuthProfile, tokens) profile.email = profile.email?.toLowerCase() // Return profile, raw profile and auth provider details diff --git a/src/server/lib/oauth/client-legacy.js b/src/server/lib/oauth/client-legacy.js index 0364721f56..747f135db2 100644 --- a/src/server/lib/oauth/client-legacy.js +++ b/src/server/lib/oauth/client-legacy.js @@ -5,10 +5,10 @@ import { OAuth } from "oauth" /** * Client supporting OAuth 1.x - * @param {import("types/internals").InternalOptions} options + * @param {import("src/lib/types").InternalOptions} options */ export function oAuth1Client(options) { - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = options.provider const oauth1Client = new OAuth( diff --git a/src/server/lib/oauth/client.js b/src/server/lib/oauth/client.js index 2cf2b159d1..64a8c8b28e 100644 --- a/src/server/lib/oauth/client.js +++ b/src/server/lib/oauth/client.js @@ -6,10 +6,10 @@ import { Issuer } from "openid-client" * Check out `Issuer.discover` * * Client supporting OAuth 2.x and OIDC - * @param {import("types/internals").InternalOptions} options + * @param {import("src/lib/types").InternalOptions} options */ export async function openidClient(options) { - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = options.provider let issuer diff --git a/src/server/lib/oauth/pkce-handler.js b/src/server/lib/oauth/pkce-handler.js index 1f42062414..66ee5f4ec2 100644 --- a/src/server/lib/oauth/pkce-handler.js +++ b/src/server/lib/oauth/pkce-handler.js @@ -1,5 +1,5 @@ import * as cookie from "../cookie" -import * as jwt from "../../../lib/jwt" +import * as jwt from "../../../jwt" import { generators } from "openid-client" const PKCE_LENGTH = 64 @@ -9,12 +9,12 @@ const PKCE_MAX_AGE = 60 * 15 // 15 minutes in seconds /** * Returns `code_challenge` and `code_challenge_method` * and saves them in a cookie. - * @type {import("types/internals").NextAuthApiHandler} + * @type {import("src/lib/types").NextAuthApiHandler} * @returns {Promise */ export async function createPKCE(req, res) { const { cookies, logger } = req.options - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = req.options.provider if (!provider.checks?.includes("pkce")) { // Provider does not support PKCE, return nothing. @@ -55,10 +55,11 @@ export async function createPKCE(req, res) { /** * Returns code_verifier if provider uses PKCE, * and clears the cookie afterwards. - * @param {import("types/internals").NextAuthRequest} req + * @param {import("src/lib/types").NextAuthRequest} req + * @return {Promise} */ export async function usePKCECodeVerifier(req, res) { - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = req.options.provider const { cookies } = req.options if ( diff --git a/src/server/lib/oauth/state-handler.js b/src/server/lib/oauth/state-handler.js index 40fc4ea14d..3e043c7e60 100644 --- a/src/server/lib/oauth/state-handler.js +++ b/src/server/lib/oauth/state-handler.js @@ -2,12 +2,12 @@ import { createHash } from "crypto" /** * Returns state if provider supports it - * @param {import("types/internals").NextAuthRequest} req - * @param {import("types/internals").NextAuthResponse} res + * @param {import("src/lib/types").NextAuthRequest} req + * @param {import("src/lib/types").NextAuthResponse} res */ export function createState(req) { const { csrfToken, logger } = req.options - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = req.options.provider if (!provider.checks?.includes("state")) { // Provider does not support state, return nothing @@ -24,10 +24,10 @@ export function createState(req) { /** * Consistently recreate state from the csrfToken * if `provider.checks` supports `"state"`. - * @param {import("types/internals").NextAuthRequest} req + * @param {import("src/lib/types").NextAuthRequest} req */ export function getState({ options }) { - /** @type {import("types/providers").OAuthConfig} */ + /** @type {import("src/providers").OAuthConfig} */ const provider = options.provider if (provider?.checks.includes("state")) { return createHash("sha256").update(options.csrfToken).digest("hex") diff --git a/src/server/lib/providers.js b/src/server/lib/providers.ts similarity index 55% rename from src/server/lib/providers.js rename to src/server/lib/providers.ts index 991217d1ac..0146360378 100644 --- a/src/server/lib/providers.js +++ b/src/server/lib/providers.ts @@ -1,17 +1,16 @@ +import { InternalProvider } from "src/lib/types" +import { Provider } from "../../providers" import { merge } from "../../lib/merge" /** * Adds `signinUrl` and `callbackUrl` to each provider * and deep merge user-defined options. - * @param {{ - * providers: import("types/providers").Provider[] - * baseUrl: string - * basePath: string - * }} options - * @returns {import("types/internals").InternalOptions["providers"]} */ -export default function parseProviders({ providers = [], baseUrl, basePath }) { - const base = `${baseUrl}${basePath}` +export default function parseProviders(params: { + providers: Provider[] + base: string +}): InternalProvider[] { + const { providers = [], base } = params return providers.map(({ options, ...defaultOptions }) => merge(defaultOptions, { signinUrl: `${base}/signin/${defaultOptions.id}`, diff --git a/src/server/lib/utils.js b/src/server/lib/utils.js deleted file mode 100644 index 96ecc073c5..0000000000 --- a/src/server/lib/utils.js +++ /dev/null @@ -1,24 +0,0 @@ -import { createHash } from "crypto" - -/** - * Takes a number in seconds and returns the date in the future. - * Optionally takes a second date parameter. In that case - * the date in the future will be calculated from that date instead of now. - */ -export function fromDate(time, date = Date.now()) { - return new Date(date + time * 1000) -} - -/** - * @param {string} token - * @param {import("types/internals").InternalOptions} options - */ -export function hashToken(token, options) { - const { provider, secret } = options - return ( - createHash("sha256") - // Prefer provider specific secret, but use default secret if none specified - .update(`${token}${provider.secret ?? secret}`) - .digest("hex") - ) -} diff --git a/src/server/lib/utils.ts b/src/server/lib/utils.ts new file mode 100644 index 0000000000..7cd22b78da --- /dev/null +++ b/src/server/lib/utils.ts @@ -0,0 +1,55 @@ +import { createHash } from "crypto" +import { NextAuthOptions } from "../.." +import { EmailConfig } from "../../providers" +import { InternalOptions, InternalProvider } from "../../lib/types" + +/** + * Takes a number in seconds and returns the date in the future. + * Optionally takes a second date parameter. In that case + * the date in the future will be calculated from that date instead of now. + */ +export function fromDate(time, date = Date.now()) { + return new Date(date + time * 1000) +} + +export function hashToken( + token: string, + options: InternalOptions +) { + const { provider, secret } = options + return ( + createHash("sha256") + // Prefer provider specific secret, but use default secret if none specified + .update(`${token}${provider.secret ?? secret}`) + .digest("hex") + ) +} + +/** + * Secret used salt cookies and tokens (e.g. for CSRF protection). + * If no secret option is specified then it creates one on the fly + * based on options passed here. A options contains unique data, such as + * OAuth provider secrets and database credentials it should be sufficent. + */ +export default function createSecret({ + userOptions, + basePath, + baseUrl, +}: { + userOptions: NextAuthOptions + basePath: string + baseUrl: string +}) { + return ( + userOptions.secret ?? + createHash("sha256") + .update( + JSON.stringify({ + baseUrl, + basePath, + ...userOptions, + }) + ) + .digest("hex") + ) +} diff --git a/src/server/pages/error.js b/src/server/pages/error.tsx similarity index 51% rename from src/server/pages/error.js rename to src/server/pages/error.tsx index 22b1197c78..828ee5a37d 100644 --- a/src/server/pages/error.js +++ b/src/server/pages/error.tsx @@ -1,65 +1,79 @@ -// @ts-check -import { h } from 'preact' // eslint-disable-line no-unused-vars - /** * Renders an error page. * @param {{ * baseUrl: string * basePath: string * error?: string - * res: import("types/internals").NextAuthResponse + * res: import("src/lib/types").NextAuthResponse * }} params */ -export default function error ({ baseUrl, basePath, error = 'default', res }) { +export default function Error({ baseUrl, basePath, error = "default", res }) { const signinPageUrl = `${baseUrl}${basePath}/signin` const errors = { default: { statusCode: 200, - heading: 'Error', - message:

{baseUrl.replace(/^https?:\/\//, '')}

+ heading: "Error", + message: ( +

+ + {baseUrl.replace(/^https?:\/\//, "")} + +

+ ), }, configuration: { statusCode: 500, - heading: 'Server error', + heading: "Server error", message: (

There is a problem with the server configuration.

Check the server logs for more information.

- ) + ), }, accessdenied: { statusCode: 403, - heading: 'Access Denied', + heading: "Access Denied", message: (

You do not have permission to sign in.

-

Sign in

+

+ + Sign in + +

- ) + ), }, verification: { statusCode: 403, - heading: 'Unable to sign in', + heading: "Unable to sign in", message: (

The sign in link is no longer valid.

It may have been used already or it may have expired.

), - signin:

Sign in

- } + signin: ( +

+ + Sign in + +

+ ), + }, } - const { statusCode, heading, message, signin } = errors[error.toLowerCase()] ?? errors.default + const { statusCode, heading, message, signin } = + errors[error.toLowerCase()] ?? errors.default res.status(statusCode) return ( -
+

{heading}

-
{message}
+
{message}
{signin}
) diff --git a/src/server/pages/index.js b/src/server/pages/index.js deleted file mode 100644 index 961351f015..0000000000 --- a/src/server/pages/index.js +++ /dev/null @@ -1,43 +0,0 @@ -import renderToString from 'preact-render-to-string' -import signin from './signin' -import signout from './signout' -import verifyRequest from './verify-request' -import error from './error' -import css from '../../css' - -/** Takes a request and response, and gives renderable pages */ -export default function renderPage (req, res) { - const { baseUrl, basePath, callbackUrl, csrfToken, providers, theme } = req.options - - res.setHeader('Content-Type', 'text/html') - function send ({ html, title }) { - res.send(`${title}
${renderToString(html)}
`) - } - - return { - signin (props) { - send({ - html: signin({ csrfToken, providers, callbackUrl, ...req.query, ...props }), - title: 'Sign In' - }) - }, - signout (props) { - send({ - html: signout({ csrfToken, baseUrl, basePath, ...props }), - title: 'Sign Out' - }) - }, - verifyRequest (props) { - send({ - html: verifyRequest({ baseUrl, ...props }), - title: 'Verify Request' - }) - }, - error (props) { - send({ - html: error({ basePath, baseUrl, res, ...props }), - title: 'Error' - }) - } - } -} diff --git a/src/server/pages/index.ts b/src/server/pages/index.ts new file mode 100644 index 0000000000..ceaa7dc843 --- /dev/null +++ b/src/server/pages/index.ts @@ -0,0 +1,54 @@ +import renderToString from "preact-render-to-string" +import signin from "./signin" +import signout from "./signout" +import verifyRequest from "./verify-request" +import error from "./error" +import css from "../../css" + +/** Takes a request and response, and gives renderable pages */ +export default function renderPage(req, res) { + const { baseUrl, basePath, callbackUrl, csrfToken, providers, theme } = + req.options + + res.setHeader("Content-Type", "text/html") + function send({ html, title }) { + res.send( + `${title}
${renderToString( + html + )}
` + ) + } + + return { + signin(props?: any) { + send({ + html: signin({ + csrfToken, + providers, + callbackUrl, + ...req.query, + ...props, + }), + title: "Sign In", + }) + }, + signout(props?: any) { + send({ + html: signout({ csrfToken, baseUrl, basePath, ...props }), + title: "Sign Out", + }) + }, + verifyRequest(props?: any) { + send({ + html: verifyRequest({ baseUrl, ...props }), + title: "Verify Request", + }) + }, + error(props) { + send({ + html: error({ basePath, baseUrl, res, ...props }), + title: "Error", + }) + }, + } +} diff --git a/src/server/pages/signin.js b/src/server/pages/signin.tsx similarity index 93% rename from src/server/pages/signin.js rename to src/server/pages/signin.tsx index ebccbd0176..994e78653c 100644 --- a/src/server/pages/signin.js +++ b/src/server/pages/signin.tsx @@ -1,6 +1,4 @@ -import { h } from "preact" // eslint-disable-line no-unused-vars - -export default function signin({ +export default function Signin({ csrfToken, providers, callbackUrl, @@ -44,7 +42,7 @@ export default function signin({

{error}

)} - {providersToRender.map((provider, i) => ( + {providersToRender.map((provider, i: number) => (
{provider.type === "oauth" && (
@@ -64,7 +62,7 @@ export default function signin({ {provider.type === "email" && ( -