From 05b53423d675a584fdfd37cfd78655145800e4ff Mon Sep 17 00:00:00 2001 From: Gabriel Csapo Date: Sun, 2 Jan 2022 21:35:04 -0800 Subject: [PATCH] [wip] typescript conversion (#88) * [wip] * [wip] migrates tests to jest for easier debugging, removes deps * [chore] ignore dist * [chore] fix ordering of event listeners to make sure async functions were run after * [chore] updates tests to be jest tests adds website scaffolding * [chore] updates ci workflow and cleans up website * [chore] get types building and docs produced * Gabrielcsapo/typescript conversion (#89) * Minor fixes Replaced JavaScript with TypeScript in README Made sure that package will be built if installed from github Fixed some types Made some async functions return a Promise if callback was not specified * Fixed small TYPO that broke README.md * Update package.json Added myself as contributor cuz y not * Update service.ts oops, missed a spot * Create .git-package.meta this dotfile should be commited to the repo * Create .npmignore .git-package.meta should not get committed to npm Co-authored-by: Buj Itself Co-authored-by: Gabriel Csapo * [chore] updates dependencies * [chore] fixes node@14 tests * [chore] fix failing tests * [chore] fix failing tests * [chore] fix lint issues * [chore] updates changelog Co-authored-by: Buj <42136194+5GameMaker@users.noreply.github.com> Co-authored-by: Buj Itself --- .eslintrc | 26 +- .git-package.meta | 1 + .github/workflows/ci.yml | 64 + .github/workflows/node.js.yml | 32 - .gitignore | 6 +- .npmignore | 1 + .prettierrc | 3 + .tryitout | 42 - CHANGELOG.md | 5 + LICENSE | 2 +- README.md | 152 +- TODO.md | 1 - api-extractor.json | 364 + docs/code/Git.html | 3028 ------- docs/code/HttpDuplex.html | 4380 --------- docs/code/Service.html | 1503 ---- docs/code/git.js.html | 529 -- docs/code/global.html | 294 - docs/code/http-duplex.js.html | 577 -- docs/code/index.html | 198 - docs/code/module-lib_util.html | 1341 --- docs/code/scripts/linenumber.js | 25 - .../scripts/prettify/Apache-License-2.0.txt | 202 - docs/code/scripts/prettify/lang-css.js | 2 - docs/code/scripts/prettify/prettify.js | 28 - docs/code/service.js.html | 269 - docs/code/styles/jsdoc.css | 645 -- docs/code/styles/prettify.css | 79 - docs/code/util.js.html | 248 - docs/index.html | 52 - docs/krayon.css | 18 - docs/krayon.min.js | 1 - docs/main.js | 5 - example/index.js | 83 +- .../server/tmp/test.git/HEAD | 0 .../server/tmp/test.git/config | 0 .../server/tmp/test.git/description | 0 .../tmp/test.git/hooks/applypatch-msg.sample | 0 .../tmp/test.git/hooks/commit-msg.sample | 0 .../tmp/test.git/hooks/post-update.sample | 0 .../tmp/test.git/hooks/pre-applypatch.sample | 0 .../tmp/test.git/hooks/pre-commit.sample | 0 .../server/tmp/test.git/hooks/pre-push.sample | 0 .../tmp/test.git/hooks/pre-rebase.sample | 0 .../tmp/test.git/hooks/pre-receive.sample | 0 .../test.git/hooks/prepare-commit-msg.sample | 0 .../server/tmp/test.git/hooks/update.sample | 0 .../server/tmp/test.git/info/exclude | 0 .../0e/60b9add392cd124fbf8e994bdbbde7a3192572 | Bin .../2b/e7c65ae93b54b988416f280298b0b8b5f20385 | Bin .../ed/88ef46143302c0acc42531f085c49d79ba68ba | Bin .../server/tmp/test.git/refs/heads/master | 0 index.js | 1 - jest.config.ts | 13 + jsdoc.json | 27 - lib/git.js | 471 - lib/http-duplex.js | 519 -- lib/service.js | 211 - lib/util.js | 190 - package.json | 48 +- src/git.test.ts | 1027 +++ src/git.ts | 547 ++ src/http-duplex.test.ts | 174 + src/http-duplex.ts | 286 + src/index.ts | 5 + src/service.ts | 235 + src/types.ts | 1 + src/util.test.ts | 89 + src/util.ts | 171 + test/git.js | 1014 --- test/http-duplex.js | 150 - test/util.js | 96 - tsconfig.json | 20 + tsdoc-metadata.json | 11 + website/.gitignore | 20 + website/README.md | 33 + website/babel.config.js | 3 + website/docs/api/.api-extractor-meta | 1 + website/docs/api/_category_.json | 3 + website/docs/api/api-sidebar.js | 540 ++ website/docs/api/index.md | 19 + website/docs/api/node-git-server.basicauth.md | 32 + .../docs/api/node-git-server.createaction.md | 32 + .../api/node-git-server.git._constructor_.md | 27 + .../api/node-git-server.git.authenticate.md | 18 + .../api/node-git-server.git.autocreate.md | 18 + .../docs/api/node-git-server.git.checkout.md | 18 + website/docs/api/node-git-server.git.close.md | 24 + .../docs/api/node-git-server.git.create.md | 31 + .../docs/api/node-git-server.git.dirmap.md | 18 + .../docs/api/node-git-server.git.exists.md | 30 + .../docs/api/node-git-server.git.gettype.md | 30 + .../docs/api/node-git-server.git.handle.md | 31 + website/docs/api/node-git-server.git.list.md | 30 + .../docs/api/node-git-server.git.listen.md | 32 + website/docs/api/node-git-server.git.md | 51 + website/docs/api/node-git-server.git.mkdir.md | 30 + .../docs/api/node-git-server.git.server.md | 18 + ...t-server.gitauthenticateoptions.headers.md | 18 + .../node-git-server.gitauthenticateoptions.md | 27 + ...-git-server.gitauthenticateoptions.repo.md | 18 + ...-git-server.gitauthenticateoptions.type.md | 18 + ...-git-server.gitauthenticateoptions.user.md | 18 + .../node-git-server.gitevents.addlistener.md | 37 + ...node-git-server.gitevents.addlistener_1.md | 35 + website/docs/api/node-git-server.gitevents.md | 25 + ...node-git-server.gitoptions.authenticate.md | 18 + .../node-git-server.gitoptions.autocreate.md | 18 + .../node-git-server.gitoptions.checkout.md | 18 + .../docs/api/node-git-server.gitoptions.md | 26 + ...ode-git-server.httpduplex._constructor_.md | 31 + .../api/node-git-server.httpduplex.accept.md | 22 + .../node-git-server.httpduplex.complete.md | 18 + .../node-git-server.httpduplex.connection.md | 20 + .../api/node-git-server.httpduplex.cork.md | 28 + .../api/node-git-server.httpduplex.cwd.md | 18 + .../api/node-git-server.httpduplex.destroy.md | 22 + .../api/node-git-server.httpduplex.end.md | 28 + .../api/node-git-server.httpduplex.exists.md | 18 + .../api/node-git-server.httpduplex.headers.md | 20 + .../node-git-server.httpduplex.httpversion.md | 20 + ...-git-server.httpduplex.httpversionmajor.md | 20 + ...-git-server.httpduplex.httpversionminor.md | 20 + .../docs/api/node-git-server.httpduplex.md | 63 + .../api/node-git-server.httpduplex.method.md | 24 + .../node-git-server.httpduplex.readable.md | 20 + .../api/node-git-server.httpduplex.reject.md | 29 + .../api/node-git-server.httpduplex.repo.md | 18 + .../api/node-git-server.httpduplex.req.md | 20 + .../api/node-git-server.httpduplex.res.md | 20 + .../node-git-server.httpduplex.setheader.md | 29 + .../api/node-git-server.httpduplex.socket.md | 20 + .../node-git-server.httpduplex.statuscode.md | 26 + ...ode-git-server.httpduplex.statusmessage.md | 26 + .../node-git-server.httpduplex.trailers.md | 20 + .../api/node-git-server.httpduplex.uncork.md | 24 + .../api/node-git-server.httpduplex.url.md | 28 + .../node-git-server.httpduplex.writable.md | 18 + .../node-git-server.httpduplex.writehead.md | 36 + .../docs/api/node-git-server.inforesponse.md | 34 + website/docs/api/node-git-server.md | 49 + website/docs/api/node-git-server.nocache.md | 30 + .../docs/api/node-git-server.packsideband.md | 28 + .../docs/api/node-git-server.parsegitname.md | 30 + .../api/node-git-server.pushdata.branch.md | 18 + .../api/node-git-server.pushdata.commit.md | 18 + website/docs/api/node-git-server.pushdata.md | 30 + .../docs/api/node-git-server.pushdata.repo.md | 18 + .../node-git-server.service._constructor_.md | 28 + .../api/node-git-server.service.accept.md | 24 + .../api/node-git-server.service.commit.md | 18 + .../docs/api/node-git-server.service.cwd.md | 18 + .../api/node-git-server.service.evname.md | 18 + .../docs/api/node-git-server.service.last.md | 18 + .../docs/api/node-git-server.service.log.md | 22 + .../docs/api/node-git-server.service.logs.md | 18 + website/docs/api/node-git-server.service.md | 48 + .../api/node-git-server.service.reject.md | 31 + .../docs/api/node-git-server.service.repo.md | 18 + .../api/node-git-server.service.service.md | 18 + .../api/node-git-server.service.status.md | 18 + .../api/node-git-server.service.username.md | 18 + .../api/node-git-server.serviceoptions.cwd.md | 18 + .../api/node-git-server.serviceoptions.md | 26 + .../node-git-server.serviceoptions.repo.md | 18 + .../node-git-server.serviceoptions.service.md | 18 + .../api/node-git-server.servicerespond.md | 33 + .../docs/api/node-git-server.servicestring.md | 18 + .../api/node-git-server.tagdata.commit.md | 18 + website/docs/api/node-git-server.tagdata.md | 30 + .../docs/api/node-git-server.tagdata.repo.md | 18 + .../api/node-git-server.tagdata.version.md | 18 + website/docs/intro.md | 19 + website/docusaurus.config.js | 103 + website/package.json | 45 + website/sidebars.js | 31 + website/src/components/HomepageFeatures.js | 59 + .../components/HomepageFeatures.module.css | 6 + website/src/css/custom.css | 28 + website/src/pages/index.js | 42 + website/src/pages/index.module.css | 23 + website/src/pages/markdown-page.md | 7 + website/static/.nojekyll | 0 website/static/img/favicon.ico | Bin 0 -> 3626 bytes website/static/img/logo.svg | 1 + website/yarn.lock | 7823 +++++++++++++++++ 186 files changed, 14235 insertions(+), 16320 deletions(-) create mode 100644 .git-package.meta create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/node.js.yml create mode 100644 .npmignore create mode 100644 .prettierrc delete mode 100644 .tryitout delete mode 100644 TODO.md create mode 100644 api-extractor.json delete mode 100644 docs/code/Git.html delete mode 100644 docs/code/HttpDuplex.html delete mode 100644 docs/code/Service.html delete mode 100644 docs/code/git.js.html delete mode 100644 docs/code/global.html delete mode 100644 docs/code/http-duplex.js.html delete mode 100644 docs/code/index.html delete mode 100644 docs/code/module-lib_util.html delete mode 100644 docs/code/scripts/linenumber.js delete mode 100644 docs/code/scripts/prettify/Apache-License-2.0.txt delete mode 100644 docs/code/scripts/prettify/lang-css.js delete mode 100644 docs/code/scripts/prettify/prettify.js delete mode 100644 docs/code/service.js.html delete mode 100644 docs/code/styles/jsdoc.css delete mode 100644 docs/code/styles/prettify.css delete mode 100644 docs/code/util.js.html delete mode 100644 docs/index.html delete mode 100644 docs/krayon.css delete mode 100644 docs/krayon.min.js delete mode 100644 docs/main.js rename {test/fixtures => fixtures}/server/tmp/test.git/HEAD (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/config (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/description (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/applypatch-msg.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/commit-msg.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/post-update.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/pre-applypatch.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/pre-commit.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/pre-push.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/pre-rebase.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/pre-receive.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/prepare-commit-msg.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/hooks/update.sample (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/info/exclude (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/objects/0e/60b9add392cd124fbf8e994bdbbde7a3192572 (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/objects/2b/e7c65ae93b54b988416f280298b0b8b5f20385 (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/objects/ed/88ef46143302c0acc42531f085c49d79ba68ba (100%) rename {test/fixtures => fixtures}/server/tmp/test.git/refs/heads/master (100%) delete mode 100644 index.js create mode 100644 jest.config.ts delete mode 100644 jsdoc.json delete mode 100644 lib/git.js delete mode 100644 lib/http-duplex.js delete mode 100644 lib/service.js delete mode 100644 lib/util.js create mode 100644 src/git.test.ts create mode 100644 src/git.ts create mode 100644 src/http-duplex.test.ts create mode 100644 src/http-duplex.ts create mode 100644 src/index.ts create mode 100644 src/service.ts create mode 100644 src/types.ts create mode 100644 src/util.test.ts create mode 100644 src/util.ts delete mode 100644 test/git.js delete mode 100644 test/http-duplex.js delete mode 100644 test/util.js create mode 100644 tsconfig.json create mode 100644 tsdoc-metadata.json create mode 100644 website/.gitignore create mode 100644 website/README.md create mode 100644 website/babel.config.js create mode 100644 website/docs/api/.api-extractor-meta create mode 100644 website/docs/api/_category_.json create mode 100644 website/docs/api/api-sidebar.js create mode 100644 website/docs/api/index.md create mode 100644 website/docs/api/node-git-server.basicauth.md create mode 100644 website/docs/api/node-git-server.createaction.md create mode 100644 website/docs/api/node-git-server.git._constructor_.md create mode 100644 website/docs/api/node-git-server.git.authenticate.md create mode 100644 website/docs/api/node-git-server.git.autocreate.md create mode 100644 website/docs/api/node-git-server.git.checkout.md create mode 100644 website/docs/api/node-git-server.git.close.md create mode 100644 website/docs/api/node-git-server.git.create.md create mode 100644 website/docs/api/node-git-server.git.dirmap.md create mode 100644 website/docs/api/node-git-server.git.exists.md create mode 100644 website/docs/api/node-git-server.git.gettype.md create mode 100644 website/docs/api/node-git-server.git.handle.md create mode 100644 website/docs/api/node-git-server.git.list.md create mode 100644 website/docs/api/node-git-server.git.listen.md create mode 100644 website/docs/api/node-git-server.git.md create mode 100644 website/docs/api/node-git-server.git.mkdir.md create mode 100644 website/docs/api/node-git-server.git.server.md create mode 100644 website/docs/api/node-git-server.gitauthenticateoptions.headers.md create mode 100644 website/docs/api/node-git-server.gitauthenticateoptions.md create mode 100644 website/docs/api/node-git-server.gitauthenticateoptions.repo.md create mode 100644 website/docs/api/node-git-server.gitauthenticateoptions.type.md create mode 100644 website/docs/api/node-git-server.gitauthenticateoptions.user.md create mode 100644 website/docs/api/node-git-server.gitevents.addlistener.md create mode 100644 website/docs/api/node-git-server.gitevents.addlistener_1.md create mode 100644 website/docs/api/node-git-server.gitevents.md create mode 100644 website/docs/api/node-git-server.gitoptions.authenticate.md create mode 100644 website/docs/api/node-git-server.gitoptions.autocreate.md create mode 100644 website/docs/api/node-git-server.gitoptions.checkout.md create mode 100644 website/docs/api/node-git-server.gitoptions.md create mode 100644 website/docs/api/node-git-server.httpduplex._constructor_.md create mode 100644 website/docs/api/node-git-server.httpduplex.accept.md create mode 100644 website/docs/api/node-git-server.httpduplex.complete.md create mode 100644 website/docs/api/node-git-server.httpduplex.connection.md create mode 100644 website/docs/api/node-git-server.httpduplex.cork.md create mode 100644 website/docs/api/node-git-server.httpduplex.cwd.md create mode 100644 website/docs/api/node-git-server.httpduplex.destroy.md create mode 100644 website/docs/api/node-git-server.httpduplex.end.md create mode 100644 website/docs/api/node-git-server.httpduplex.exists.md create mode 100644 website/docs/api/node-git-server.httpduplex.headers.md create mode 100644 website/docs/api/node-git-server.httpduplex.httpversion.md create mode 100644 website/docs/api/node-git-server.httpduplex.httpversionmajor.md create mode 100644 website/docs/api/node-git-server.httpduplex.httpversionminor.md create mode 100644 website/docs/api/node-git-server.httpduplex.md create mode 100644 website/docs/api/node-git-server.httpduplex.method.md create mode 100644 website/docs/api/node-git-server.httpduplex.readable.md create mode 100644 website/docs/api/node-git-server.httpduplex.reject.md create mode 100644 website/docs/api/node-git-server.httpduplex.repo.md create mode 100644 website/docs/api/node-git-server.httpduplex.req.md create mode 100644 website/docs/api/node-git-server.httpduplex.res.md create mode 100644 website/docs/api/node-git-server.httpduplex.setheader.md create mode 100644 website/docs/api/node-git-server.httpduplex.socket.md create mode 100644 website/docs/api/node-git-server.httpduplex.statuscode.md create mode 100644 website/docs/api/node-git-server.httpduplex.statusmessage.md create mode 100644 website/docs/api/node-git-server.httpduplex.trailers.md create mode 100644 website/docs/api/node-git-server.httpduplex.uncork.md create mode 100644 website/docs/api/node-git-server.httpduplex.url.md create mode 100644 website/docs/api/node-git-server.httpduplex.writable.md create mode 100644 website/docs/api/node-git-server.httpduplex.writehead.md create mode 100644 website/docs/api/node-git-server.inforesponse.md create mode 100644 website/docs/api/node-git-server.md create mode 100644 website/docs/api/node-git-server.nocache.md create mode 100644 website/docs/api/node-git-server.packsideband.md create mode 100644 website/docs/api/node-git-server.parsegitname.md create mode 100644 website/docs/api/node-git-server.pushdata.branch.md create mode 100644 website/docs/api/node-git-server.pushdata.commit.md create mode 100644 website/docs/api/node-git-server.pushdata.md create mode 100644 website/docs/api/node-git-server.pushdata.repo.md create mode 100644 website/docs/api/node-git-server.service._constructor_.md create mode 100644 website/docs/api/node-git-server.service.accept.md create mode 100644 website/docs/api/node-git-server.service.commit.md create mode 100644 website/docs/api/node-git-server.service.cwd.md create mode 100644 website/docs/api/node-git-server.service.evname.md create mode 100644 website/docs/api/node-git-server.service.last.md create mode 100644 website/docs/api/node-git-server.service.log.md create mode 100644 website/docs/api/node-git-server.service.logs.md create mode 100644 website/docs/api/node-git-server.service.md create mode 100644 website/docs/api/node-git-server.service.reject.md create mode 100644 website/docs/api/node-git-server.service.repo.md create mode 100644 website/docs/api/node-git-server.service.service.md create mode 100644 website/docs/api/node-git-server.service.status.md create mode 100644 website/docs/api/node-git-server.service.username.md create mode 100644 website/docs/api/node-git-server.serviceoptions.cwd.md create mode 100644 website/docs/api/node-git-server.serviceoptions.md create mode 100644 website/docs/api/node-git-server.serviceoptions.repo.md create mode 100644 website/docs/api/node-git-server.serviceoptions.service.md create mode 100644 website/docs/api/node-git-server.servicerespond.md create mode 100644 website/docs/api/node-git-server.servicestring.md create mode 100644 website/docs/api/node-git-server.tagdata.commit.md create mode 100644 website/docs/api/node-git-server.tagdata.md create mode 100644 website/docs/api/node-git-server.tagdata.repo.md create mode 100644 website/docs/api/node-git-server.tagdata.version.md create mode 100644 website/docs/intro.md create mode 100644 website/docusaurus.config.js create mode 100644 website/package.json create mode 100644 website/sidebars.js create mode 100644 website/src/components/HomepageFeatures.js create mode 100644 website/src/components/HomepageFeatures.module.css create mode 100644 website/src/css/custom.css create mode 100644 website/src/pages/index.js create mode 100644 website/src/pages/index.module.css create mode 100644 website/src/pages/markdown-page.md create mode 100644 website/static/.nojekyll create mode 100644 website/static/img/favicon.ico create mode 100644 website/static/img/logo.svg create mode 100644 website/yarn.lock diff --git a/.eslintrc b/.eslintrc index a498537..631178f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,15 +1,13 @@ { - "extends": "eslint:recommended", - "env": { - "node": true, - "es6": true - }, - "rules": { - "strict": 0, - "semi": [ - "error", - "always" - ], - "no-octal": 0 - } -} + "parser": "@typescript-eslint/parser", + "plugins": [ + "prettier", + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:prettier/recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ] +} \ No newline at end of file diff --git a/.git-package.meta b/.git-package.meta new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.git-package.meta @@ -0,0 +1 @@ + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..8475ab0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,64 @@ +# This is a basic workflow to help you get started with Actions + +name: CI + +# Controls when the workflow will run +on: + # Triggers the workflow on push or pull request events but only for the main branch + push: + branches: [main] + pull_request: + branches: [main] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + test: + name: "Node ${{ matrix.node }} - ${{ matrix.os }}" + runs-on: ${{ matrix.os }}-latest + + strategy: + matrix: + node: ["14", "16", "latest"] + os: [ubuntu, macOS, windows] + + steps: + - uses: actions/checkout@v1 + - uses: volta-cli/action@v1 + with: + node-version: ${{ matrix.node }} + - name: install dependencies + run: npm i + - name: lint + run: npm run lint + env: + CI: true + - name: test + run: npm test + env: + CI: true + + gh-release: + if: github.event_name != 'pull_request' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16.x" + - uses: webfactory/ssh-agent@v0.5.3 + with: + ssh-private-key: ${{ secrets.GH_PAGES_DEPLOY }} + - name: install dependencies + run: npm i + - name: Release to GitHub Pages + env: + USE_SSH: true + GIT_USER: git + run: | + git config --global user.email "gabecsapo@gmail.com" + git config --global user.name "Gabriel J. Csapo" + cd packages/website + npm run deploy diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml deleted file mode 100644 index 8cb53d3..0000000 --- a/.github/workflows/node.js.yml +++ /dev/null @@ -1,32 +0,0 @@ -# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: Node.js CI - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [10.x, 12.x, 14.x, 15.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - run: git config --global user.name travis - - run: git config --global user.email travis@locahost - - run: npm install - - run: npm test - - run: npm run coverage diff --git a/.gitignore b/.gitignore index 4fd2111..9b61432 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,8 @@ coverage example/test example/tmp package-lock.json -.vs/ \ No newline at end of file +.vs/ +dist +temp +etc +build-complete.meta \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..2987c82 --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +.git-package.meta diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..8db60ca --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +{ + "singleQuote": true +} diff --git a/.tryitout b/.tryitout deleted file mode 100644 index cf355f4..0000000 --- a/.tryitout +++ /dev/null @@ -1,42 +0,0 @@ -const { name, description } = require('./package.json'); - -module.exports = { - title: name, - nav: { - Source: 'https://github.com/gabrielcsapo/node-git-server', - Docs: './code/index.html' - }, - body: ` -
-

${description}

-
-      const Server = require('node-git-server');
-      const repo = new Server(path.resolve(__dirname, 'tmp'), {
-          autoCreate: true,
-          authenticate: (type, repo, username, password, next) => {
-            console.log(type, repo, username, password);
-            next();
-          }
-      });
-      const port = process.env.PORT || 7005;
-
-      repos.listen(port, () => {
-        console.log(\`node-git-server running at http://localhost:{port}\`)
-      });
-        
-
- `, - options: { - width: '80%' - }, - footer: ` -
Made with ☕️ by @gabrielcsapo
- `, - template: 'landing', - output: './docs', - externals: [ - "./docs/krayon.css", - "./docs/krayon.min.js", - "./docs/main.js" - ] -}; diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d54091..5d981f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# 1.0.0-beta.1 (01/02/2022) + +- Migrates to typescript (@5GameMaker @gabrielcsapo) +- Removes node support from node@<14 + # 0.6.1 (03/03/2019) - Fixes bug with being able to overwrite git repos that a user doesn't have access to. @masasron diff --git a/LICENSE b/LICENSE index 2d97eee..dd12087 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2016 Gabriel Csapo +Copyright (c) 2021 Gabriel Csapo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index c9aaea4..cec491b 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ > 🎡 A configurable git server written in Node.js ->> there be 🐲 here! The APIs and functionality are still be cemented, anything before a 1.0.0 release will be subject to change. - [![Npm Version](https://img.shields.io/npm/v/node-git-server.svg)](https://www.npmjs.com/package/node-git-server) [![Build Status](https://travis-ci.org/gabrielcsapo/node-git-server.svg?branch=master)](https://travis-ci.org/gabrielcsapo/node-git-server) [![Coverage Status](https://lcov-server.gabrielcsapo.com/badge/github%2Ecom/gabrielcsapo/node-git-server.svg)](https://lcov-server.gabrielcsapo.com/coverage/github%2Ecom/gabrielcsapo/node-git-server) @@ -22,27 +20,33 @@ npm install node-git-server ## Simple -```javascript -const path = require('path'); -const Server = require('node-git-server'); +```typescript +import { Git } from 'node-git-server'; +import { join } from 'path'; -const repos = new Server(path.resolve(__dirname, 'tmp'), { - autoCreate: true -}); -const port = process.env.PORT || 7005; +const port = !process.env.PORT || isNaN(process.env.PORT) + ? 7005 + : parseInt(process.env.PORT); -repos.on('push', (push) => { - console.log(`push ${push.repo}/${push.commit} (${push.branch})`); - push.accept(); +const repos = new Git( + join(__dirname, '../repo'), + { + autoCreate: true, + } +); + +repos.on('push', push => { + console.log(`push ${push.repo}/${push.commit} ( ${push.branch} )`); + push.accept(); }); -repos.on('fetch', (fetch) => { - console.log(`fetch ${fetch.commit}`); - fetch.accept(); +repos.on("fetch", fetch => { + console.log(`fetch ${fetch.commit}`); + fetch.accept(); }); repos.listen(port, () => { - console.log(`node-git-server running at http://localhost:${port}`) + console.log(`node-git-server running at http://localhost:${port}`); }); ``` @@ -50,6 +54,7 @@ then start up the node-git-server server... ``` $ node example/index.js +node-git-server running at http://localhost:7005 ``` meanwhile... @@ -67,33 +72,41 @@ To http://localhost:7005/beep ## Sending logs -```javascript -const path = require('path'); -const Server = require('node-git-server'); +```typescript +import { Git } from 'node-git-server'; +import { join } from 'path'; + +const port = !process.env.PORT || isNaN(process.env.PORT) + ? 7005 + : parseInt(process.env.PORT); -const repos = new Server(path.resolve(__dirname, 'tmp'), { - autoCreate: true +const repos = new Git( + join(__dirname, '../repo'), + { + autoCreate: true, + } +); + +repos.on('push', async push => { + console.log(`push ${push.repo}/${push.commit} ( ${push.branch} )`); + + push.log(); + push.log('Hey!'); + push.log('Checkout these other repos:'); + for (const repo of await repo.list()) { + push.log(`- ${repo}`); + } + push.log(); + push.accept(); }); -const port = process.env.PORT || 7005; - -repos.on('push', (push) => { - console.log(`push ${push.repo}/${push.commit} (${push.branch})`); - - repos.list((err, results) => { - push.log(' '); - push.log('Hey!'); - push.log('Checkout these other repos:'); - for(const repo of results) { - push.log(`- ${repo}`); - } - push.log(' '); - }); - - push.accept(); + +repos.on("fetch", fetch => { + console.log(`fetch ${fetch.commit}`); + fetch.accept(); }); repos.listen(port, () => { - console.log(`node-git-server running at http://localhost:${port}`) + console.log(`node-git-server running at http://localhost:${port}`); }); ``` @@ -101,6 +114,7 @@ then start up the node-git-server server... ``` $ node example/index.js +node-git-server running at http://localhost:7005 ``` meanwhile... @@ -112,54 +126,51 @@ Delta compression using up to 2 threads. Compressing objects: 100% (133/133), done. Writing objects: 100% (356/356), 46.20 KiB, done. Total 356 (delta 210), reused 355 (delta 210) -remote: +remote: remote: Hey! remote: Checkout these other repos: remote: - test.git -remote: +remote: To http://localhost:7005/test 77bb26e..22918d5 master -> master ``` ### Authentication -```javascript -const path = require('path'); -const Server = require('node-git-server'); +```typescript +import { Git } from 'node-git-server'; +import { join } from 'path'; + +const port = !process.env.PORT || isNaN(process.env.PORT) + ? 7005 + : parseInt(process.env.PORT); -const repos = new Server(path.resolve(__dirname, 'tmp'), { +const repos = new Git( + join(__dirname, '../repo'), + { autoCreate: true, - authenticate: ({type, repo, user}, next) => { - if(type == 'push') { - // Decide if this user is allowed to perform this action against this repo. - user((username, password) => { - console.log(username, password); - if (accountName === '42' && password === '42') { - next(); - } else { - next('wrong password'); - } - }); - } else { - // Check these credentials are correct for this user. + autheficate: ({ type, user }, next) => + type == 'push' + ? user(([username, password]) => { + console.log(username, password); next(); - } - } -}); -const port = process.env.PORT || 7005; - -repos.on('push', (push) => { - console.log(`push ${push.repo}/${push.commit} (${push.branch})`); - push.accept(); + }) + : next() + } +); + +repos.on('push', push => { + console.log(`push ${push.repo}/${push.commit} ( ${push.branch} )`); + push.accept(); }); -repos.on('fetch', (fetch) => { - console.log(`fetch ${fetch.commit}`); - fetch.accept(); +repos.on("fetch", fetch => { + console.log(`fetch ${fetch.commit}`); + fetch.accept(); }); repos.listen(port, () => { - console.log(`node-git-server running at http://localhost:${port}`) + console.log(`node-git-server running at http://localhost:${port}`); }); ``` @@ -167,6 +178,7 @@ then start up the node-git-server server... ``` $ node example/index.js +node-git-server running at http://localhost:7005 ``` meanwhile... @@ -200,7 +212,7 @@ node example/index.js --https For more information please visit the [docs](http://www.gabrielcsapo.com/node-git-server/code/index.html) -# Philosophy +# Philosophy This library is aimed to have a zero dependency footprint. If you are reading this and you see dependencies, help to remove them 🐒. diff --git a/TODO.md b/TODO.md deleted file mode 100644 index fdcad02..0000000 --- a/TODO.md +++ /dev/null @@ -1 +0,0 @@ -- [ ] remove dependency on through diff --git a/api-extractor.json b/api-extractor.json new file mode 100644 index 0000000..9886efb --- /dev/null +++ b/api-extractor.json @@ -0,0 +1,364 @@ +/** + * Config file for API Extractor. For more info, please visit: https://api-extractor.com + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + /** + * Optionally specifies another JSON config file that this file extends from. This provides a way for + * standard settings to be shared across multiple projects. + * + * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains + * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be + * resolved using NodeJS require(). + * + * SUPPORTED TOKENS: none + * DEFAULT VALUE: "" + */ + // "extends": "./shared/api-extractor-base.json" + // "extends": "my-package/include/api-extractor-base.json" + + /** + * Determines the "" token that can be used with other config file settings. The project folder + * typically contains the tsconfig.json and package.json config files, but the path is user-defined. + * + * The path is resolved relative to the folder of the config file that contains the setting. + * + * The default value for "projectFolder" is the token "", which means the folder is determined by traversing + * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder + * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error + * will be reported. + * + * SUPPORTED TOKENS: + * DEFAULT VALUE: "" + */ + // "projectFolder": "..", + + /** + * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor + * analyzes the symbols exported by this module. + * + * The file extension must be ".d.ts" and not ".ts". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + */ + "mainEntryPointFilePath": "/dist/index.d.ts", + + /** + * A list of NPM package names whose exports should be treated as part of this package. + * + * For example, suppose that Webpack is used to generate a distributed bundle for the project "library1", + * and another NPM package "library2" is embedded in this bundle. Some types from library2 may become part + * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly + * imports library2. To avoid this, we can specify: + * + * "bundledPackages": [ "library2" ], + * + * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been + * local files for library1. + */ + "bundledPackages": [], + + /** + * Determines how the TypeScript compiler engine will be invoked by API Extractor. + */ + "compiler": { + /** + * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * Note: This setting will be ignored if "overrideTsconfig" is used. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/tsconfig.json" + */ + // "tsconfigFilePath": "/tsconfig.json", + /** + * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. + * The object must conform to the TypeScript tsconfig schema: + * + * http://json.schemastore.org/tsconfig + * + * If omitted, then the tsconfig.json file will be read from the "projectFolder". + * + * DEFAULT VALUE: no overrideTsconfig section + */ + // "overrideTsconfig": { + // . . . + // } + /** + * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended + * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when + * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses + * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. + * + * DEFAULT VALUE: false + */ + // "skipLibCheck": true, + }, + + /** + * Configures how the API report file (*.api.md) will be generated. + */ + "apiReport": { + /** + * (REQUIRED) Whether to generate an API report. + */ + "enabled": true + + /** + * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce + * a full file path. + * + * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". + * + * SUPPORTED TOKENS: , + * DEFAULT VALUE: ".api.md" + */ + // "reportFileName": ".api.md", + + /** + * Specifies the folder where the API report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, + * e.g. for an API review. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/etc/" + */ + // "reportFolder": "/etc/", + + /** + * Specifies the folder where the temporary report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * After the temporary file is written to disk, it is compared with the file in the "reportFolder". + * If they are different, a production build will fail. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/" + */ + // "reportTempFolder": "/temp/" + }, + + /** + * Configures how the doc model file (*.api.json) will be generated. + */ + "docModel": { + /** + * (REQUIRED) Whether to generate a doc model file. + */ + "enabled": true + + /** + * The output path for the doc model file. The file extension should be ".api.json". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/.api.json" + */ + // "apiJsonFilePath": "/temp/.api.json" + }, + + /** + * Configures how the .d.ts rollup file will be generated. + */ + "dtsRollup": { + /** + * (REQUIRED) Whether to generate the .d.ts rollup file. + */ + "enabled": true + + /** + * Specifies the output path for a .d.ts rollup file to be generated without any trimming. + * This file will include all declarations that are exported by the main entry point. + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/dist/.d.ts" + */ + // "untrimmedFilePath": "/dist/.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. + * This file will include only declarations that are marked as "@public" or "@beta". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "betaTrimmedFilePath": "/dist/-beta.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. + * This file will include only declarations that are marked as "@public". + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "publicTrimmedFilePath": "/dist/-public.d.ts", + + /** + * When a declaration is trimmed, by default it will be replaced by a code comment such as + * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the + * declaration completely. + * + * DEFAULT VALUE: false + */ + // "omitTrimmingComments": true + }, + + /** + * Configures how the tsdoc-metadata.json file will be generated. + */ + "tsdocMetadata": { + /** + * Whether to generate the tsdoc-metadata.json file. + * + * DEFAULT VALUE: true + */ + // "enabled": true, + /** + * Specifies where the TSDoc metadata file should be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", + * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup + * falls back to "tsdoc-metadata.json" in the package folder. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" + }, + + /** + * Specifies what type of newlines API Extractor should use when writing output files. By default, the output files + * will be written with Windows-style newlines. To use POSIX-style newlines, specify "lf" instead. + * To use the OS's default newline kind, specify "os". + * + * DEFAULT VALUE: "crlf" + */ + // "newlineKind": "crlf", + + /** + * Configures how API Extractor reports error and warning messages produced during analysis. + * + * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. + */ + "messages": { + /** + * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing + * the input .d.ts files. + * + * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "compilerMessageReporting": { + /** + * Configures the default routing for messages that don't match an explicit rule in this table. + */ + "default": { + /** + * Specifies whether the message should be written to the the tool's output log. Note that + * the "addToApiReportFile" property may supersede this option. + * + * Possible values: "error", "warning", "none" + * + * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail + * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes + * the "--local" option), the warning is displayed but the build will not fail. + * + * DEFAULT VALUE: "warning" + */ + "logLevel": "warning" + + /** + * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), + * then the message will be written inside that file; otherwise, the message is instead logged according to + * the "logLevel" option. + * + * DEFAULT VALUE: false + */ + // "addToApiReportFile": false + } + + // "TS2551": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by API Extractor during its analysis. + * + * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" + * + * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings + */ + "extractorMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "ae-extra-release-tag": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by the TSDoc parser when analyzing code comments. + * + * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "tsdocMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "tsdoc-link-tag-unescaped-text": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + } + } +} diff --git a/docs/code/Git.html b/docs/code/Git.html deleted file mode 100644 index ec8f958..0000000 --- a/docs/code/Git.html +++ /dev/null @@ -1,3028 +0,0 @@ - - - - - Git - Documentation - - - - - - - - - - - - - - - - -
- -

Git

- - - - - - - -
- -
- -

- Git -

- - -
- -
-
- - - - - -

new Git(repoDir, options)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Handles invoking the git-*-pack binaries

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repoDir - - -String -| - -function - - - -

Create a new repository collection from the directory repoDir. repoDir should be entirely empty except for git repo directories. If repoDir is a function, repoDir(repo) will be used to dynamically resolve project directories. The return value of repoDir(repo) should be a string path specifying where to put the string repo. Make sure to return the same value for repo every time since repoDir(repo) will be called multiple times.

options - - -Object - - - -

options that can be applied on the new instance being created

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
autoCreate - - -Boolean - - - - - - <optional>
- - - - - -

By default, repository targets will be created if they don't exist. You can - disable that behavior with options.autoCreate = true

authenticate - - -function - - - - - - - - - -

a function that has the following arguments ({ type, repo, username, password, headers }, next) and will be called when a request comes through if set

-
 authenticate: ({ type, repo, username, password, headers }, next) => {
-   console.log(type, repo, username, password);
-   next();
- }
- // alternatively you can also pass authenticate a promise
- authenticate: ({ type, repo, username, password, headers }, next) => {
-   console.log(type, repo, username, password);
-   return new Promise((resolve, reject) => {
-    if(username === 'foo') {
-      return resolve();
-    }
-    return reject("sorry you don't have access to this content");
-   });
- }
checkout - - -Boolean - - - - - - <optional>
- - - - - -

If opts.checkout is true, create and expected checked-out repos instead of bare repos

- -
- - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - -
    -
  • EventEmitter
  • -
- - - - - - - - - - - - - - - -

Methods

- - - - - - -

(static) close()

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

closes the server instance

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - -Promise - - - -

will resolve or reject when the server closes or fails to close.

- - - - - - - - - - - - - - - - - - - - - -

(static) create(repo, callbackopt)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Create a new bare repository repoName in the instance repository directory.

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
repo - - -String - - - - - - - - - -

the name of the repo

callback - - -function - - - - - - <optional>
- - - - - -

Optionally get a callback cb(err) to be notified when the repository was created.

- - - - - - - - - - - - - - - - - - - - - -

(static) exists(repo, callbackopt)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Find out whether repoName exists in the callback cb(exists).

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
repo - - -String - - - - - - - - - -

name of the repo

callback - - -function - - - - - - <optional>
- - - - - -

function to be called when finished

- - - - - - - - - - - - - - - - - - - - - -

(static) handle(req, res)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Handle incoming HTTP requests with a connect-style middleware

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
req - - -Object - - - -

http request object

res - - -Object - - - -

http response object

- - - - - - - - - - - - - - - - - - - - - -

(static) list(callback)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Get a list of all the repositories

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
callback - - -function - - - -

function to be called when repositories have been found function(error, repos)

- - - - - - - - - - - - - - - - - - - - - -

(static) listen(port, optionsopt, callback) → {Git}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

starts a git server on the given port

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
port - - -Number - - - - - - - - - -

the port to start the server on

options - - -Object - - - - - - <optional>
- - - - - -

the options to add extended functionality to the server

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
type - - -String - - - - - - <optional>
- - - - - -

this is either https or http (the default is http)

key - - -Buffer -| - -String - - - - - - - - - -

the key file for the https server

cert - - -Buffer -| - -String - - - - - - - - - -

the cert file for the https server

- -
callback - - -function - - - - - - - - - -

the function to call when server is started or error has occured

- - - - - - - - - - - - - - -
Returns:
- - -
-
    -
  • the Git instance, useful for chaining
  • -
-
- - - -
-
- Type -
-
- -Git - - -
-
- - - - - - - - - -

(static) mkdir(dir, callbackopt)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Create a subdirectory dir in the repo dir with a callback cb(err).

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
dir - - -String - - - - - - - - - -

directory name

callback - - -function - - - - - - <optional>
- - - - - -

callback to be called when finished

- - - - - - - - - - - - - - - - - - - - - - -

Events

- - - - - - -

fetch

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
fetch - - -HttpDuplex - - - -

an http duplex object (see below) with these extra properties:

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repo - - -String - - - -

the string that defines the repo

commit - - -String - - - -

the string that defines the commit sha

- -
- - - - - - - - - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - -
Example
- -
repos.on('fetch', function (fetch) { ... }
-
-    Emitted when somebody does a `git fetch` to the repo (which happens whenever you
-    do a `git pull` or a `git clone`).
-
-    Exactly one listener must call `fetch.accept()` or `fetch.reject()`. If there are
-    no listeners, `fetch.accept()` is called automatically.
- - - - - - - - - - - - - - - - - - - - - - - -

head

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
head - - -HttpDuplex - - - -

an http duplex object (see below) with these extra properties:

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repo - - -String - - - -

the string that defines the repo

- -
- - - - - - - - - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - -
Example
- -
repos.on('head', function (head) { ... }
-
-    Emitted when the repo is queried for HEAD before doing other commands.
-
-    Exactly one listener must call `head.accept()` or `head.reject()`. If there are
-    no listeners, `head.accept()` is called automatically.
- - - - - - - - - - - - - - - - - - - - - - - -

info

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
info - - -HttpDuplex - - - -

an http duplex object (see below) with these extra properties:

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repo - - -String - - - -

the string that defines the repo

- -
- - - - - - - - - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - -
Example
- -
repos.on('info', function (info) { ... }
-
-    Emitted when the repo is queried for info before doing other commands.
-
-    Exactly one listener must call `info.accept()` or `info.reject()`. If there are
-    no listeners, `info.accept()` is called automatically.
- - - - - - - - - - - - - - - - - - - - - - - -

info

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
info - - -HttpDuplex - - - -

an http duplex object (see below) with these extra properties:

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repo - - -String - - - -

the string that defines the repo

- -
- - - - - - - - - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - -
Example
- -
repos.on('info', function (info) { ... }
-
-    Emitted when the repo is queried for info before doing other commands.
-
-    Exactly one listener must call `info.accept()` or `info.reject()`. If there are
-    no listeners, `info.accept()` is called automatically.
- - - - - - - - - - - - - - - - - - - - - - - -

push

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
push - - -HttpDuplex - - - -

is a http duplex object (see below) with these extra properties

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repo - - -String - - - -

the string that defines the repo

commit - - -String - - - -

the string that defines the commit sha

branch - - -String - - - -

the string that defines the branch

- -
- - - - - - - - - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - -
Example
- -
repos.on('push', function (push) { ... }
-
-    Emitted when somebody does a `git push` to the repo.
-
-    Exactly one listener must call `push.accept()` or `push.reject()`. If there are
-    no listeners, `push.accept()` is called automatically.
- - - - - - - - - - - - - - - - - - - - - - - -

tag

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
Properties:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
tag - - -HttpDuplex - - - -

an http duplex object (see below) with these extra properties:

-
Properties
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repo - - -String - - - -

the string that defines the repo

commit - - -String - - - -

the string that defines the commit sha

version - - -String - - - -

the string that defines the repo

- -
- - - - - - - - - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - -
Example
- -
repos.on('tag', function (tag) { ... }
-
-    Emitted when somebody does a `git push --tags` to the repo.
-    Exactly one listener must call `tag.accept()` or `tag.reject()`. If there are
-    No listeners, `tag.accept()` is called automatically.
- - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
- - - - - - - \ No newline at end of file diff --git a/docs/code/HttpDuplex.html b/docs/code/HttpDuplex.html deleted file mode 100644 index 0aa4144..0000000 --- a/docs/code/HttpDuplex.html +++ /dev/null @@ -1,4380 +0,0 @@ - - - - - HttpDuplex - Documentation - - - - - - - - - - - - - - - - -
- -

HttpDuplex

- - - - - - - -
- -
- -

- HttpDuplex -

- - -
- -
-
- - - - - -

new HttpDuplex(input, output)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Constructs a proxy object over input and output resulting in a unified stream. -Generally meant to combine request and response streams in the http.request event

-
- - - - - - - - - -
Example
- -

A simple example is shown below

- -
http.createServer(function (req, res) {
-    var dup = new HttpDuplex(req, res);
-    res.end("Request: " + req.method + " " + req.url);
-}).listen(80);
- - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -http.IncomingMessage - - - -

client request object from request event

output - - -http.ServerResponse - - - -

response object from request event

- - - - -
Requires:
-
    -
  • module:events
  • -
- - - - - - - - - - - - - - -
- - -

Extends

- - - - -
    -
  • EventEmitter
  • -
- - - - - -

Requires

- -
    -
  • module:events
  • -
- - - - - - - - - -

Members

- - - -

(readonly) headers :Object

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Request/response headers. Key-value pairs of header names and values. Header names are always lower-case.

-
- - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - - - - -

(readonly) connection :net.Socket

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Reference to the underlying socket for the request connection.

-
- - - -
Type:
-
    -
  • - -net.Socket - - -
  • -
- - - - - - - - -

(readonly) method :String

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Request method of the incoming request.

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - -
Example
- -
'GET', 'DELETE'
- - - - - -

(readonly) readable :Boolean

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Is this stream readable.

-
- - - -
Type:
-
    -
  • - -Boolean - - -
  • -
- - - - - - - - -

req :http.IncomingMessage

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

A IncomingMessage created by http.Server or http.ClientRequest usually passed as the -first parameter to the 'request' and 'response' events. Implements Readable Stream interface -but may not be a decendant thereof.

-
- - - -
Type:
-
    -
  • - -http.IncomingMessage - - -
  • -
- - - - - - - - -

res :http.ServerResponse

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Created http.server. Passed as the second parameter to the 'request' event. -The response implements Writable Stream interface but isn't a descendent thereof.

-
- - - -
Type:
-
    -
  • - -http.ServerResponse - - -
  • -
- - - - - - - - -

(readonly) socket :net.Socket

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

net.Socket object associated with the connection.

-
- - - -
Type:
-
    -
  • - -net.Socket - - -
  • -
- - - - - - - - -

statusCode :Number

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
Default Value:
-
    -
  • 200
  • -
- - - - - -
See:
-
- -
- - - -
- - - - - -
-

The HTTP status code. Generally assigned before sending headers for a response to a client.

-
- - - -
Type:
-
    -
  • - -Number - - -
  • -
- - - - - -
Example
- -
request.statusCode = 404;
- - - - - -

statusMessage :String

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
Default Value:
-
    -
  • undefined
  • -
- - - - - -
See:
-
- -
- - - -
- - - - - -
-

Controls the status message sent to the client as long as an explicit call to response.writeHead() isn't made -If ignored or the value is undefined, the default message corresponding to the status code will be used.

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - -
Example
- -
request.statusMessage = 'Document Not found';
- - - - - -

(readonly) trailers :Object

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Request/response trailer headers. Just like headers except these are only written -after the initial response to the client. -This object is only populated at the 'end' event and only work if a 'transfer-encoding: chunked' -header is sent in the initial response.

-
- - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - - - - -

(readonly) upgrade :Boolean

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Whether or not the client connection has been upgraded

-
- - - -
Type:
-
    -
  • - -Boolean - - -
  • -
- - - - - - - - -

(readonly) url :String

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Request URL string.

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - -
Examples
- -

A request made as:

- -
GET /info?check=none HTTP/1.1
- -

Will return the string

- -
'/info?check=none'
- - - - - -

(readonly) httpVersion :String

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Requested HTTP Version sent by the client. Usually either '1.0' or '1.1'

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - - - - -

(readonly) httpVersionMajor :Number

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

First integer in the httpVersion string

-
- - - -
Type:
-
    -
  • - -Number - - -
  • -
- - - - - - - - -

(readonly) httpVersionMinor :String

- - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Second integer ni the httpVersion string

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - - - - - - -

Methods

- - - - - - -

addTrailers(headers)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Adds trailing headers to the response. -Trailers will only be emitted if chunked encoding is enabled for the response; otherwise they are discarded.

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
headers - - -Object - - - -

Trailing headers to add to the response

- - - - - - - - - - - - - - - - - - - - - -

cork() → {this}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Buffers written data in memory. This data will be flushed when either the uncork or end methods are called.

-
- - - - - - - - - -
Example
- -
request.cork();
-request.write('buffer data ');
-request.write('before sending ');
-request.uncork();
- - - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - -

destroy()

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Destroys object and it's bound streams

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

end(data, encoding, callback)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Tells the server the response headers and body have been sent and that the message should be considered complete. -This MUST be called on every response. -If data is specified, this behaves as if calling response.write(data, encoding) followed by response.end(callback). -If specified, the callback is called once the response stream is finished.

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
data - - -string -| - -Buffer - - - -

optional data to write to the response before closing the connection

encoding - - -String - - - -

Encoding that should be used to write the data

callback - - -function - - - -

Function to be called once the response stream is finished

- - - - - - - - - - - - - - - - - - - - - -

getHeader(name) → {String}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Returns the current value of a header; name is case insensitive.

-
- - - - - - - - - -
Example
- -
let contentType = request.getHeader('Content-Type');
- - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -String - - - -

Header to get the value of

- - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -String - - -
-
- - - - - - - - - -

pause()

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Switch readable stream out of flowing mode and stop emitting 'data' events. -Any new data that becomes available during this time will stay buffered until resume is called.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

removeHeader(name)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Remove a header from the response headers.

-
- - - - - - - - - -
Example
- -
request.removeHeader('Content-Type');
- - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -String - - - -

Header to remove

- - - - - - - - - - - - - - - - - - - - - -

resume()

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Switch readable stream back into flowing mode and restart emitting 'data' events. -This can be used to consume all data waiting without processing any of it.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

setDefaultEncoding(encoding)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Sets the character encoding for data written to the stream.

-
- - - - - - - - - -
Example
- -
request.setDefaultEncoding('utf8');
- - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
encoding - - -String - - - -

new character encoding

- - - - - - - - - - - - - - - - - - - - - -

setEncoding(encoding)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Sets the character encoding for data read from the stream.

-
- - - - - - - - - -
Example
- -
request.setEncoding('utf8');
- - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
encoding - - -String - - - -

new character encoding

- - - - - - - - - - - - - - - - - - - - - -

setHeader(name, value)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Set a single header. If the header already exists, it will be replaced. -It's possible to use an array of strings in place of value to send multiple headers with the same name.

-
- - - - - - - - - -
Examples
- -

Single value

- -
request.setHeader('Content-Type', 'text/html');
- -

Array of string value

- -
request.setHeader('Set-Cookie', ['type=auth', 'language=javascript']);
- - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -String - - - -

Header to set

value - - -string -| - -Array.<string> - - - -

Value(s) to assign to header

- - - - - - - - - - - - - - - - - - - - - -

uncork() → {this}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Flushes all data buffered since cork() was called.

-
- - - - - - - - - - - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - -

write(chunk, encodingopt, callbackopt) → {Boolean}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Sends a chunk of the response body. This method may be called multiple times to provide successive parts of the -body.

-

Note: If write() is called either before writeHead() or writeHead() just hasn't been called, it will switch * modes and flush the implicit headers that may be waiting before parts of this chunk are sent.

-Node will buffer up to the first chunk of the body. Any additional calls to write() may be buffered as well -for packet efficiency purposes.

-Returns true if the entire data was flushed successfully to the kernel buffer. Returns false if all or part of -the data was buffered in memory.

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDefaultDescription
chunk - - -string -| - -Buffer - - - - - - - - - - - -

chunk of data to send.

encoding - - -String - - - - - - <optional>
- - - - - -
- - 'utf8' - -

If chunk is a string, this specifies how to encode it into a byte stream.

callback - - -function - - - - - - <optional>
- - - - - -
- -

Callback to call when this chunk of data is flushed.

- - - - - - -
Fires:
-
    -
  • event:drain Emitted when data was buffered and the buffer has become free for use again.
  • -
- - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Boolean - - -
-
- - - - - - - - - -

writeContinue()

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Sends an HTTP/1.1 100 Continue message to the client.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

writeHead(statusCode, statusMessageopt, headersopt) → {this}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Sends a response header to the client request. Must only be called one time and before calling response.end().

-
- - - - - - - - - -
Example
- -
var content = 'Under Construction...';
-response.writeHead(200, {
-    'Content-Length': Buffer.byteLength(content),
-    'Content-Type': 'text/plain' 
-});
-response.end(content);
- - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeAttributesDescription
statusCode - - -number - - - - - - - - - -

3-digit HTTP status code, like 404

statusMessage - - -string - - - - - - <optional>
- - - - - -

An optional human readable status message to send with the status code

headers - - -object - - - - - - <optional>
- - - - - -

An object containing the response headers to send

- - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -this - - -
-
- - - - - - - - - -

writeHeader()

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - -
Deprecated:
- - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Warning: This has been deprecated in node, don't use it. Any apis that require this funtion should be -updated to use writeHead insted.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Events

- - - - - - -

close

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Event emitted when the underlying request connection is closed. This only occurs once per response.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

data

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

This event is emitted when data on the stream can be consumed. This may occur whenever the stream is switched into -flowing mode by calling readable.pipe() or readable.resume() or by attaching a listener this event.

-This event is emitted when readable.read() is called and a chunk of data becomes available. -Data will be passed as a string if the default encoding has been set using readable.setEncoding(); otherwise it's -passed as a Buffer.

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
chunk - - -string -| - -buffer -| - -any - - - -

The chunk is either a buffer or string when the stream isn't operating - in object mode. When the stream is in object mode, the chunk can be any JavaScript value other than null.

- - - - - - - - - - - - - - - - - - - - - -

drain

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

If a call to response.write(chunk) returns false, the drain event will be emitted once it is appropriate to -resume writing data to the stream.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

end

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

This event is emitted once no more consumable data is left on the readable stream.

-Note: This is only emitted when all data is completely consumed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

error

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

This event may be emitted one of the underlying Readable or Writable stream implementations at any time. -This may happen in the following cases:

-
    -
  • if the underlying streams are unable to produce data because of an internal failure
  • -
  • if an attempt is made to push an invalid chunk of data.
  • -
  • if an error occurred while writing or piping data.

  • -
-

The listener callback will be passed a single Error object.
-Note: Streams are not closed when the event is emitted.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
- - - - - - - \ No newline at end of file diff --git a/docs/code/Service.html b/docs/code/Service.html deleted file mode 100644 index 4a74a7b..0000000 --- a/docs/code/Service.html +++ /dev/null @@ -1,1503 +0,0 @@ - - - - - Service - Documentation - - - - - - - - - - - - - - - - -
- -

Service

- - - - - - - -
- -
- -

- Service -

- - -
- -
-
- - - - - -

new Service(opts, req, res)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Handles invoking the git-*-pack binaries

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opts - - -Object - - - -

options to bootstrap the service object

req - - -http.IncomingMessage - - - -

http request object

res - - -http.ServerResponse - - - -

http response

- - - - - - - - - - - - - - - - - -
- - -

Extends

- - - - - - - - - - - - - - - - - - -

Members

- - - -

(readonly) connection :net.Socket

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Reference to the underlying socket for the request connection.

-
- - - -
Type:
-
    -
  • - -net.Socket - - -
  • -
- - - - - - - - -

(readonly) method :String

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Request method of the incoming request.

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - -
Example
- -
'GET', 'DELETE'
- - - - - -

(readonly) readable :Boolean

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Is this stream readable.

-
- - - -
Type:
-
    -
  • - -Boolean - - -
  • -
- - - - - - - - -

req :http.IncomingMessage

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

A IncomingMessage created by http.Server or http.ClientRequest usually passed as the -first parameter to the 'request' and 'response' events. Implements Readable Stream interface -but may not be a decendant thereof.

-
- - - -
Type:
-
    -
  • - -http.IncomingMessage - - -
  • -
- - - - - - - - -

res :http.ServerResponse

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Created http.server. Passed as the second parameter to the 'request' event. -The response implements Writable Stream interface but isn't a descendent thereof.

-
- - - -
Type:
-
    -
  • - -http.ServerResponse - - -
  • -
- - - - - - - - -

(readonly) socket :net.Socket

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

net.Socket object associated with the connection.

-
- - - -
Type:
-
    -
  • - -net.Socket - - -
  • -
- - - - - - - - -

statusCode :Number

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - -
Default Value:
-
    -
  • 200
  • -
- - - - - -
See:
-
- -
- - - -
- - - - - -
-

The HTTP status code. Generally assigned before sending headers for a response to a client.

-
- - - -
Type:
-
    -
  • - -Number - - -
  • -
- - - - - -
Example
- -
request.statusCode = 404;
- - - - - -

statusMessage :String

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - -
Default Value:
-
    -
  • undefined
  • -
- - - - - -
See:
-
- -
- - - -
- - - - - -
-

Controls the status message sent to the client as long as an explicit call to response.writeHead() isn't made -If ignored or the value is undefined, the default message corresponding to the status code will be used.

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - -
Example
- -
request.statusMessage = 'Document Not found';
- - - - - -

(readonly) trailers :Object

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Request/response trailer headers. Just like headers except these are only written -after the initial response to the client. -This object is only populated at the 'end' event and only work if a 'transfer-encoding: chunked' -header is sent in the initial response.

-
- - - -
Type:
-
    -
  • - -Object - - -
  • -
- - - - - - - - -

(readonly) upgrade :Boolean

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - -
See:
-
- -
- - - -
- - - - - -
-

Whether or not the client connection has been upgraded

-
- - - -
Type:
-
    -
  • - -Boolean - - -
  • -
- - - - - - - - -

(readonly) url :String

- - - - - -
- - -
Source:
-
- - - - - - - -
Inherited From:
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

Request URL string.

-
- - - -
Type:
-
    -
  • - -String - - -
  • -
- - - - - -
Examples
- -

A request made as:

- -
GET /info?check=none HTTP/1.1
- -

Will return the string

- -
'/info?check=none'
- - - - - - - -

Methods

- - - - - - -

(static) accept()

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

accepts request to access resource

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(static) reject(code, msg)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

reject request in flight

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
code - - -Number - - - -

http response code

msg - - -String - - - -

message that should be displayed on teh client

- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
- - - - - - - \ No newline at end of file diff --git a/docs/code/git.js.html b/docs/code/git.js.html deleted file mode 100644 index 2229a3a..0000000 --- a/docs/code/git.js.html +++ /dev/null @@ -1,529 +0,0 @@ - - - - - git.js - Documentation - - - - - - - - - - - - - - - - -
- -

git.js

- - - - - - - -
-
-
const fs = require('fs');
-const path = require('path');
-const http = require('http');
-const https = require('https');
-const url = require('url');
-const qs = require('querystring');
-const httpDuplex = require('./http-duplex');
-
-const { spawn } = require('child_process');
-const { EventEmitter } = require('events');
-
-const { parseGitName, createAction, infoResponse, onExit, basicAuth, noCache } = require('./util');
-
-const services = ['upload-pack', 'receive-pack'];
-
-/**
-  * @event Git#push
-  * @type {Object}
-  * @property {HttpDuplex} push - is a http duplex object (see below) with these extra properties
-  * @property {String} push.repo - the string that defines the repo
-  * @property {String} push.commit - the string that defines the commit sha
-  * @property {String} push.branch - the string that defines the branch
-  * @example
-    repos.on('push', function (push) { ... }
-
-    Emitted when somebody does a `git push` to the repo.
-
-    Exactly one listener must call `push.accept()` or `push.reject()`. If there are
-    no listeners, `push.accept()` is called automatically.
-  *
-**/
-
-/**
-  * @event Git#tag
-  * @type {Object}
-  * @property {HttpDuplex} tag - an http duplex object (see below) with these extra properties:
-  * @property {String} tag.repo - the string that defines the repo
-  * @property {String} tag.commit - the string that defines the commit sha
-  * @property {String} tag.version - the string that defines the repo
-  * @example
-    repos.on('tag', function (tag) { ... }
-
-    Emitted when somebody does a `git push --tags` to the repo.
-    Exactly one listener must call `tag.accept()` or `tag.reject()`. If there are
-    No listeners, `tag.accept()` is called automatically.
-  *
-**/
-
-/**
-  * @event Git#fetch
-  * @type {Object}
-  * @property {HttpDuplex} fetch - an http duplex object (see below) with these extra properties:
-  * @property {String} fetch.repo - the string that defines the repo
-  * @property {String} fetch.commit - the string that defines the commit sha
-  * @example
-    repos.on('fetch', function (fetch) { ... }
-
-    Emitted when somebody does a `git fetch` to the repo (which happens whenever you
-    do a `git pull` or a `git clone`).
-
-    Exactly one listener must call `fetch.accept()` or `fetch.reject()`. If there are
-    no listeners, `fetch.accept()` is called automatically.
-  *
-*/
-
-/**
-  * @event Git#info
-  * @type {Object}
-  * @property {HttpDuplex} info - an http duplex object (see below) with these extra properties:
-  * @property {String} info.repo - the string that defines the repo
-  * @example
-    repos.on('info', function (info) { ... }
-
-    Emitted when the repo is queried for info before doing other commands.
-
-    Exactly one listener must call `info.accept()` or `info.reject()`. If there are
-    no listeners, `info.accept()` is called automatically.
-  *
-*/
-
-/**
-  * @event Git#info
-  * @type {Object}
-  * @property {HttpDuplex} info - an http duplex object (see below) with these extra properties:
-  * @property {String} info.repo - the string that defines the repo
-  * @example
-    repos.on('info', function (info) { ... }
-
-    Emitted when the repo is queried for info before doing other commands.
-
-    Exactly one listener must call `info.accept()` or `info.reject()`. If there are
-    no listeners, `info.accept()` is called automatically.
-  *
-*/
-
-/**
-  * @event Git#head
-  * @type {Object}
-  * @property {HttpDuplex} head - an http duplex object (see below) with these extra properties:
-  * @property {String} head.repo - the string that defines the repo
-  * @example
-    repos.on('head', function (head) { ... }
-
-    Emitted when the repo is queried for HEAD before doing other commands.
-
-    Exactly one listener must call `head.accept()` or `head.reject()`. If there are
-    no listeners, `head.accept()` is called automatically.
-  *
-*/
-
-class Git extends EventEmitter {
-  /**
-   *
-   * Handles invoking the git-*-pack binaries
-   * @class Git
-   * @extends EventEmitter
-   * @param  {(String|Function)}    repoDir   - Create a new repository collection from the directory `repoDir`. `repoDir` should be entirely empty except for git repo directories. If `repoDir` is a function, `repoDir(repo)` will be used to dynamically resolve project directories. The return value of `repoDir(repo)` should be a string path specifying where to put the string `repo`. Make sure to return the same value for `repo` every time since `repoDir(repo)` will be called multiple times.
-   * @param  {Object}    options - options that can be applied on the new instance being created
-   * @param  {Boolean=}  options.autoCreate - By default, repository targets will be created if they don't exist. You can
-   disable that behavior with `options.autoCreate = true`
-   * @param  {Function}  options.authenticate - a function that has the following arguments ({ type, repo, username, password, headers }, next) and will be called when a request comes through if set
-   *
-     authenticate: ({ type, repo, username, password, headers }, next) => {
-       console.log(type, repo, username, password);
-       next();
-     }
-     // alternatively you can also pass authenticate a promise
-     authenticate: ({ type, repo, username, password, headers }, next) => {
-       console.log(type, repo, username, password);
-       return new Promise((resolve, reject) => {
-        if(username === 'foo') {
-          return resolve();
-        }
-        return reject("sorry you don't have access to this content");
-       });
-     }
-   * @param  {Boolean=}  options.checkout - If `opts.checkout` is true, create and expected checked-out repos instead of bare repos
-  */
-  constructor(repoDir, options={}) {
-    super();
-
-    if(typeof repoDir === 'function') {
-        this.dirMap = repoDir;
-    } else {
-        this.dirMap = (dir) => {
-            return (path.normalize(dir ? path.resolve(repoDir, dir) : repoDir));
-        };
-    }
-
-    this.authenticate = options.authenticate;
-    this.autoCreate = options.autoCreate === false ? false : true;
-    this.checkout = options.checkout;
-  }
-  /**
-   * Get a list of all the repositories
-   * @method list
-   * @memberof Git
-   * @param  {Function} callback function to be called when repositories have been found `function(error, repos)`
-   */
-  list(callback) {
-      fs.readdir(this.dirMap(), (error, results) => {
-        if(error) return callback(error);
-        let repos = results.filter((r) => {
-          return r.substring(r.length - 3, r.length) == 'git';
-        }, []);
-
-        callback(null, repos);
-      });
-  }
-  /**
-   * Find out whether `repoName` exists in the callback `cb(exists)`.
-   * @method exists
-   * @memberof Git
-   * @param  {String}   repo - name of the repo
-   * @param  {Function=} callback - function to be called when finished
-   */
-  exists(repo, callback) {
-      fs.exists(this.dirMap(repo), callback);
-  }
-  /**
-   * Create a subdirectory `dir` in the repo dir with a callback `cb(err)`.
-   * @method mkdir
-   * @memberof Git
-   * @param  {String}   dir - directory name
-   * @param  {Function=} callback  - callback to be called when finished
-   */
-  mkdir(dir, callback) {
-      // TODO: remove sync operations
-      const parts = this.dirMap(dir).split(path.sep);
-      for(var i = 0; i <= parts.length; i++) {
-          const directory = parts.slice(0, i).join(path.sep);
-          if(directory && !fs.existsSync(directory)) {
-              fs.mkdirSync(directory);
-          }
-      }
-      callback();
-  }
-  /**
-   * Create a new bare repository `repoName` in the instance repository directory.
-   * @method create
-   * @memberof Git
-   * @param  {String}   repo - the name of the repo
-   * @param  {Function=} callback - Optionally get a callback `cb(err)` to be notified when the repository was created.
-   */
-  create(repo, callback) {
-      var self = this;
-      if (typeof callback !== 'function') callback = function () {};
-
-      if (!/\.git$/.test(repo)) repo += '.git';
-
-      self.exists(repo, function (ex) {
-          if (!ex) {
-              self.mkdir(repo, next);
-          } else {
-              next();
-          }
-      });
-
-      function next (err) {
-          if (err) return callback(err);
-
-          var ps, error = '';
-
-          var dir = self.dirMap(repo);
-          if (self.checkout) {
-              ps = spawn('git', [ 'init', dir ]);
-          }
-          else {
-              ps = spawn('git', [ 'init', '--bare', dir ]);
-          }
-
-          ps.stderr.on('data', function (buf) { error += buf; });
-          onExit(ps, function (code) {
-              if (!callback) { return; }
-              else if (code) callback(error || true);
-              else callback(null);
-          });
-      }
-  }
-  /**
-   * returns the typeof service being process
-   * @method getType
-   * @param  {String} service - the service type
-   * @return {String}  - will respond with either upload or download
-   */
-  getType(service) {
-    switch(service) {
-      case 'upload-pack':
-        return 'fetch';
-      case 'receive-pack':
-        return 'push';
-      default:
-        return 'unknown';
-    }
-  }
-  /**
-   * Handle incoming HTTP requests with a connect-style middleware
-   * @method handle
-   * @memberof Git
-   * @param  {Object} req - http request object
-   * @param  {Object} res - http response object
-   */
-  handle(req, res) {
-      const handlers = [
-        function(req, res) {
-            if (req.method !== 'GET') return false;
-
-            var self = this;
-            var u = url.parse(req.url);
-            var m = u.pathname.match(/\/(.+)\/info\/refs$/);
-            if (!m) return false;
-            if (/\.\./.test(m[1])) return false;
-
-            var repo = m[1];
-            var params = qs.parse(u.query);
-            if (!params.service) {
-                res.statusCode = 400;
-                res.end('service parameter required');
-                return;
-            }
-
-            var service = params.service.replace(/^git-/, '');
-            if (services.indexOf(service) < 0) {
-                res.statusCode = 405;
-                res.end('service not available');
-                return;
-            }
-
-            var repoName = parseGitName(m[1]);
-            var next = (error) => {
-              if(error) {
-                res.setHeader("Content-Type", 'text/plain');
-                res.setHeader("WWW-Authenticate", 'Basic realm="authorization needed"');
-                res.writeHead(401);
-                res.end(typeof error === 'string' ? error : error.toString());
-                return;
-              } else {
-                return infoResponse(self, repo, service, req, res);
-              }
-            };
-
-            // check if the repo is authenticated
-            if(this.authenticate) {
-                const type = this.getType(service);
-                const headers = req.headers;
-                const user = basicAuth.bind(null, req, res);
-                const promise = this.authenticate({ type, repo: repoName, user, headers }, (error) => {
-                  return next(error);
-                });
-
-                if(promise instanceof Promise) {
-                  return promise
-                    .then(next)
-                    .catch(next);
-                }
-            } else {
-              return next();
-            }
-        },
-        function(req, res) {
-            if (req.method !== 'GET') return false;
-
-            var u = url.parse(req.url);
-            var m = u.pathname.match(/^\/(.+)\/HEAD$/);
-            if (!m) return false;
-            if (/\.\./.test(m[1])) return false;
-
-            var self = this;
-            var repo = m[1];
-
-            var next = () => {
-                const file = self.dirMap(path.join(m[1], 'HEAD'));
-                self.exists(file, (ex) => {
-                    if (ex) fs.createReadStream(file).pipe(res);
-                    else {
-                        res.statusCode = 404;
-                        res.end('not found');
-                    }
-                });
-            };
-
-            self.exists(repo, (ex) => {
-                const anyListeners = self.listeners('head').length > 0;
-                const dup = new httpDuplex(req, res);
-                dup.exists = ex;
-                dup.repo = repo;
-                dup.cwd = self.dirMap(repo);
-
-                dup.accept = dup.emit.bind(dup, 'accept');
-                dup.reject = dup.emit.bind(dup, 'reject');
-
-                dup.once('reject', (code) => {
-                    dup.statusCode = code || 500;
-                    dup.end();
-                });
-
-                if (!ex && self.autoCreate) {
-                    dup.once('accept', (dir) => {
-                        self.create(dir || repo, next);
-                    });
-                    self.emit('head', dup);
-                    if (!anyListeners) dup.accept();
-                } else if (!ex) {
-                    res.statusCode = 404;
-                    res.setHeader('content-type', 'text/plain');
-                    res.end('repository not found');
-                } else {
-                    dup.once('accept', next);
-                    self.emit('head', dup);
-                    if (!anyListeners) dup.accept();
-                }
-            });
-        },
-        function(req, res) {
-            if (req.method !== 'POST') return false;
-            var m = req.url.match(/\/(.+)\/git-(.+)/);
-            if (!m) return false;
-            if (/\.\./.test(m[1])) return false;
-
-            var self = this;
-            var repo = m[1],
-                service = m[2];
-
-            if (services.indexOf(service) < 0) {
-                res.statusCode = 405;
-                res.end('service not available');
-                return;
-            }
-
-            res.setHeader('content-type', 'application/x-git-' + service + '-result');
-            noCache(res);
-
-            var action = createAction({
-                repo: repo,
-                service: service,
-                cwd: self.dirMap(repo)
-            }, req, res);
-
-            action.on('header', () => {
-                var evName = action.evName;
-                var anyListeners = self.listeners(evName).length > 0;
-                self.emit(evName, action);
-                if (!anyListeners) action.accept();
-            });
-        },
-        (req, res) => {
-            if (req.method !== 'GET' && req.method !== 'POST') {
-                res.statusCode = 405;
-                res.end('method not supported');
-            } else {
-                return false;
-            }
-        },
-        (req, res) => {
-            res.statusCode = 404;
-            res.end('not found');
-        }
-      ];
-      res.setHeader('connection', 'close');
-      var self = this;
-      (function next(ix) {
-          var done = () => {
-              next(ix + 1);
-          };
-          var x = handlers[ix].call(self, req, res, done);
-          if (x === false) next(ix + 1);
-      })(0);
-  }
-  /**
-   * starts a git server on the given port
-   * @method listen
-   * @memberof Git
-   * @param  {Number}   port     - the port to start the server on
-   * @param  {Object=}   options  - the options to add extended functionality to the server
-   * @param  {String=}   options.type - this is either https or http (the default is http)
-   * @param  {Buffer|String=}   options.key - the key file for the https server
-   * @param  {Buffer|String=}   options.cert - the cert file for the https server
-   * @param  {Function} callback - the function to call when server is started or error has occured
-   * @return {Git}  - the Git instance, useful for chaining
-   */
-  listen(port, options, callback) {
-      const self = this;
-      if(typeof options == 'function' || !options) {
-        callback = options;
-        options = { type: 'http' };
-      }
-      const createServer = options.type == 'http' ? http.createServer : https.createServer.bind(this, options);
-
-      this.server = createServer(function(req, res) {
-          self.handle(req, res);
-      });
-
-      this.server.listen(port, callback);
-      return this;
-  }
-  /**
-   * closes the server instance
-   * @method close
-   * @memberof Git
-   * @param {Promise} - will resolve or reject when the server closes or fails to close.
-   */
-  close() {
-      return new Promise((resolve, reject) => {
-          this.server.close((err) => {
-              err ? reject(err) : resolve();
-          });
-      });
-  }
-}
-
-module.exports = Git;
-
-
-
- - - - -
- -
- - - - - - - diff --git a/docs/code/global.html b/docs/code/global.html deleted file mode 100644 index cd62fad..0000000 --- a/docs/code/global.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - Global - Documentation - - - - - - - - - - - - - - - - -
- -

Global

- - - - - - - -
- -
- -

- -

- - -
- -
-
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - -

getType(service) → {String}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

returns the typeof service being process

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
service - - -String - - - -

the service type

- - - - - - - - - - - - - - -
Returns:
- - -
-
    -
  • will respond with either upload or download
  • -
-
- - - -
-
- Type -
-
- -String - - -
-
- - - - - - - - - - -
- -
- - - - -
- -
- - - - - - - \ No newline at end of file diff --git a/docs/code/http-duplex.js.html b/docs/code/http-duplex.js.html deleted file mode 100644 index c6e7816..0000000 --- a/docs/code/http-duplex.js.html +++ /dev/null @@ -1,577 +0,0 @@ - - - - - http-duplex.js - Documentation - - - - - - - - - - - - - - - - -
- -

http-duplex.js

- - - - - - - -
-
-
const EventEmitter = require('events');
-
-class HttpDuplex extends EventEmitter {
-    /**
-     * Constructs a proxy object over input and output resulting in a unified stream.
-     * Generally meant to combine request and response streams in the http.request event
-     * @class HttpDuplex
-     * @param {http.IncomingMessage} input - client request object from request event
-     * @param {http.ServerResponse} output - response object from request event
-     * @requires events
-     * @extends EventEmitter
-     * @see {@link https://nodejs.org/api/http.html#http_event_request|request}
-     * @see {@link https://nodejs.org/api/http.html#http_class_http_incomingmessage|http.IncomingMessage}
-     * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse}
-     * @example <caption>A simple example is shown below</caption>
-     * http.createServer(function (req, res) {
-     *     var dup = new HttpDuplex(req, res);
-     *     res.end("Request: " + req.method + " " + req.url);
-     * }).listen(80);
-     */
-    constructor(input, output) {
-        super();
-
-        /**
-          * A IncomingMessage created by http.Server or http.ClientRequest usually passed as the
-          * first parameter to the 'request' and 'response' events. Implements Readable Stream interface
-          * but may not be a decendant thereof.
-          * @type {http.IncomingMessage}
-          * @see {@link https://nodejs.org/api/http.html#http_event_request|request}
-          * @see {@link https://nodejs.org/api/http.html#http_class_http_incomingmessage|http.IncomingMessage}
-          *
-          */
-        this.req = input;
-
-        /**
-          * Created http.server. Passed as the second parameter to the 'request' event.
-          * The response implements Writable Stream interface but isn't a descendent thereof.
-          * @type {http.ServerResponse}
-          * @see {@link https://nodejs.org/api/http.html#http_event_request|request}
-          * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse}
-          */
-        this.res = output;
-
-        var self = this;
-
-        // request / input proxy events
-        ['data', 'end', 'error', 'close'].forEach(function (name) {
-            self.req.on(name, self.emit.bind(self, name));
-        });
-
-        // respone / output proxy events
-        ['error', 'drain'].forEach(function (name) {
-            self.res.on(name, self.emit.bind(self, name));
-        });
-    }
-
-    // input / request wrapping
-    get client() {
-        return this.req.client;
-    }
-
-    get complete() {
-        return this.req.complete;
-    }
-
-    /**
-      * Reference to the underlying socket for the request connection.
-      * @type {net.Socket}
-      * @readonly
-      * @see {@link https://nodejs.org/api/http.html#http_request_socket|request.Socket}
-      */
-    get connection() {
-        return this.req.connection;
-    }
-
-    /**
-     * Request/response headers. Key-value pairs of header names and values. Header names are always lower-case.
-     * @name headers
-     * @alias HttpDuplex.headers
-     * @memberof HttpDuplex
-     * @type {Object}
-     * @readonly
-     * @see {@link https://nodejs.org/api/http.html#http_message_headers|message.headers}
-     */
-    get headers() {
-        return this.req.headers;
-    }
-
-    /**
-     * Requested HTTP Version sent by the client. Usually either '1.0' or '1.1'
-     * @name httpVersion
-     * @alias HttpDuplex.httpVersion
-     * @memberof HttpDuplex
-     * @type {String}
-     * @see {@link https://nodejs.org/api/http.html#http_message_httpversion|message.httpVersion}
-     * @readonly
-     */
-    get httpVersion() {
-        return this.req.httpVersion;
-    }
-
-    /**
-     * First integer in the httpVersion string
-     * @name httpVersionMajor
-     * @alias HttpDuplex.httpVersionMajor
-     * @memberof HttpDuplex
-     * @type {Number}
-     * @see httpVersion
-     * @readonly
-     */
-    get httpVersionMajor() {
-        return this.req.httpVersionMajor;
-    }
-
-    /**
-     * Second integer ni the httpVersion string
-     * @name httpVersionMinor
-     * @alias HttpDuplex.httpVersionMinor
-     * @memberof HttpDuplex
-     * @type {String}
-     * @see httpVersion
-     * @readonly
-     */
-    get httpVersionMinor() {
-        return this.req.httpVersionMinor;
-    }
-
-    /**
-      * Request method of the incoming request.
-      * @type {String}
-      * @see {@link https://nodejs.org/api/http.html#http_event_request|request}
-      * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse}
-      * @example 'GET', 'DELETE'
-      * @readonly
-      */
-    get method() {
-        return this.req.method;
-    }
-
-    /**
-     * Is this stream readable.
-     * @type {Boolean}
-     * @readonly
-     */
-    get readable() {
-        return this.req.readable;
-    }
-
-    /**
-      * net.Socket object associated with the connection.
-      * @type net.Socket
-      * @see {@link https://nodejs.org/api/net.html#net_class_net_socket|net.Socket}
-      * @readonly
-      */
-    get socket() {
-        return this.req.socket;
-    }
-
-    /**
-     * The HTTP status code. Generally assigned before sending headers for a response to a client.
-     * @type {Number}
-     * @default 200
-     * @see {@link https://nodejs.org/api/http.html#http_response_statuscode|response.statusCode}
-     * @example request.statusCode = 404;
-     */
-    get statusCode() {
-        return this.res.statusCode;
-    }
-
-    set statusCode(val) {
-        this.res.statusCode = val;
-    }
-
-    /**
-     * Controls the status message sent to the client as long as an explicit call to response.writeHead() isn't made
-     * If ignored or the value is undefined, the default message corresponding to the status code will be used.
-     * @type {String}
-     * @default undefined
-     * @see {@link https://nodejs.org/api/http.html#http_response_statusmessage|response.statusMessage}
-     * @example request.statusMessage = 'Document Not found';
-     */
-    get statusMessage() {
-        return this.res.statusMessage;
-    }
-
-    set statusMessage(val) {
-        this.res.statusMessage = val;
-    }
-
-    /**
-     * Request/response trailer headers. Just like {@link headers} except these are only written
-     * after the initial response to the client.
-     * This object is only populated at the 'end' event and only work if a 'transfer-encoding: chunked'
-     * header is sent in the initial response.
-     * @name HttpDuplex#trailers
-     * @type {Object}
-     * @readonly
-     * @see headers
-     * @see addTrailers
-     * @see {@link https://nodejs.org/api/http.html#http_message_trailers|message.trailers}
-     * @see {@link https://nodejs.org/api/http.html#http_response_addtrailers_headers|response.addTrailers}
-     */
-    get trailers() {
-        return this.req.trailers;
-    }
-
-    /**
-      * Whether or not the client connection has been upgraded
-      * @type {Boolean}
-      * @see {@link https://nodejs.org/api/http.html#http_event_upgrade_1|upgrade}
-      * @readonly
-      */
-    get upgrade() {
-        return this.req.upgrade;
-    }
-
-    /**
-     * Request URL string.
-     * @example <caption>A request made as:</caption>
-     * GET /info?check=none HTTP/1.1
-     * @example <caption>Will return the string</caption>
-     * '/info?check=none'
-     * @type {String}
-     * @readonly
-     */
-    get url() {
-        return this.req.url;
-    }
-
-    // output / response wrapping
-    get writable() {
-        return this.res.writable;
-    }
-
-    /**
-     * Sends a response header to the client request. Must only be called one time and before calling response.end().
-     * @method writeHead
-     * @alias HttpDuplex.writeHead
-     * @memberof HttpDuplex
-     * @param {number} statusCode 3-digit HTTP status code, like 404
-     * @param {string} [statusMessage] An optional human readable status message to send with the status code
-     * @param {object} [headers] An object containing the response headers to send
-     * @returns {this}
-     * @see {@link https://nodejs.org/api/http.html#http_response_writehead_statuscode_statusmessage_headers|response.writeHead}
-     * @example var content = 'Under Construction...';
-     * response.writeHead(200, {
-     *     'Content-Length': Buffer.byteLength(content),
-     *     'Content-Type': 'text/plain' 
-     * });
-     * response.end(content);
-     */
-    writeHead(statusCode, statusMessage, headers) {
-        this.res.writeHead(statusCode, statusMessage, headers);
-        return this;
-    }
-
-    /**
-     * Buffers written data in memory. This data will be flushed when either the uncork or end methods are called.
-     * @method cork
-     * @alias HttpDuplex.cork
-     * @memberof HttpDuplex
-     * @returns {this}
-     * @see uncork
-     * @see {@link https://nodejs.org/api/stream.html#stream_writable_cork|stream.Writeable.cork}
-     * @example
-     * request.cork();
-     * request.write('buffer data ');
-     * request.write('before sending ');
-     * request.uncork();
-     */
-    cork() {
-        this.res.connection.cork();
-        return this;
-    }
-
-    /**
-     * Flushes all data buffered since cork() was called.
-     * @method uncork
-     * @alias HttpDuplex.cork
-     * @memberof HttpDuplex
-     * @returns {this}
-     * @see cork
-     * @see {@link https://nodejs.org/api/stream.html#stream_writable_uncork|stream.Writeable.uncork}
-     */
-    uncork() {
-        this.res.connection.uncork();
-        return this;
-    }
-}
-
-// proxy request methods
-['pause', 'resume', 'setEncoding'].forEach(function (name) {
-    HttpDuplex.prototype[name] = function () {
-        return this.req[name].apply(this.req, Array.from(arguments));
-    };
-});
-
-// proxy respone methods
-[
-    'setDefaultEncoding', 'write', 'end', 'flush', 'writeHeader', 'writeContinue',
-    'setHeader', 'getHeader', 'removeHeader', 'addTrailers'
-].forEach(function (name) {
-    HttpDuplex.prototype[name] = function () {
-        return this.res[name].apply(this.res, Array.from(arguments));
-    };
-});
-
-/**
- * Destroys object and it's bound streams
- * @method destroy
- * @alias HttpDuplex.destroy
- * @memberof HttpDuplex
- */
-HttpDuplex.prototype.destroy = function () {
-    this.req.destroy();
-    this.res.destroy();
-};
-
-module.exports = HttpDuplex;
-
-/**
- * Event emitted when the underlying request connection is closed. This only occurs once per response.
- * @event close
- * @alias HttpDuplex#event:close
- * @memberof HttpDuplex
- * @see end
- * @see {@link https://nodejs.org/api/http.html#http_event_close_2|http.IncomingMessage/close}
- */
-
-/**
- * This event is emitted when data on the stream can be consumed. This may occur whenever the stream is switched into
- * flowing mode by calling readable.pipe() or readable.resume() or by attaching a listener this event.<p/>
- * This event is emitted when readable.read() is called and a chunk of data becomes available.
- * Data will be passed as a string if the default encoding has been set using readable.setEncoding(); otherwise it's
- * passed as a Buffer.
- * @event data
- * @alias HttpDuplex#event:data
- * @param {(string|buffer|any)} chunk The chunk is either a buffer or string when the stream isn't operating
- *        in object mode. When the stream is in object mode, the chunk can be any JavaScript value other than null.
- * @memberof HttpDuplex
- * @see {@link https://nodejs.org/api/stream.html#stream_event_data|stream.Readable/data}
- */
-
-/**
- * If a call to response.write(chunk) returns false, the drain event will be emitted once it is appropriate to
- * resume writing data to the stream.
- * @event drain
- * @alias HttpDuplex#event:drain
- * @memberof HttpDuplex
- * @see {@link https://nodejs.org/api/stream.html#stream_event_drain|stream.Writable/drain}
- */
-
-/**
- * This event is emitted once no more consumable data is left on the readable stream.<p/>
- * *Note*: This is only emitted when all data is completely consumed.
- * @event end
- * @alias HttpDuplex#event:end
- * @memberof HttpDuplex
- * @see {@link https://nodejs.org/api/stream.html#stream_event_end|stream.Readable/end}
- */
-
-/**
- * This event may be emitted one of the underlying Readable or Writable stream implementations at any time.
- * This may happen in the following cases:
- *    + if the underlying streams are unable to produce data because of an internal failure
- *    + if an attempt is made to push an invalid chunk of data.
- *    + if an error occurred while writing or piping data.<p/>
- *
- * The listener callback will be passed a single Error object.<br/>
- * *Note*: Streams are not closed when the event is emitted.
- * @event error
- * @alias HttpDuplex#event:error
- * @memberof HttpDuplex
- * @see {@link https://nodejs.org/api/stream.html#stream_event_error_1|stream.Readable/error}
- * @see {@link https://nodejs.org/api/stream.html#stream_event_error|stream.Writeable/error}
- */
-
-/**
- * Adds trailing headers to the response.
- * Trailers will only be emitted if chunked encoding is enabled for the response; otherwise they are discarded.
- * @method addTrailers
- * @name addTrailers
- * @alias HttpDuplex.addTrailers
- * @memberof HttpDuplex
- * @param {Object} headers Trailing headers to add to the response
- * @see trailers
- * @see headers
- * @see {@link https://nodejs.org/api/http.html#http_message_trailers|message.trailers}
- * @see {@link https://nodejs.org/api/http.html#http_response_addtrailers_headers|response.addTrailers}
- */
-
-/**
- * Tells the server the response headers and body have been sent and that the message should be considered complete.
- * This MUST be called on every response.
- * If data is specified, this behaves as if calling response.write(data, encoding) followed by response.end(callback).
- * If specified, the callback is called once the response stream is finished.
- * @method end
- * @alias HttpDuplex.end
- * @memberof HttpDuplex
- * @param {(string|Buffer)} data optional data to write to the response before closing the connection
- * @param {String} encoding Encoding that should be used to write the data
- * @param {function} callback Function to be called once the response stream is finished
- * @see {@link https://nodejs.org/api/http.html#http_response_end_data_encoding_callback|response.end}
- */
-
- /**
- * Returns the current value of a header; name is case insensitive.
- * @method getHeader
- * @alias HttpDuplex.getHeader
- * @memberof HttpDuplex
- * @param {String} name Header to get the value of
- * @returns {String}
- * @see {@link https://nodejs.org/api/http.html#http_request_getheader_name|getHeader}
- * @example
- * let contentType = request.getHeader('Content-Type');
- */
-
-/**
- * Switch readable stream out of flowing mode and stop emitting 'data' events.
- * Any new data that becomes available during this time will stay buffered until resume is called.
- * @method pause
- * @alias HttpDuplex.pause
- * @memberof HttpDuplex
- * @see {@link https://nodejs.org/api/stream.html#stream_readable_pause|stream.Readable.pause}
- */
-
-/**
- * Remove a header from the response headers.
- * @method removeHeader
- * @alias HttpDuplex.removeHeader
- * @memberof HttpDuplex
- * @param {String} name Header to remove
- * @see {@link https://nodejs.org/api/http.html#http_request_removeheader_name|removeHeader}
- * @example
- * request.removeHeader('Content-Type');
- */
-
-/**
- * Switch readable stream back into flowing mode and restart emitting 'data' events.
- * This can be used to consume all data waiting without processing any of it.
- * @method resume
- * @alias HttpDuplex.resume
- * @memberof HttpDuplex
- * @see {@link https://nodejs.org/api/stream.html#stream_readable_resume|stream.Readable.resume}
- */
-
-/**
- * Sets the character encoding for data written to the stream.
- * @method setDefaultEncoding
- * @alias HttpDuplex.setDefaultEncoding
- * @memberof HttpDuplex
- * @param encoding {String} new character encoding
- * @see setEncoding
- * @example request.setDefaultEncoding('utf8');
- */
-
-/**
- * Sets the character encoding for data read from the stream.
- * @method setEncoding
- * @alias HttpDuplex.setEncoding
- * @memberof HttpDuplex
- * @param encoding {String} new character encoding
- * @see setDefaultEncoding
- * @example request.setEncoding('utf8');
- */
-
-/**
- * Set a single header. If the header already exists, it will be replaced.
- * It's possible to use an array of strings in place of value to send multiple headers with the same name.
- * @method setHeader
- * @alias HttpDuplex.setHeader
- * @memberof HttpDuplex
- * @param {String} name Header to set
- * @param {string|string[]} value Value(s) to assign to header
- * @see removeHeader
- * @see {@link https://nodejs.org/api/http.html#http_request_setheader_name_value|setHeader}
- * @example <caption>Single value</caption>
- * request.setHeader('Content-Type', 'text/html');
- * @example <caption>Array of string value</caption>
- * request.setHeader('Set-Cookie', ['type=auth', 'language=javascript']);
- */
-
-/**
- * Sends a chunk of the response body. This method may be called multiple times to provide successive parts of the
- * body.
- * <p>*Note:* If write() is called either before writeHead() or writeHead() just hasn't been called, it will switch * modes and flush the implicit headers that may be waiting before parts of this chunk are sent.<p/>
- * Node will buffer up to the first chunk of the body. Any additional calls to write() may be buffered as well
- * for packet efficiency purposes.</p>
- * Returns true if the entire data was flushed successfully to the kernel buffer. Returns false if all or part of
- * the data was buffered in memory.
- * @method write
- * @alias HttpDuplex.write
- * @memberof HttpDuplex
- * @param {(string|Buffer)} chunk chunk of data to send.
- * @param {String} [encoding='utf8'] If chunk is a string, this specifies how to encode it into a byte stream.
- * @param {function} [callback] Callback to call when this chunk of data is flushed.
- * @returns {Boolean}
- * @emits {@link event:drain|drain} Emitted when data was buffered and the buffer has become free for use again.
- * @see {@link https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback|http.ServerResponse.write}
- */
-
-/**
- * Sends an HTTP/1.1 100 Continue message to the client.
- * @method writeContinue
- * @alias HttpDuplex.writeContinue
- * @memberof HttpDuplex
- * @see {@link https://nodejs.org/api/http.html#http_response_writecontinue|response.writeContinue}
- * {@link https://nodejs.org/api/http.html#http_event_checkcontinue|http.Server/checkContinue}
- */
-
-/**
- * __Warning:__ This has been deprecated in node, __don't__ use it. Any apis that require this funtion should be
- * updated to use writeHead insted.
- * @method writeHeader
- * @alias HttpDuplex.writeHeader
- * @memberof HttpDuplex
- * @deprecated {@link https://nodejs.org/api/deprecations.html#deprecations_dep0063_serverresponse_prototype_writeheader|Node Deprecated}
- * @see writeHead
- */
-
-
-
- - - - -
- -
- - - - - - - diff --git a/docs/code/index.html b/docs/code/index.html deleted file mode 100644 index 06af68b..0000000 --- a/docs/code/index.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - Home - Documentation - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
-

node-git-server

-

🎡 A configurable git server written in Node.js

-
-
-
-

there be 🐲 here! The API's and functionality are still be cemented, anything before a 1.0.0 release will be subject to change.

-
-
-

Npm Version -Build Status -Coverage Status -Dependency Status -devDependency Status -npm -npm

-

Install

npm install node-git-server

Usage

Simple

const path = require('path');
-const Server = require('node-git-server');
-
-const repos = new Server(path.resolve(__dirname, 'tmp'), {
-    autoCreate: true
-});
-const port = process.env.PORT || 7005;
-
-repos.on('push', (push) => {
-    console.log(`push ${push.repo}/${push.commit} (${push.branch})`);
-    push.accept();
-});
-
-repos.on('fetch', (fetch) => {
-    console.log(`fetch ${fetch.commit}`);
-    fetch.accept();
-});
-
-repos.listen(port, () => {
-    console.log(`node-git-server running at http://localhost:${port}`)
-});

then start up the node-git-server server...

-
$ node example/index.js

meanwhile...

-
$ git push http://localhost:7005/beep master
-Counting objects: 356, done.
-Delta compression using up to 2 threads.
-Compressing objects: 100% (133/133), done.
-Writing objects: 100% (356/356), 46.20 KiB, done.
-Total 356 (delta 210), reused 355 (delta 210)
-To http://localhost:7005/beep
- * [new branch]      master -> master

Sending logs

const path = require('path');
-const Server = require('node-git-server');
-
-const repos = new Server(path.resolve(__dirname, 'tmp'), {
-    autoCreate: true
-});
-const port = process.env.PORT || 7005;
-
-repos.on('push', (push) => {
-    console.log(`push ${push.repo}/${push.commit} (${push.branch})`);
-
-    repos.list((err, results) => {
-        push.log(' ');
-        push.log('Hey!');
-        push.log('Checkout these other repos:');
-        for(const repo of results) {
-          push.log(`- ${repo}`);
-        }
-        push.log(' ');
-    });
-
-    push.accept();
-});
-
-repos.listen(port, () => {
-    console.log(`node-git-server running at http://localhost:${port}`)
-});

then start up the node-git-server server...

-
$ node example/index.js

meanwhile...

-
$ git push http://localhost:7005/beep master
-Counting objects: 356, done.
-Delta compression using up to 2 threads.
-Compressing objects: 100% (133/133), done.
-Writing objects: 100% (356/356), 46.20 KiB, done.
-Total 356 (delta 210), reused 355 (delta 210)
-remote:  
-remote: Hey!
-remote: Checkout these other repos:
-remote: - test.git
-remote:  
-To http://localhost:7005/test
-   77bb26e..22918d5  master -> master

Authentication

const path = require('path');
-const Server = require('node-git-server');
-
-const repos = new Server(path.resolve(__dirname, 'tmp'), {
-    autoCreate: true,
-    authenticate: (type, repo, user, next) => {
-      if(type == 'push') {
-        user((username, password) => {
-          console.log(username, password);
-          next();
-        });
-      } else {
-        next();
-      }
-    }
-});
-const port = process.env.PORT || 7005;
-
-repos.on('push', (push) => {
-    console.log(`push ${push.repo}/${push.commit} (${push.branch})`);
-    push.accept();
-});
-
-repos.on('fetch', (fetch) => {
-    console.log(`fetch ${fetch.commit}`);
-    fetch.accept();
-});
-
-repos.listen(port, () => {
-    console.log(`node-git-server running at http://localhost:${port}`)
-});

then start up the node-git-server server...

-
$ node example/index.js

meanwhile...

-
$ git push http://localhost:7005/beep master
-Counting objects: 356, done.
-Delta compression using up to 2 threads.
-Compressing objects: 100% (133/133), done.
-Writing objects: 100% (356/356), 46.20 KiB, done.
-Total 356 (delta 210), reused 355 (delta 210)
-To http://localhost:7005/beep
- * [new branch]      master -> master

Example

Running the following command will start up a simple http server:

-
node example/index.js

If you want to try using https run the following

-
node example/index.js --https
-

When running https with self-signed certs there are two ways to override the git-clients behavior using git config http.sslVerify false or git config --global http.sslCAInfo /path/to/cert.pem

-
-

For more information please visit the docs

-

Philosophy

This library is aimed to have a zero dependency footprint. If you are reading this and you see dependencies, help to remove them 🐒.

-

Thanks

This is a hard fork from pushover.

-
- - - - - - -
- -
- - - - - - - \ No newline at end of file diff --git a/docs/code/module-lib_util.html b/docs/code/module-lib_util.html deleted file mode 100644 index 332fccc..0000000 --- a/docs/code/module-lib_util.html +++ /dev/null @@ -1,1341 +0,0 @@ - - - - - lib/util - Documentation - - - - - - - - - - - - - - - - -
- -

lib/util

- - - - - - - -
- -
- - - -
- -
-
- - - - - -
- - - - - - - - - - - - - - -

Methods

- - - - - - -

(inner) basicAuth(req, res, callback)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

sets and parses basic auth headers if they exist

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
req - - -http.IncomingMessage - - - -

http request object

res - - -http.ServerResponse - - - -

http response

callback - - -function - - - -

function(username, password, error)

- - - - - - - - - - - - - - - - - - - - - -

(inner) createAction(opts, req, res) → {Service}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

responds with the correct service depending on the action

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opts - - -Object - - - -

options to pass Service

req - - -http.IncomingMessage - - - -

http request object

res - - -http.ServerResponse - - - -

http response

- - - - - - - - - - - - - - -
Returns:
- - - - -
-
- Type -
-
- -Service - - -
-
- - - - - - - - - -

(inner) infoResponse(git, repo, service, req, res)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

sends http response using the appropriate output from service call

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
git - - -Git - - - -

an instance of git object

repo - - -String - - - -

the repository

service - - -String - - - -

the method that is responding infoResponse (push, pull, clone)

req - - -http.IncomingMessage - - - -

http request object

res - - -http.ServerResponse - - - -

http response

- - - - - - - - - - - - - - - - - - - - - -

(inner) noCache(res)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

adds headers to the response object to add cache control

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
res - - -http.ServerResponse - - - -

http response

- - - - - - - - - - - - - - - - - - - - - -

(inner) onExit(ps, callback)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

returns when process has fully exited

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ps - - -EventEmitter - - - -

event emitter to listen to

callback - - -function - - - -

function(code, signature)

- - - - - - - - - - - - - - - - - - - - - -

(inner) parseGitName(repo) → {String}

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

parses a git string and returns the repo name

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
repo - - -String - - - -

the raw repo name containing .git

- - - - - - - - - - - - - - -
Returns:
- - -
-

returns the name of the repo

-
- - - -
-
- Type -
-
- -String - - -
-
- - - - - - - - - -

(inner) serviceRespond(dup, service, repoLocation, res)

- - - - - - -
- - -
Source:
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-

execute given git operation and respond

-
- - - - - - - - - - - -
Parameters:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
dup - - -HttpDuplex - - - -

duplex object to catch errors

service - - -String - - - -

the method that is responding infoResponse (push, pull, clone)

repoLocation - - -String - - - -

the repo path on disk

res - - -http.ServerResponse - - - -

http response

- - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - -
- -
- - - - - - - \ No newline at end of file diff --git a/docs/code/scripts/linenumber.js b/docs/code/scripts/linenumber.js deleted file mode 100644 index 9cb8914..0000000 --- a/docs/code/scripts/linenumber.js +++ /dev/null @@ -1,25 +0,0 @@ -/*global document */ -(function() { - var source = document.getElementsByClassName('prettyprint source linenums'); - var i = 0; - var lineNumber = 0; - var lineId; - var lines; - var totalLines; - var anchorHash; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = 'line' + lineNumber; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/docs/code/scripts/prettify/Apache-License-2.0.txt b/docs/code/scripts/prettify/Apache-License-2.0.txt deleted file mode 100644 index 75b5248..0000000 --- a/docs/code/scripts/prettify/Apache-License-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/docs/code/scripts/prettify/lang-css.js b/docs/code/scripts/prettify/lang-css.js deleted file mode 100644 index bb6dbea..0000000 --- a/docs/code/scripts/prettify/lang-css.js +++ /dev/null @@ -1,2 +0,0 @@ -PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", -/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/docs/code/scripts/prettify/prettify.js b/docs/code/scripts/prettify/prettify.js deleted file mode 100644 index ec2a488..0000000 --- a/docs/code/scripts/prettify/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p - - - - service.js - Documentation - - - - - - - - - - - - - - - - -
- -

service.js

- - - - - - - -
-
-
const through = require('through');
-const zlib = require('zlib');
-const util = require('util');
-const os = require('os');
-const { spawn } = require('child_process');
-
-const HttpDuplex = require('./http-duplex');
-
-const headerRE = {
-  'receive-pack': '([0-9a-fA-F]+) ([0-9a-fA-F]+) refs\/(heads|tags)\/(.*?)( |00|\u0000)|^(0000)$', // eslint-disable-line
-  'upload-pack': '^\\S+ ([0-9a-fA-F]+)'
-};
-
-const packSideband = s => {
-  const n = (4 + s.length).toString(16);
-  return Array(4 - n.length + 1).join('0') + n + s;
-};
-
-class Service extends HttpDuplex {
-  /**
-   * Handles invoking the git-*-pack binaries
-   * @class Service
-   * @extends HttpDuplex
-   * @param  {Object}               opts - options to bootstrap the service object
-   * @param  {http.IncomingMessage }   req  - http request object
-   * @param  {http.ServerResponse}  res  - http response
-   */
-  constructor(opts, req, res) {
-    super(req, res);
-
-    var data = '';
-    var self = this;
-
-    this.status = 'pending';
-    this.repo = opts.repo;
-    this.service = opts.service;
-    this.cwd = opts.cwd;
-    this.logs = [];
-
-    var buffered = through().pause();
-
-    // stream needed to receive data after decoding, but before accepting
-    var ts = through();
-
-    var decoder = {
-        'gzip': () => zlib.createGunzip(),
-        'deflate': () => zlib.createDeflate()
-    }[req.headers['content-encoding']];
-
-    if (decoder) {
-        // data is compressed with gzip or deflate
-        req.pipe(decoder()).pipe(ts).pipe(buffered);
-    } else {
-        // data is not compressed
-        req.pipe(ts).pipe(buffered);
-    }
-
-    if(req.headers["authorization"]) {
-      const tokens = req.headers["authorization"].split(" ");
-      if (tokens[0] === "Basic") {
-          const splitHash = Buffer.from(tokens[1], 'base64').toString('utf8').split(":");
-          this.username = splitHash.shift();
-      }
-    }
-
-    ts.once('data', function onData(buf) {
-        data += buf;
-
-        var ops = data.match(new RegExp(headerRE[self.service], 'gi'));
-        if (!ops) return;
-        data = undefined;
-
-        ops.forEach(function(op) {
-            var type;
-            var m = op.match(new RegExp(headerRE[self.service]));
-
-            if (self.service === 'receive-pack') {
-                self.last = m[1];
-                self.commit = m[2];
-
-                if (m[3] == 'heads') {
-                    type = 'branch';
-                    self.evName = 'push';
-                } else {
-                    type = 'version';
-                    self.evName = 'tag';
-                }
-
-                var headers = {
-                    last: self.last,
-                    commit: self.commit
-                };
-                headers[type] = self[type] = m[4];
-                self.emit('header', headers);
-            } else if (self.service === 'upload-pack') {
-                self.commit = m[1];
-                self.evName = 'fetch';
-                self.emit('header', {
-                    commit: self.commit
-                });
-            }
-        });
-    });
-
-    self.once('accept', function onAccept() {
-        process.nextTick(function() {
-            const cmd = os.platform() == 'win32' ?
-              ['git', opts.service, '--stateless-rpc', opts.cwd]
-            :
-              ['git-' + opts.service, '--stateless-rpc', opts.cwd];
-
-            const ps = spawn(cmd[0], cmd.slice(1));
-
-            ps.on('error', function(err) {
-              self.emit('error', new Error(`${err.message} running command ${cmd.join(' ')}`));
-            });
-
-            self.emit('service', ps);
-
-            var respStream = through(function write(c) {
-                if (self.listeners('response').length === 0) {
-                  if(self.logs.length > 0) {
-                    while(self.logs.length > 0) {
-                      this.queue(self.logs.pop());
-                    }
-                  }
-
-                  return this.queue(c);
-                }
-                // prevent git from sending the close signal
-                if (c.length === 4 && c.toString() === '0000') return;
-                this.queue(c);
-            }, function end() {
-                if (self.listeners('response').length > 0) return;
-
-                this.queue(null);
-            });
-
-            respStream.log = function() {
-              self.log(...arguments);
-            };
-
-            self.emit('response', respStream, function endResponse() {
-                res.queue(Buffer.from('0000'));
-                res.queue(null);
-            });
-
-            ps.stdout.pipe(respStream).pipe(res);
-
-            buffered.pipe(ps.stdin);
-            buffered.resume();
-
-            ps.on('exit', () => {
-              if(self.logs.length > 0) {
-                while(self.logs.length > 0) {
-                  respStream.queue(self.logs.pop());
-                }
-                respStream.queue(Buffer.from('0000'));
-                respStream.queue(null);
-              }
-
-              self.emit.bind(self, 'exit');
-            });
-        });
-    });
-
-    self.once('reject', function onReject(code, msg) {
-        res.statusCode = code;
-        res.end(msg);
-    });
-  }
-
-  log() {
-    const _log = util.format(...arguments);
-    const SIDEBAND = String.fromCharCode(2); // PROGRESS
-    const message = `${SIDEBAND}${_log}\n`;
-    const formattedMessage = Buffer.from(packSideband(message));
-
-    this.logs.unshift(formattedMessage);
-  }
-  /**
-   * reject request in flight
-   * @method reject
-   * @memberof Service
-   * @param  {Number} code - http response code
-   * @param  {String} msg  - message that should be displayed on teh client
-   */
-  reject(code, msg) {
-      if (this.status !== 'pending') return;
-
-      if (msg === undefined && typeof code === 'string') {
-          msg = code;
-          code = 500;
-      }
-      this.status = 'rejected';
-      this.emit('reject', code || 500, msg);
-  }
-  /**
-   * accepts request to access resource
-   * @method accept
-   * @memberof Service
-   */
-  accept() {
-      if (this.status !== 'pending') return;
-
-      this.status = 'accepted';
-      this.emit('accept');
-  }
-}
-
-module.exports = Service;
-
-
-
- - - - -
- -
- - - - - - - diff --git a/docs/code/styles/jsdoc.css b/docs/code/styles/jsdoc.css deleted file mode 100644 index c13c7d4..0000000 --- a/docs/code/styles/jsdoc.css +++ /dev/null @@ -1,645 +0,0 @@ -@import url(https://fonts.googleapis.com/css?family=Montserrat:400,700); - -* { - box-sizing: border-box -} - -html, body { - height: 100%; - width: 100%; -} - -body { - color: #4d4e53; - background-color: white; - margin: 0 auto; - padding: 0 20px; - font-family: 'Helvetica Neue', Helvetica, sans-serif; - font-size: 16px; - line-height: 160%; -} - -a, -a:active { - color: #606; - text-decoration: none; -} - -a:hover { - text-decoration: none; -} - -article a { - border-bottom: 1px solid #ddd; -} - -article a:hover, article a:active { - border-bottom-color: #222; -} - -p, ul, ol, blockquote { - margin-bottom: 1em; -} - -h1, h2, h3, h4, h5, h6 { - font-family: 'Montserrat', sans-serif; -} - -h1, h2, h3, h4, h5, h6 { - color: #000; - font-weight: 400; - margin: 0; -} - -h1 { - font-weight: 300; - font-size: 48px; - margin: 1em 0 .5em; -} - -h1.page-title { - font-size: 48px; - margin: 1em 30px; -} - -h2 { - font-size: 24px; - margin: 1.5em 0 .3em; -} - -h3 { - font-size: 24px; - margin: 1.2em 0 .3em; -} - -h4 { - font-size: 18px; - margin: 1em 0 .2em; - color: #4d4e53; -} - -h4.name { - color: #fff; - background: #6d426d; - box-shadow: 0 .25em .5em #d3d3d3; - border-top: 1px solid #d3d3d3; - border-bottom: 1px solid #d3d3d3; - margin: 1.5em 0 0.5em; - padding: .75em 0 .75em 10px; -} - -h4.name a { - color: #fc83ff; -} - -h4.name a:hover { - border-bottom-color: #fc83ff; -} - -h5, .container-overview .subsection-title { - font-size: 120%; - letter-spacing: -0.01em; - margin: 8px 0 3px 0; -} - -h6 { - font-size: 100%; - letter-spacing: -0.01em; - margin: 6px 0 3px 0; - font-style: italic; -} - -tt, code, kbd, samp { - font-family: Consolas, Monaco, 'Andale Mono', monospace; - background: #f4f4f4; - padding: 1px 5px; -} - -.class-description { - font-size: 130%; - line-height: 140%; - margin-bottom: 1em; - margin-top: 1em; -} - -.class-description:empty { - margin: 0 -} - -#main { - float: right; - min-width: 360px; - width: calc(100% - 240px); -} - -header { - display: block -} - -section { - display: block; - background-color: #fff; - padding: 0 0 0 30px; -} - -.variation { - display: none -} - -.signature-attributes { - font-size: 60%; - color: #eee; - font-style: italic; - font-weight: lighter; -} - -nav { - float: left; - display: block; - width: 250px; - background: #fff; - overflow: auto; - position: fixed; - height: 100%; -} - -nav h3 { - margin-top: 12px; - font-size: 13px; - text-transform: uppercase; - letter-spacing: 1px; - font-weight: 700; - line-height: 24px; - margin: 15px 0 10px; - padding: 0; - color: #000; -} - -nav ul { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; - font-size: 100%; - line-height: 17px; - padding: 0; - margin: 0; - list-style-type: none; -} - -nav ul a, -nav ul a:active { - font-family: 'Montserrat', sans-serif; - line-height: 18px; - padding: 0; - display: block; - font-size: 12px; -} - -nav a:hover, -nav a:active { - color: #606; -} - -nav > ul { - padding: 0 10px; -} - -nav > ul > li > a { - color: #606; -} - -nav ul ul { - margin-bottom: 10px -} - -nav ul ul + ul { - margin-top: -10px; -} - -nav ul ul a { - color: hsl(207, 1%, 60%); - border-left: 1px solid hsl(207, 10%, 86%); -} - -nav ul ul a, -nav ul ul a:active { - padding-left: 20px -} - -nav h2 { - font-size: 12px; - margin: 0; - padding: 0; -} - -nav > h2 > a { - display: block; - margin: 10px 0 -10px; - color: #606 !important; -} - -footer { - color: hsl(0, 0%, 28%); - margin-left: 250px; - display: block; - padding: 15px; - font-style: italic; - font-size: 90%; -} - -.ancestors { - color: #999 -} - -.ancestors a { - color: #999 !important; -} - -.clear { - clear: both -} - -.important { - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px -} - -.type-signature { - color: #CA79CA -} - -.type-signature:last-child { - color: #eee; -} - -.name, .signature { - font-family: Consolas, Monaco, 'Andale Mono', monospace -} - -.signature { - color: #fc83ff; -} - -.details { - margin-top: 6px; - border-left: 2px solid #DDD; - line-height: 20px; - font-size: 14px; -} - -.details dt { - width: 120px; - float: left; - padding-left: 10px; -} - -.details dd { - margin-left: 70px; - margin-top: 6px; - margin-bottom: 6px; -} - -.details ul { - margin: 0 -} - -.details ul { - list-style-type: none -} - -.details pre.prettyprint { - margin: 0 -} - -.details .object-value { - padding-top: 0 -} - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption { - font-style: italic; - font-size: 107%; - margin: 0; -} - -.prettyprint { - font-size: 14px; - overflow: auto; -} - -.prettyprint.source { - width: inherit; - line-height: 18px; - display: block; - background-color: #0d152a; - color: #aeaeae; -} - -.prettyprint code { - line-height: 18px; - display: block; - background-color: #0d152a; - color: #4D4E53; -} - -.prettyprint > code { - padding: 15px; -} - -.prettyprint .linenums code { - padding: 0 15px -} - -.prettyprint .linenums li:first-of-type code { - padding-top: 15px -} - -.prettyprint code span.line { - display: inline-block -} - -.prettyprint.linenums { - padding-left: 70px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol { - padding-left: 0 -} - -.prettyprint.linenums li { - border-left: 3px #34446B solid; -} - -.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * { - background-color: #34446B; -} - -.prettyprint.linenums li * { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.params, .props { - border-spacing: 0; - border: 1px solid #ddd; - border-collapse: collapse; - border-radius: 3px; - box-shadow: 0 1px 3px rgba(0,0,0,0.1); - width: 100%; - font-size: 14px; - margin: 1em 0; -} - -.params .type { - white-space: nowrap; -} - -.params code { - white-space: pre; -} - -.params td, .params .name, .props .name, .name code { - color: #4D4E53; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 100%; -} - -.params td, .params th, .props td, .props th { - margin: 0px; - text-align: left; - vertical-align: top; - padding: 10px; - display: table-cell; -} - -.params td { - border-top: 1px solid #eee -} - -.params thead tr, .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params .params thead tr, .props .props thead tr { - background-color: #fff; - font-weight: bold; -} - -.params td.description > p:first-child, .props td.description > p:first-child { - margin-top: 0; - padding-top: 0; -} - -.params td.description > p:last-child, .props td.description > p:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -span.param-type, .params td .param-type, .param-type dd { - color: #606; - font-family: Consolas, Monaco, 'Andale Mono', monospace -} - -.param-type dt, .param-type dd { - display: inline-block -} - -.param-type { - margin: 14px 0; -} - -.disabled { - color: #454545 -} - -/* navicon button */ -.navicon-button { - display: none; - position: relative; - padding: 2.0625rem 1.5rem; - transition: 0.25s; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - opacity: .8; -} -.navicon-button .navicon:before, .navicon-button .navicon:after { - transition: 0.25s; -} -.navicon-button:hover { - transition: 0.5s; - opacity: 1; -} -.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after { - transition: 0.25s; -} -.navicon-button:hover .navicon:before { - top: .825rem; -} -.navicon-button:hover .navicon:after { - top: -.825rem; -} - -/* navicon */ -.navicon { - position: relative; - width: 2.5em; - height: .3125rem; - background: #000; - transition: 0.3s; - border-radius: 2.5rem; -} -.navicon:before, .navicon:after { - display: block; - content: ""; - height: .3125rem; - width: 2.5rem; - background: #000; - position: absolute; - z-index: -1; - transition: 0.3s 0.25s; - border-radius: 1rem; -} -.navicon:before { - top: .625rem; -} -.navicon:after { - top: -.625rem; -} - -/* open */ -.nav-trigger:checked + label:not(.steps) .navicon:before, -.nav-trigger:checked + label:not(.steps) .navicon:after { - top: 0 !important; -} - -.nav-trigger:checked + label .navicon:before, -.nav-trigger:checked + label .navicon:after { - transition: 0.5s; -} - -/* Minus */ -.nav-trigger:checked + label { - -webkit-transform: scale(0.75); - transform: scale(0.75); -} - -/* × and + */ -.nav-trigger:checked + label.plus .navicon, -.nav-trigger:checked + label.x .navicon { - background: transparent; -} - -.nav-trigger:checked + label.plus .navicon:before, -.nav-trigger:checked + label.x .navicon:before { - -webkit-transform: rotate(-45deg); - transform: rotate(-45deg); - background: #FFF; -} - -.nav-trigger:checked + label.plus .navicon:after, -.nav-trigger:checked + label.x .navicon:after { - -webkit-transform: rotate(45deg); - transform: rotate(45deg); - background: #FFF; -} - -.nav-trigger:checked + label.plus { - -webkit-transform: scale(0.75) rotate(45deg); - transform: scale(0.75) rotate(45deg); -} - -.nav-trigger:checked ~ nav { - left: 0 !important; -} - -.nav-trigger:checked ~ .overlay { - display: block; -} - -.nav-trigger { - position: fixed; - top: 0; - clip: rect(0, 0, 0, 0); -} - -.overlay { - display: none; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; - background: hsla(0, 0%, 0%, 0.5); - z-index: 1; -} - -@media only screen and (min-width: 320px) and (max-width: 680px) { - body { - overflow-x: hidden; - } - - nav { - background: #FFF; - width: 250px; - height: 100%; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: -250px; - z-index: 3; - padding: 0 10px; - transition: left 0.2s; - } - - .navicon-button { - display: inline-block; - position: fixed; - top: 1.5em; - right: 0; - z-index: 2; - } - - #main { - width: 100%; - min-width: 360px; - } - - #main h1.page-title { - margin: 1em 0; - } - - #main section { - padding: 0; - } - - footer { - margin-left: 0; - } -} - -/** Add a '#' to static members */ -[data-type="member"] a::before { - content: '#'; - display: inline-block; - margin-left: -14px; - margin-right: 5px; -} diff --git a/docs/code/styles/prettify.css b/docs/code/styles/prettify.css deleted file mode 100644 index 629bde5..0000000 --- a/docs/code/styles/prettify.css +++ /dev/null @@ -1,79 +0,0 @@ -.pln { - color: #ddd; -} - -/* string content */ -.str { - color: #61ce3c; -} - -/* a keyword */ -.kwd { - color: #fbde2d; -} - -/* a comment */ -.com { - color: #aeaeae; -} - -/* a type name */ -.typ { - color: #8da6ce; -} - -/* a literal value */ -.lit { - color: #fbde2d; -} - -/* punctuation */ -.pun { - color: #ddd; -} - -/* lisp open bracket */ -.opn { - color: #000000; -} - -/* lisp close bracket */ -.clo { - color: #000000; -} - -/* a markup tag name */ -.tag { - color: #8da6ce; -} - -/* a markup attribute name */ -.atn { - color: #fbde2d; -} - -/* a markup attribute value */ -.atv { - color: #ddd; -} - -/* a declaration */ -.dec { - color: #EF5050; -} - -/* a variable name */ -.var { - color: #c82829; -} - -/* a function name */ -.fun { - color: #4271ae; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/docs/code/util.js.html b/docs/code/util.js.html deleted file mode 100644 index c874c4f..0000000 --- a/docs/code/util.js.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - util.js - Documentation - - - - - - - - - - - - - - - - -
- -

util.js

- - - - - - - -
-
-
/**
- * @module lib/util
- */
-
-const { spawn } = require('child_process');
-
-const httpDuplex = require('./http-duplex');
-const Service = require('./service');
-
-const Util = {
-  /**
-   * adds headers to the response object to add cache control
-   * @method noCache
-   * @param  {http.ServerResponse}  res  - http response
-   */
-  noCache: function noCache(res) {
-      res.setHeader('expires', 'Fri, 01 Jan 1980 00:00:00 GMT');
-      res.setHeader('pragma', 'no-cache');
-      res.setHeader('cache-control', 'no-cache, max-age=0, must-revalidate');
-  },
-  /**
-   * sets and parses basic auth headers if they exist
-   * @method basicAuth
-   * @param  {http.IncomingMessage }   req  - http request object
-   * @param  {http.ServerResponse}  res  - http response
-   * @param  {Function} callback - function(username, password, error)
-   */
-  basicAuth: function basicAuth(req, res, callback) {
-      if(!req.headers["authorization"]) {
-          res.setHeader("Content-Type", 'text/plain');
-          res.setHeader("WWW-Authenticate", 'Basic realm="authorization needed"');
-          res.writeHead(401);
-          res.end('401 Unauthorized');
-      } else {
-          const tokens = req.headers["authorization"].split(" ");
-          if (tokens[0] === "Basic") {
-              const splitHash = Buffer.from(tokens[1], 'base64').toString('utf8').split(":");
-              const username = splitHash.shift();
-              const password = splitHash.join(":");
-              callback(username, password, null);
-          }
-      }
-  },
-  /**
-   * returns when process has fully exited
-   * @method onExit
-   * @param  {EventEmitter}   ps - event emitter to listen to
-   * @param  {Function} callback - function(code, signature)
-   */
-  onExit: function onExit(ps, callback) {
-      let code;
-      let sig;
-      let pending = 3;
-
-      const onend = () => {
-          if (--pending === 0) {
-              callback(code, sig);
-          }
-      };
-
-      ps.on('exit', (c, s) => {
-          code = c;
-          sig = s;
-      });
-
-      ps.on('exit', onend);
-      ps.stdout.on('end', onend);
-      ps.stderr.on('end', onend);
-  },
-  /**
-   * execute given git operation and respond
-   * @method serviceRespond
-   * @param  {HttpDuplex}   dup          - duplex object to catch errors
-   * @param  {String}       service      - the method that is responding infoResponse (push, pull, clone)
-   * @param  {String}       repoLocation - the repo path on disk
-   * @param  {http.ServerResponse}  res  - http response
-   */
-  serviceRespond: function serviceRespond(dup, service, repoLocation, res) {
-      const pack = (s) => {
-          var n = (4 + s.length).toString(16);
-          return Array(4 - n.length + 1).join('0') + n + s;
-      };
-
-      res.write(pack('# service=git-' + service + '\n'));
-      res.write('0000');
-
-      var cmd = null;
-      var isWin = /^win/.test(process.platform);
-      if (isWin) {
-          cmd = ['git', service, '--stateless-rpc', '--advertise-refs', repoLocation];
-      } else {
-          cmd = ['git-' + service, '--stateless-rpc', '--advertise-refs', repoLocation];
-      }
-      
-      const ps = spawn(cmd[0], cmd.slice(1));
-      ps.on('error', (err) => {
-          dup.emit('error', new Error(`${err.message} running command ${cmd.join(' ')}`));
-      });
-      ps.stdout.pipe(res);
-  },
-  /**
-   * sends http response using the appropriate output from service call
-   * @method infoResponse
-   * @param  {Git}        git     - an instance of git object
-   * @param  {String}     repo    - the repository
-   * @param  {String}     service - the method that is responding infoResponse (push, pull, clone)
-   * @param  {http.IncomingMessage }   req  - http request object
-   * @param  {http.ServerResponse}  res  - http response
-   */
-  infoResponse: function infoResponse(git, repo, service, req, res) {
-    var dup = new httpDuplex(req, res);
-    dup.cwd = git.dirMap(repo);
-    dup.repo = repo;
-
-    dup.accept = dup.emit.bind(dup, 'accept');
-    dup.reject = dup.emit.bind(dup, 'reject');
-
-    dup.once('reject', (code) => {
-        res.statusCode = code || 500;
-        res.end();
-    });
-
-    var anyListeners = git.listeners('info').length > 0;
-
-    git.exists(repo, (ex) => {
-        dup.exists = ex;
-
-        if (!ex && git.autoCreate) {
-            dup.once('accept', () => {
-                git.create(repo, next);
-            });
-
-            git.emit('info', dup);
-            if (!anyListeners) dup.accept();
-        } else if (!ex) {
-            res.statusCode = 404;
-            res.setHeader('content-type', 'text/plain');
-            res.end('repository not found');
-        } else {
-            dup.once('accept', next);
-            git.emit('info', dup);
-
-            if (!anyListeners) dup.accept();
-        }
-    });
-
-    function next() {
-        res.setHeader(
-            'content-type',
-            'application/x-git-' + service + '-advertisement'
-        );
-        Util.noCache(res);
-        Util.serviceRespond(
-          git,
-          service,
-          git.dirMap(repo),
-          res
-        );
-    }
-  },
-  /**
-   * parses a git string and returns the repo name
-   * @method parseGitName
-   * @param  {String}     repo - the raw repo name containing .git
-   * @return {String}     returns the name of the repo
-   */
-  parseGitName: function parseGitName(repo) {
-    const locationOfGit = repo.lastIndexOf('.git');
-    return repo.substr(0, locationOfGit > 0 ? locationOfGit : repo.length);
-  },
-  /**
-   * responds with the correct service depending on the action
-   * @method createAction
-   * @param  {Object}     opts - options to pass Service
-   * @param  {http.IncomingMessage }   req  - http request object
-   * @param  {http.ServerResponse}  res  - http response
-   * @return {Service}
-   */
-  createAction: function createAction(opts, req, res) {
-    let service = new Service(opts, req, res);
-
-    Object.keys(opts).forEach((key) => {
-        service[key] = opts[key];
-    });
-
-    return service;
-  }
-};
-
-module.exports = Util;
-
-
-
- - - - -
- -
- - - - - - - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 23abc03..0000000 --- a/docs/index.html +++ /dev/null @@ -1,52 +0,0 @@ -
\ No newline at end of file diff --git a/docs/krayon.css b/docs/krayon.css deleted file mode 100644 index 9c4af13..0000000 --- a/docs/krayon.css +++ /dev/null @@ -1,18 +0,0 @@ -.string { - color: #032f62 -} -.keyword { - color: #d73a49 -} -.operator { - color: #d73a49 -} -.function { - color: #005cc5 -} -.class { - color: #6f42c1 -} -.comment { - color: #6a737d -} diff --git a/docs/krayon.min.js b/docs/krayon.min.js deleted file mode 100644 index 0fa690d..0000000 --- a/docs/krayon.min.js +++ /dev/null @@ -1 +0,0 @@ -require=function b(c,d,e){function a(h,i){if(!d[h]){if(!c[h]){var j="function"==typeof require&&require;if(!i&&j)return j(h,!0);if(g)return g(h,!0);var k=new Error("Cannot find module '"+h+"'");throw k.code="MODULE_NOT_FOUND",k}var f=d[h]={exports:{}};c[h][0].call(f.exports,function(b){var d=c[h][1][b];return a(d?d:b)},f,f.exports,b,c,d,e)}return d[h].exports}for(var g="function"==typeof require&&require,f=0;f127127{a=a.replace(e[b],(a,d)=>{let e=a.replace(d,"");return`{#${b}#${c(d)}#}${e}`})}),a.replace(/\{#([a-z]+)#(.*?)#\}/g,(a,b,c)=>""+d(c)+"")}},{"./util.js":1}]},{},[]); \ No newline at end of file diff --git a/docs/main.js b/docs/main.js deleted file mode 100644 index f28f335..0000000 --- a/docs/main.js +++ /dev/null @@ -1,5 +0,0 @@ -window.onload = function() { - var Krayon = require('krayon'); - - document.querySelector('#code').innerHTML = Krayon(document.querySelector('#code').innerHTML); -} diff --git a/example/index.js b/example/index.js index f35e0f3..af17a48 100644 --- a/example/index.js +++ b/example/index.js @@ -7,76 +7,79 @@ let type = 'http'; process.argv.slice(2).forEach((arg) => { - switch(arg) { + switch (arg) { case 'https': case '--https': type = 'https'; - break; + break; } }); const fs = require('fs'); const path = require('path'); -const Server = require('../'); +const { Git : Server } = require("../"); const port = process.env.PORT || 7005; const repos = new Server(path.normalize(path.resolve(__dirname, 'tmp')), { - autoCreate: true, - authenticate: ({ type, repo, user, headers }, next) => { - console.log(type, repo, headers); // eslint-disable-line - if(type == 'push') { - // Decide if this user is allowed to perform this action against this repo. - user((username, password) => { - console.log(username, password); // eslint-disable-line - if (accountName === '42' && password === '42') { - next(); - } else { - next('wrong password'); - } - }); - } else { - // Check these credentials are correct for this user. - next(); - } + autoCreate: true, + authenticate: ({ type, repo, user, headers }, next) => { + console.log(type, repo, headers); // eslint-disable-line + if (type == 'push') { + // Decide if this user is allowed to perform this action against this repo. + user((username, password) => { + if (username === '42' && password === '42') { + next(); + } else { + next('wrong password'); + } + }); + } else { + // Check these credentials are correct for this user. + next(); } + }, }); repos.on('push', (push) => { console.log(`push ${push.repo} / ${push.commit} ( ${push.branch} )`); // eslint-disable-line - repos.list((err, results) => { - push.log(' '); - push.log('Hey!'); - push.log('Checkout these other repos:'); - for(const repo of results) { - push.log(`- ${repo}`); - } - push.log(' '); - }); + repos.list((err, results) => { + push.log(' '); + push.log('Hey!'); + push.log('Checkout these other repos:'); + for (const repo of results) { + push.log(`- ${repo}`); + } + push.log(' '); + }); - push.accept(); + push.accept(); }); repos.on('fetch', (fetch) => { console.log(`username ${fetch.username}`); // eslint-disable-line console.log(`fetch ${fetch.repo}/${fetch.commit}`); // eslint-disable-line - fetch.accept(); + fetch.accept(); }); -repos.listen(port, { - type, - key: fs.readFileSync(path.resolve(__dirname, 'privatekey.pem')), - cert: fs.readFileSync(path.resolve(__dirname, 'certificate.pem')) -}, (error) => { +repos.listen( + port, + { + type, + key: fs.readFileSync(path.resolve(__dirname, 'privatekey.pem')), + cert: fs.readFileSync(path.resolve(__dirname, 'certificate.pem')), + }, + (error) => { if(error) return console.error(`failed to start git-server because of error ${error}`); // eslint-disable-line console.log(`node-git-server running at ${type}://localhost:${port}`); // eslint-disable-line repos.list((err, result) => { - if (!result) { + if (!result) { console.log("No repositories available..."); // eslint-disable-line - } else { + } else { console.log(result); // eslint-disable-line - } + } }); -}); + } +); diff --git a/test/fixtures/server/tmp/test.git/HEAD b/fixtures/server/tmp/test.git/HEAD similarity index 100% rename from test/fixtures/server/tmp/test.git/HEAD rename to fixtures/server/tmp/test.git/HEAD diff --git a/test/fixtures/server/tmp/test.git/config b/fixtures/server/tmp/test.git/config similarity index 100% rename from test/fixtures/server/tmp/test.git/config rename to fixtures/server/tmp/test.git/config diff --git a/test/fixtures/server/tmp/test.git/description b/fixtures/server/tmp/test.git/description similarity index 100% rename from test/fixtures/server/tmp/test.git/description rename to fixtures/server/tmp/test.git/description diff --git a/test/fixtures/server/tmp/test.git/hooks/applypatch-msg.sample b/fixtures/server/tmp/test.git/hooks/applypatch-msg.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/applypatch-msg.sample rename to fixtures/server/tmp/test.git/hooks/applypatch-msg.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/commit-msg.sample b/fixtures/server/tmp/test.git/hooks/commit-msg.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/commit-msg.sample rename to fixtures/server/tmp/test.git/hooks/commit-msg.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/post-update.sample b/fixtures/server/tmp/test.git/hooks/post-update.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/post-update.sample rename to fixtures/server/tmp/test.git/hooks/post-update.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/pre-applypatch.sample b/fixtures/server/tmp/test.git/hooks/pre-applypatch.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/pre-applypatch.sample rename to fixtures/server/tmp/test.git/hooks/pre-applypatch.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/pre-commit.sample b/fixtures/server/tmp/test.git/hooks/pre-commit.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/pre-commit.sample rename to fixtures/server/tmp/test.git/hooks/pre-commit.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/pre-push.sample b/fixtures/server/tmp/test.git/hooks/pre-push.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/pre-push.sample rename to fixtures/server/tmp/test.git/hooks/pre-push.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/pre-rebase.sample b/fixtures/server/tmp/test.git/hooks/pre-rebase.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/pre-rebase.sample rename to fixtures/server/tmp/test.git/hooks/pre-rebase.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/pre-receive.sample b/fixtures/server/tmp/test.git/hooks/pre-receive.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/pre-receive.sample rename to fixtures/server/tmp/test.git/hooks/pre-receive.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/prepare-commit-msg.sample b/fixtures/server/tmp/test.git/hooks/prepare-commit-msg.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/prepare-commit-msg.sample rename to fixtures/server/tmp/test.git/hooks/prepare-commit-msg.sample diff --git a/test/fixtures/server/tmp/test.git/hooks/update.sample b/fixtures/server/tmp/test.git/hooks/update.sample similarity index 100% rename from test/fixtures/server/tmp/test.git/hooks/update.sample rename to fixtures/server/tmp/test.git/hooks/update.sample diff --git a/test/fixtures/server/tmp/test.git/info/exclude b/fixtures/server/tmp/test.git/info/exclude similarity index 100% rename from test/fixtures/server/tmp/test.git/info/exclude rename to fixtures/server/tmp/test.git/info/exclude diff --git a/test/fixtures/server/tmp/test.git/objects/0e/60b9add392cd124fbf8e994bdbbde7a3192572 b/fixtures/server/tmp/test.git/objects/0e/60b9add392cd124fbf8e994bdbbde7a3192572 similarity index 100% rename from test/fixtures/server/tmp/test.git/objects/0e/60b9add392cd124fbf8e994bdbbde7a3192572 rename to fixtures/server/tmp/test.git/objects/0e/60b9add392cd124fbf8e994bdbbde7a3192572 diff --git a/test/fixtures/server/tmp/test.git/objects/2b/e7c65ae93b54b988416f280298b0b8b5f20385 b/fixtures/server/tmp/test.git/objects/2b/e7c65ae93b54b988416f280298b0b8b5f20385 similarity index 100% rename from test/fixtures/server/tmp/test.git/objects/2b/e7c65ae93b54b988416f280298b0b8b5f20385 rename to fixtures/server/tmp/test.git/objects/2b/e7c65ae93b54b988416f280298b0b8b5f20385 diff --git a/test/fixtures/server/tmp/test.git/objects/ed/88ef46143302c0acc42531f085c49d79ba68ba b/fixtures/server/tmp/test.git/objects/ed/88ef46143302c0acc42531f085c49d79ba68ba similarity index 100% rename from test/fixtures/server/tmp/test.git/objects/ed/88ef46143302c0acc42531f085c49d79ba68ba rename to fixtures/server/tmp/test.git/objects/ed/88ef46143302c0acc42531f085c49d79ba68ba diff --git a/test/fixtures/server/tmp/test.git/refs/heads/master b/fixtures/server/tmp/test.git/refs/heads/master similarity index 100% rename from test/fixtures/server/tmp/test.git/refs/heads/master rename to fixtures/server/tmp/test.git/refs/heads/master diff --git a/index.js b/index.js deleted file mode 100644 index 2796009..0000000 --- a/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/git'); diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..6f02d11 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,13 @@ +/* + * For a detailed explanation regarding each configuration property, visit: + * https://jestjs.io/docs/configuration + */ + +export default { + clearMocks: true, + collectCoverage: true, + coverageDirectory: "coverage", + coverageProvider: "v8", + testMatch: ["**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[tj]s?(x)"], + preset: "ts-jest", +}; diff --git a/jsdoc.json b/jsdoc.json deleted file mode 100644 index 20d24a7..0000000 --- a/jsdoc.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "tags": { - "allowUnknownTags": false - }, - "source": { - "include": ["./lib", "README.md"], - "includePattern": ".js$", - "excludePattern": "(node_modules/|docs)" - }, - "plugins": [ - "plugins/markdown" - ], - "opts": { - "template": "node_modules/docdash", - "encoding": "utf8", - "destination": "docs/code", - "recurse": true, - "verbose": true - }, - "templates": { - "cleverLinks": true, - "monospaceLinks": false, - "default": { - "includeDate": false - } - } -} diff --git a/lib/git.js b/lib/git.js deleted file mode 100644 index ed5e4ba..0000000 --- a/lib/git.js +++ /dev/null @@ -1,471 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const http = require('http'); -const https = require('https'); -const url = require('url'); -const qs = require('querystring'); -const httpDuplex = require('./http-duplex'); - -const { spawn } = require('child_process'); -const { EventEmitter } = require('events'); - -const { parseGitName, createAction, infoResponse, onExit, basicAuth, noCache } = require('./util'); - -const services = ['upload-pack', 'receive-pack']; - -/** - * @event Git#push - * @type {Object} - * @property {HttpDuplex} push - is a http duplex object (see below) with these extra properties - * @property {String} push.repo - the string that defines the repo - * @property {String} push.commit - the string that defines the commit sha - * @property {String} push.branch - the string that defines the branch - * @example - repos.on('push', function (push) { ... } - - Emitted when somebody does a `git push` to the repo. - - Exactly one listener must call `push.accept()` or `push.reject()`. If there are - no listeners, `push.accept()` is called automatically. - * -**/ - -/** - * @event Git#tag - * @type {Object} - * @property {HttpDuplex} tag - an http duplex object (see below) with these extra properties: - * @property {String} tag.repo - the string that defines the repo - * @property {String} tag.commit - the string that defines the commit sha - * @property {String} tag.version - the string that defines the tag being pushed - * @example - repos.on('tag', function (tag) { ... } - - Emitted when somebody does a `git push --tags` to the repo. - Exactly one listener must call `tag.accept()` or `tag.reject()`. If there are - No listeners, `tag.accept()` is called automatically. - * -**/ - -/** - * @event Git#fetch - * @type {Object} - * @property {HttpDuplex} fetch - an http duplex object (see below) with these extra properties: - * @property {String} fetch.repo - the string that defines the repo - * @property {String} fetch.commit - the string that defines the commit sha - * @example - repos.on('fetch', function (fetch) { ... } - - Emitted when somebody does a `git fetch` to the repo (which happens whenever you - do a `git pull` or a `git clone`). - - Exactly one listener must call `fetch.accept()` or `fetch.reject()`. If there are - no listeners, `fetch.accept()` is called automatically. - * -*/ - -/** - * @event Git#info - * @type {Object} - * @property {HttpDuplex} info - an http duplex object (see below) with these extra properties: - * @property {String} info.repo - the string that defines the repo - * @example - repos.on('info', function (info) { ... } - - Emitted when the repo is queried for info before doing other commands. - - Exactly one listener must call `info.accept()` or `info.reject()`. If there are - no listeners, `info.accept()` is called automatically. - * -*/ - -/** - * @event Git#info - * @type {Object} - * @property {HttpDuplex} info - an http duplex object (see below) with these extra properties: - * @property {String} info.repo - the string that defines the repo - * @example - repos.on('info', function (info) { ... } - - Emitted when the repo is queried for info before doing other commands. - - Exactly one listener must call `info.accept()` or `info.reject()`. If there are - no listeners, `info.accept()` is called automatically. - * -*/ - -/** - * @event Git#head - * @type {Object} - * @property {HttpDuplex} head - an http duplex object (see below) with these extra properties: - * @property {String} head.repo - the string that defines the repo - * @example - repos.on('head', function (head) { ... } - - Emitted when the repo is queried for HEAD before doing other commands. - - Exactly one listener must call `head.accept()` or `head.reject()`. If there are - no listeners, `head.accept()` is called automatically. - * -*/ - -class Git extends EventEmitter { - /** - * - * Handles invoking the git-*-pack binaries - * @class Git - * @extends EventEmitter - * @param {(String|Function)} repoDir - Create a new repository collection from the directory `repoDir`. `repoDir` should be entirely empty except for git repo directories. If `repoDir` is a function, `repoDir(repo)` will be used to dynamically resolve project directories. The return value of `repoDir(repo)` should be a string path specifying where to put the string `repo`. Make sure to return the same value for `repo` every time since `repoDir(repo)` will be called multiple times. - * @param {Object} options - options that can be applied on the new instance being created - * @param {Boolean=} options.autoCreate - By default, repository targets will be created if they don't exist. You can - disable that behavior with `options.autoCreate = true` - * @param {Function} options.authenticate - a function that has the following arguments ({ type, repo, username, password, headers }, next) and will be called when a request comes through if set - * - authenticate: ({ type, repo, username, password, headers }, next) => { - console.log(type, repo, username, password); - next(); - } - // alternatively you can also pass authenticate a promise - authenticate: ({ type, repo, username, password, headers }, next) => { - console.log(type, repo, username, password); - return new Promise((resolve, reject) => { - if(username === 'foo') { - return resolve(); - } - return reject("sorry you don't have access to this content"); - }); - } - * @param {Boolean=} options.checkout - If `opts.checkout` is true, create and expected checked-out repos instead of bare repos - */ - constructor(repoDir, options={}) { - super(); - - if(typeof repoDir === 'function') { - this.dirMap = repoDir; - } else { - this.dirMap = (dir) => { - return (path.normalize(dir ? path.join(repoDir, dir) : repoDir)); - }; - } - - this.authenticate = options.authenticate; - this.autoCreate = options.autoCreate === false ? false : true; - this.checkout = options.checkout; - } - /** - * Get a list of all the repositories - * @method list - * @memberof Git - * @param {Function} callback function to be called when repositories have been found `function(error, repos)` - */ - list(callback) { - fs.readdir(this.dirMap(), (error, results) => { - if(error) return callback(error); - let repos = results.filter((r) => { - return r.substring(r.length - 3, r.length) == 'git'; - }, []); - - callback(null, repos); - }); - } - /** - * Find out whether `repoName` exists in the callback `cb(exists)`. - * @method exists - * @memberof Git - * @param {String} repo - name of the repo - * @param {Function=} callback - function to be called when finished - */ - exists(repo, callback) { - fs.exists(this.dirMap(repo), callback); - } - /** - * Create a subdirectory `dir` in the repo dir with a callback `cb(err)`. - * @method mkdir - * @memberof Git - * @param {String} dir - directory name - * @param {Function=} callback - callback to be called when finished - */ - mkdir(dir, callback) { - // TODO: remove sync operations - const parts = this.dirMap(dir).split(path.sep); - for(var i = 0; i <= parts.length; i++) { - const directory = parts.slice(0, i).join(path.sep); - if(directory && !fs.existsSync(directory)) { - fs.mkdirSync(directory); - } - } - callback(); - } - /** - * Create a new bare repository `repoName` in the instance repository directory. - * @method create - * @memberof Git - * @param {String} repo - the name of the repo - * @param {Function=} callback - Optionally get a callback `cb(err)` to be notified when the repository was created. - */ - create(repo, callback) { - var self = this; - if (typeof callback !== 'function') callback = function () {}; - - if (!/\.git$/.test(repo)) repo += '.git'; - - self.exists(repo, function (ex) { - if (!ex) { - self.mkdir(repo, next); - } else { - next(); - } - }); - - function next (err) { - if (err) return callback(err); - - var ps, error = ''; - - var dir = self.dirMap(repo); - if (self.checkout) { - ps = spawn('git', [ 'init', dir ]); - } - else { - ps = spawn('git', [ 'init', '--bare', dir ]); - } - - ps.stderr.on('data', function (buf) { error += buf; }); - onExit(ps, function (code) { - if (!callback) { return; } - else if (code) callback(error || true); - else callback(null); - }); - } - } - /** - * returns the typeof service being process - * @method getType - * @param {String} service - the service type - * @return {String} - will respond with either fetch or push - */ - getType(service) { - switch(service) { - case 'upload-pack': - return 'fetch'; - case 'receive-pack': - return 'push'; - default: - return 'unknown'; - } - } - /** - * Handle incoming HTTP requests with a connect-style middleware - * @method handle - * @memberof Git - * @param {Object} req - http request object - * @param {Object} res - http response object - */ - handle(req, res) { - const handlers = [ - function(req, res) { - if (req.method !== 'GET') return false; - - var self = this; - var u = url.parse(req.url); - var m = u.pathname.match(/\/(.+)\/info\/refs$/); - if (!m) return false; - if (/\.\./.test(m[1])) return false; - - var repo = m[1]; - var params = qs.parse(u.query); - if (!params.service) { - res.statusCode = 400; - res.end('service parameter required'); - return; - } - - var service = params.service.replace(/^git-/, ''); - if (services.indexOf(service) < 0) { - res.statusCode = 405; - res.end('service not available'); - return; - } - - var repoName = parseGitName(m[1]); - var next = (error) => { - if(error) { - res.setHeader("Content-Type", 'text/plain'); - res.setHeader("WWW-Authenticate", 'Basic realm="authorization needed"'); - res.writeHead(401); - res.end(typeof error === 'string' ? error : error.toString()); - return; - } else { - return infoResponse(self, repo, service, req, res); - } - }; - - // check if the repo is authenticated - if(this.authenticate) { - const type = this.getType(service); - const headers = req.headers; - const user = basicAuth.bind(null, req, res); - const promise = this.authenticate({ type, repo: repoName, user, headers }, (error) => { - return next(error); - }); - - if(promise instanceof Promise) { - return promise - .then(next) - .catch(next); - } - } else { - return next(); - } - }, - function(req, res) { - if (req.method !== 'GET') return false; - - var u = url.parse(req.url); - var m = u.pathname.match(/^\/(.+)\/HEAD$/); - if (!m) return false; - if (/\.\./.test(m[1])) return false; - - var self = this; - var repo = m[1]; - - var next = () => { - const file = self.dirMap(path.join(m[1], 'HEAD')); - self.exists(file, (ex) => { - if (ex) fs.createReadStream(file).pipe(res); - else { - res.statusCode = 404; - res.end('not found'); - } - }); - }; - - self.exists(repo, (ex) => { - const anyListeners = self.listeners('head').length > 0; - const dup = new httpDuplex(req, res); - dup.exists = ex; - dup.repo = repo; - dup.cwd = self.dirMap(repo); - - dup.accept = dup.emit.bind(dup, 'accept'); - dup.reject = dup.emit.bind(dup, 'reject'); - - dup.once('reject', (code) => { - dup.statusCode = code || 500; - dup.end(); - }); - - if (!ex && self.autoCreate) { - dup.once('accept', (dir) => { - self.create(dir || repo, next); - }); - self.emit('head', dup); - if (!anyListeners) dup.accept(); - } else if (!ex) { - res.statusCode = 404; - res.setHeader('content-type', 'text/plain'); - res.end('repository not found'); - } else { - dup.once('accept', next); - self.emit('head', dup); - if (!anyListeners) dup.accept(); - } - }); - }, - function(req, res) { - if (req.method !== 'POST') return false; - var m = req.url.match(/\/(.+)\/git-(.+)/); - if (!m) return false; - if (/\.\./.test(m[1])) return false; - - var self = this; - var repo = m[1], - service = m[2]; - - if (services.indexOf(service) < 0) { - res.statusCode = 405; - res.end('service not available'); - return; - } - - res.setHeader('content-type', 'application/x-git-' + service + '-result'); - noCache(res); - - var action = createAction({ - repo: repo, - service: service, - cwd: self.dirMap(repo) - }, req, res); - - action.on('header', () => { - var evName = action.evName; - var anyListeners = self.listeners(evName).length > 0; - self.emit(evName, action); - if (!anyListeners) action.accept(); - }); - }, - (req, res) => { - if (req.method !== 'GET' && req.method !== 'POST') { - res.statusCode = 405; - res.end('method not supported'); - } else { - return false; - } - }, - (req, res) => { - res.statusCode = 404; - res.end('not found'); - } - ]; - res.setHeader('connection', 'close'); - var self = this; - (function next(ix) { - var done = () => { - next(ix + 1); - }; - var x = handlers[ix].call(self, req, res, done); - if (x === false) next(ix + 1); - })(0); - } - /** - * starts a git server on the given port - * @method listen - * @memberof Git - * @param {Number} port - the port to start the server on - * @param {Object=} options - the options to add extended functionality to the server - * @param {String=} options.type - this is either https or http (the default is http) - * @param {Buffer|String=} options.key - the key file for the https server - * @param {Buffer|String=} options.cert - the cert file for the https server - * @param {Function} callback - the function to call when server is started or error has occured - * @return {Git} - the Git instance, useful for chaining - */ - listen(port, options, callback) { - const self = this; - if(typeof options == 'function' || !options) { - callback = options; - options = { type: 'http' }; - } - const createServer = options.type == 'http' ? http.createServer : https.createServer.bind(this, options); - - this.server = createServer(function(req, res) { - self.handle(req, res); - }); - - this.server.listen(port, callback); - return this; - } - /** - * closes the server instance - * @method close - * @memberof Git - * @param {Promise} - will resolve or reject when the server closes or fails to close. - */ - close() { - return new Promise((resolve, reject) => { - this.server.close((err) => { - err ? reject(err) : resolve(); - }); - }); - } -} - -module.exports = Git; diff --git a/lib/http-duplex.js b/lib/http-duplex.js deleted file mode 100644 index aacb9d3..0000000 --- a/lib/http-duplex.js +++ /dev/null @@ -1,519 +0,0 @@ -const EventEmitter = require('events'); - -class HttpDuplex extends EventEmitter { - /** - * Constructs a proxy object over input and output resulting in a unified stream. - * Generally meant to combine request and response streams in the http.request event - * @class HttpDuplex - * @param {http.IncomingMessage} input - client request object from request event - * @param {http.ServerResponse} output - response object from request event - * @requires events - * @extends EventEmitter - * @see {@link https://nodejs.org/api/http.html#http_event_request|request} - * @see {@link https://nodejs.org/api/http.html#http_class_http_incomingmessage|http.IncomingMessage} - * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse} - * @example A simple example is shown below - * http.createServer(function (req, res) { - * var dup = new HttpDuplex(req, res); - * res.end("Request: " + req.method + " " + req.url); - * }).listen(80); - */ - constructor(input, output) { - super(); - - /** - * A IncomingMessage created by http.Server or http.ClientRequest usually passed as the - * first parameter to the 'request' and 'response' events. Implements Readable Stream interface - * but may not be a decendant thereof. - * @type {http.IncomingMessage} - * @see {@link https://nodejs.org/api/http.html#http_event_request|request} - * @see {@link https://nodejs.org/api/http.html#http_class_http_incomingmessage|http.IncomingMessage} - * - */ - this.req = input; - - /** - * Created http.server. Passed as the second parameter to the 'request' event. - * The response implements Writable Stream interface but isn't a descendent thereof. - * @type {http.ServerResponse} - * @see {@link https://nodejs.org/api/http.html#http_event_request|request} - * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse} - */ - this.res = output; - - var self = this; - - // request / input proxy events - ['data', 'end', 'error', 'close'].forEach(function (name) { - self.req.on(name, self.emit.bind(self, name)); - }); - - // respone / output proxy events - ['error', 'drain'].forEach(function (name) { - self.res.on(name, self.emit.bind(self, name)); - }); - } - - // input / request wrapping - get client() { - return this.req.client; - } - - get complete() { - return this.req.complete; - } - - /** - * Reference to the underlying socket for the request connection. - * @type {net.Socket} - * @readonly - * @see {@link https://nodejs.org/api/http.html#http_request_socket|request.Socket} - */ - get connection() { - return this.req.connection; - } - - /** - * Request/response headers. Key-value pairs of header names and values. Header names are always lower-case. - * @name headers - * @alias HttpDuplex.headers - * @memberof HttpDuplex - * @type {Object} - * @readonly - * @see {@link https://nodejs.org/api/http.html#http_message_headers|message.headers} - */ - get headers() { - return this.req.headers; - } - - /** - * Requested HTTP Version sent by the client. Usually either '1.0' or '1.1' - * @name httpVersion - * @alias HttpDuplex.httpVersion - * @memberof HttpDuplex - * @type {String} - * @see {@link https://nodejs.org/api/http.html#http_message_httpversion|message.httpVersion} - * @readonly - */ - get httpVersion() { - return this.req.httpVersion; - } - - /** - * First integer in the httpVersion string - * @name httpVersionMajor - * @alias HttpDuplex.httpVersionMajor - * @memberof HttpDuplex - * @type {Number} - * @see httpVersion - * @readonly - */ - get httpVersionMajor() { - return this.req.httpVersionMajor; - } - - /** - * Second integer ni the httpVersion string - * @name httpVersionMinor - * @alias HttpDuplex.httpVersionMinor - * @memberof HttpDuplex - * @type {String} - * @see httpVersion - * @readonly - */ - get httpVersionMinor() { - return this.req.httpVersionMinor; - } - - /** - * Request method of the incoming request. - * @type {String} - * @see {@link https://nodejs.org/api/http.html#http_event_request|request} - * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse} - * @example 'GET', 'DELETE' - * @readonly - */ - get method() { - return this.req.method; - } - - /** - * Is this stream readable. - * @type {Boolean} - * @readonly - */ - get readable() { - return this.req.readable; - } - - /** - * net.Socket object associated with the connection. - * @type net.Socket - * @see {@link https://nodejs.org/api/net.html#net_class_net_socket|net.Socket} - * @readonly - */ - get socket() { - return this.req.socket; - } - - /** - * The HTTP status code. Generally assigned before sending headers for a response to a client. - * @type {Number} - * @default 200 - * @see {@link https://nodejs.org/api/http.html#http_response_statuscode|response.statusCode} - * @example request.statusCode = 404; - */ - get statusCode() { - return this.res.statusCode; - } - - set statusCode(val) { - this.res.statusCode = val; - } - - /** - * Controls the status message sent to the client as long as an explicit call to response.writeHead() isn't made - * If ignored or the value is undefined, the default message corresponding to the status code will be used. - * @type {String} - * @default undefined - * @see {@link https://nodejs.org/api/http.html#http_response_statusmessage|response.statusMessage} - * @example request.statusMessage = 'Document Not found'; - */ - get statusMessage() { - return this.res.statusMessage; - } - - set statusMessage(val) { - this.res.statusMessage = val; - } - - /** - * Request/response trailer headers. Just like {@link headers} except these are only written - * after the initial response to the client. - * This object is only populated at the 'end' event and only work if a 'transfer-encoding: chunked' - * header is sent in the initial response. - * @name HttpDuplex#trailers - * @type {Object} - * @readonly - * @see headers - * @see addTrailers - * @see {@link https://nodejs.org/api/http.html#http_message_trailers|message.trailers} - * @see {@link https://nodejs.org/api/http.html#http_response_addtrailers_headers|response.addTrailers} - */ - get trailers() { - return this.req.trailers; - } - - /** - * Whether or not the client connection has been upgraded - * @type {Boolean} - * @see {@link https://nodejs.org/api/http.html#http_event_upgrade_1|upgrade} - * @readonly - */ - get upgrade() { - return this.req.upgrade; - } - - /** - * Request URL string. - * @example A request made as: - * GET /info?check=none HTTP/1.1 - * @example Will return the string - * '/info?check=none' - * @type {String} - * @readonly - */ - get url() { - return this.req.url; - } - - // output / response wrapping - get writable() { - return this.res.writable; - } - - /** - * Sends a response header to the client request. Must only be called one time and before calling response.end(). - * @method writeHead - * @alias HttpDuplex.writeHead - * @memberof HttpDuplex - * @param {number} statusCode 3-digit HTTP status code, like 404 - * @param {string} [statusMessage] An optional human readable status message to send with the status code - * @param {object} [headers] An object containing the response headers to send - * @returns {this} - * @see {@link https://nodejs.org/api/http.html#http_response_writehead_statuscode_statusmessage_headers|response.writeHead} - * @example var content = 'Under Construction...'; - * response.writeHead(200, { - * 'Content-Length': Buffer.byteLength(content), - * 'Content-Type': 'text/plain' - * }); - * response.end(content); - */ - writeHead(statusCode, statusMessage, headers) { - this.res.writeHead(statusCode, statusMessage, headers); - return this; - } - - /** - * Buffers written data in memory. This data will be flushed when either the uncork or end methods are called. - * @method cork - * @alias HttpDuplex.cork - * @memberof HttpDuplex - * @returns {this} - * @see uncork - * @see {@link https://nodejs.org/api/stream.html#stream_writable_cork|stream.Writeable.cork} - * @example - * request.cork(); - * request.write('buffer data '); - * request.write('before sending '); - * request.uncork(); - */ - cork() { - this.res.connection.cork(); - return this; - } - - /** - * Flushes all data buffered since cork() was called. - * @method uncork - * @alias HttpDuplex.cork - * @memberof HttpDuplex - * @returns {this} - * @see cork - * @see {@link https://nodejs.org/api/stream.html#stream_writable_uncork|stream.Writeable.uncork} - */ - uncork() { - this.res.connection.uncork(); - return this; - } -} - -// proxy request methods -['pause', 'resume', 'setEncoding'].forEach(function (name) { - HttpDuplex.prototype[name] = function () { - return this.req[name].apply(this.req, Array.from(arguments)); - }; -}); - -// proxy respone methods -[ - 'setDefaultEncoding', 'write', 'end', 'flush', 'writeHeader', 'writeContinue', - 'setHeader', 'getHeader', 'removeHeader', 'addTrailers' -].forEach(function (name) { - HttpDuplex.prototype[name] = function () { - return this.res[name].apply(this.res, Array.from(arguments)); - }; -}); - -/** - * Destroys object and it's bound streams - * @method destroy - * @alias HttpDuplex.destroy - * @memberof HttpDuplex - */ -HttpDuplex.prototype.destroy = function () { - this.req.destroy(); - this.res.destroy(); -}; - -module.exports = HttpDuplex; - -/** - * Event emitted when the underlying request connection is closed. This only occurs once per response. - * @event close - * @alias HttpDuplex#event:close - * @memberof HttpDuplex - * @see end - * @see {@link https://nodejs.org/api/http.html#http_event_close_2|http.IncomingMessage/close} - */ - -/** - * This event is emitted when data on the stream can be consumed. This may occur whenever the stream is switched into - * flowing mode by calling readable.pipe() or readable.resume() or by attaching a listener this event.

- * This event is emitted when readable.read() is called and a chunk of data becomes available. - * Data will be passed as a string if the default encoding has been set using readable.setEncoding(); otherwise it's - * passed as a Buffer. - * @event data - * @alias HttpDuplex#event:data - * @param {(string|buffer|any)} chunk The chunk is either a buffer or string when the stream isn't operating - * in object mode. When the stream is in object mode, the chunk can be any JavaScript value other than null. - * @memberof HttpDuplex - * @see {@link https://nodejs.org/api/stream.html#stream_event_data|stream.Readable/data} - */ - -/** - * If a call to response.write(chunk) returns false, the drain event will be emitted once it is appropriate to - * resume writing data to the stream. - * @event drain - * @alias HttpDuplex#event:drain - * @memberof HttpDuplex - * @see {@link https://nodejs.org/api/stream.html#stream_event_drain|stream.Writable/drain} - */ - -/** - * This event is emitted once no more consumable data is left on the readable stream.

- * *Note*: This is only emitted when all data is completely consumed. - * @event end - * @alias HttpDuplex#event:end - * @memberof HttpDuplex - * @see {@link https://nodejs.org/api/stream.html#stream_event_end|stream.Readable/end} - */ - -/** - * This event may be emitted one of the underlying Readable or Writable stream implementations at any time. - * This may happen in the following cases: - * + if the underlying streams are unable to produce data because of an internal failure - * + if an attempt is made to push an invalid chunk of data. - * + if an error occurred while writing or piping data.

- * - * The listener callback will be passed a single Error object.
- * *Note*: Streams are not closed when the event is emitted. - * @event error - * @alias HttpDuplex#event:error - * @memberof HttpDuplex - * @see {@link https://nodejs.org/api/stream.html#stream_event_error_1|stream.Readable/error} - * @see {@link https://nodejs.org/api/stream.html#stream_event_error|stream.Writeable/error} - */ - -/** - * Adds trailing headers to the response. - * Trailers will only be emitted if chunked encoding is enabled for the response; otherwise they are discarded. - * @method addTrailers - * @name addTrailers - * @alias HttpDuplex.addTrailers - * @memberof HttpDuplex - * @param {Object} headers Trailing headers to add to the response - * @see trailers - * @see headers - * @see {@link https://nodejs.org/api/http.html#http_message_trailers|message.trailers} - * @see {@link https://nodejs.org/api/http.html#http_response_addtrailers_headers|response.addTrailers} - */ - -/** - * Tells the server the response headers and body have been sent and that the message should be considered complete. - * This MUST be called on every response. - * If data is specified, this behaves as if calling response.write(data, encoding) followed by response.end(callback). - * If specified, the callback is called once the response stream is finished. - * @method end - * @alias HttpDuplex.end - * @memberof HttpDuplex - * @param {(string|Buffer)} data optional data to write to the response before closing the connection - * @param {String} encoding Encoding that should be used to write the data - * @param {function} callback Function to be called once the response stream is finished - * @see {@link https://nodejs.org/api/http.html#http_response_end_data_encoding_callback|response.end} - */ - - /** - * Returns the current value of a header; name is case insensitive. - * @method getHeader - * @alias HttpDuplex.getHeader - * @memberof HttpDuplex - * @param {String} name Header to get the value of - * @returns {String} - * @see {@link https://nodejs.org/api/http.html#http_request_getheader_name|getHeader} - * @example - * let contentType = request.getHeader('Content-Type'); - */ - -/** - * Switch readable stream out of flowing mode and stop emitting 'data' events. - * Any new data that becomes available during this time will stay buffered until resume is called. - * @method pause - * @alias HttpDuplex.pause - * @memberof HttpDuplex - * @see {@link https://nodejs.org/api/stream.html#stream_readable_pause|stream.Readable.pause} - */ - -/** - * Remove a header from the response headers. - * @method removeHeader - * @alias HttpDuplex.removeHeader - * @memberof HttpDuplex - * @param {String} name Header to remove - * @see {@link https://nodejs.org/api/http.html#http_request_removeheader_name|removeHeader} - * @example - * request.removeHeader('Content-Type'); - */ - -/** - * Switch readable stream back into flowing mode and restart emitting 'data' events. - * This can be used to consume all data waiting without processing any of it. - * @method resume - * @alias HttpDuplex.resume - * @memberof HttpDuplex - * @see {@link https://nodejs.org/api/stream.html#stream_readable_resume|stream.Readable.resume} - */ - -/** - * Sets the character encoding for data written to the stream. - * @method setDefaultEncoding - * @alias HttpDuplex.setDefaultEncoding - * @memberof HttpDuplex - * @param encoding {String} new character encoding - * @see setEncoding - * @example request.setDefaultEncoding('utf8'); - */ - -/** - * Sets the character encoding for data read from the stream. - * @method setEncoding - * @alias HttpDuplex.setEncoding - * @memberof HttpDuplex - * @param encoding {String} new character encoding - * @see setDefaultEncoding - * @example request.setEncoding('utf8'); - */ - -/** - * Set a single header. If the header already exists, it will be replaced. - * It's possible to use an array of strings in place of value to send multiple headers with the same name. - * @method setHeader - * @alias HttpDuplex.setHeader - * @memberof HttpDuplex - * @param {String} name Header to set - * @param {string|string[]} value Value(s) to assign to header - * @see removeHeader - * @see {@link https://nodejs.org/api/http.html#http_request_setheader_name_value|setHeader} - * @example Single value - * request.setHeader('Content-Type', 'text/html'); - * @example Array of string value - * request.setHeader('Set-Cookie', ['type=auth', 'language=javascript']); - */ - -/** - * Sends a chunk of the response body. This method may be called multiple times to provide successive parts of the - * body. - *

*Note:* If write() is called either before writeHead() or writeHead() just hasn't been called, it will switch * modes and flush the implicit headers that may be waiting before parts of this chunk are sent.

- * Node will buffer up to the first chunk of the body. Any additional calls to write() may be buffered as well - * for packet efficiency purposes.

- * Returns true if the entire data was flushed successfully to the kernel buffer. Returns false if all or part of - * the data was buffered in memory. - * @method write - * @alias HttpDuplex.write - * @memberof HttpDuplex - * @param {(string|Buffer)} chunk chunk of data to send. - * @param {String} [encoding='utf8'] If chunk is a string, this specifies how to encode it into a byte stream. - * @param {function} [callback] Callback to call when this chunk of data is flushed. - * @returns {Boolean} - * @emits {@link event:drain|drain} Emitted when data was buffered and the buffer has become free for use again. - * @see {@link https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback|http.ServerResponse.write} - */ - -/** - * Sends an HTTP/1.1 100 Continue message to the client. - * @method writeContinue - * @alias HttpDuplex.writeContinue - * @memberof HttpDuplex - * @see {@link https://nodejs.org/api/http.html#http_response_writecontinue|response.writeContinue} - * {@link https://nodejs.org/api/http.html#http_event_checkcontinue|http.Server/checkContinue} - */ - -/** - * __Warning:__ This has been deprecated in node, __don't__ use it. Any apis that require this funtion should be - * updated to use writeHead insted. - * @method writeHeader - * @alias HttpDuplex.writeHeader - * @memberof HttpDuplex - * @deprecated {@link https://nodejs.org/api/deprecations.html#deprecations_dep0063_serverresponse_prototype_writeheader|Node Deprecated} - * @see writeHead - */ diff --git a/lib/service.js b/lib/service.js deleted file mode 100644 index 081a8be..0000000 --- a/lib/service.js +++ /dev/null @@ -1,211 +0,0 @@ -const through = require('through'); -const zlib = require('zlib'); -const util = require('util'); -const os = require('os'); -const { spawn } = require('child_process'); - -const HttpDuplex = require('./http-duplex'); - -const headerRE = { - 'receive-pack': '([0-9a-fA-F]+) ([0-9a-fA-F]+) refs\/(heads|tags)\/(.*?)( |00|\u0000)|^(0000)$', // eslint-disable-line - 'upload-pack': '^\\S+ ([0-9a-fA-F]+)' -}; - -const packSideband = s => { - const n = (4 + s.length).toString(16); - return Array(4 - n.length + 1).join('0') + n + s; -}; - -class Service extends HttpDuplex { - /** - * Handles invoking the git-*-pack binaries - * @class Service - * @extends HttpDuplex - * @param {Object} opts - options to bootstrap the service object - * @param {http.IncomingMessage } req - http request object - * @param {http.ServerResponse} res - http response - */ - constructor(opts, req, res) { - super(req, res); - - var data = ''; - var self = this; - - this.status = 'pending'; - this.repo = opts.repo; - this.service = opts.service; - this.cwd = opts.cwd; - this.logs = []; - - var buffered = through().pause(); - - // stream needed to receive data after decoding, but before accepting - var ts = through(); - - var decoder = { - 'gzip': () => zlib.createGunzip(), - 'deflate': () => zlib.createDeflate() - }[req.headers['content-encoding']]; - - if (decoder) { - // data is compressed with gzip or deflate - req.pipe(decoder()).pipe(ts).pipe(buffered); - } else { - // data is not compressed - req.pipe(ts).pipe(buffered); - } - - if(req.headers["authorization"]) { - const tokens = req.headers["authorization"].split(" "); - if (tokens[0] === "Basic") { - const splitHash = Buffer.from(tokens[1], 'base64').toString('utf8').split(":"); - this.username = splitHash.shift(); - } - } - - ts.once('data', function onData(buf) { - data += buf; - - var ops = data.match(new RegExp(headerRE[self.service], 'gi')); - if (!ops) return; - data = undefined; - - ops.forEach(function(op) { - var type; - var m = op.match(new RegExp(headerRE[self.service])); - - if (self.service === 'receive-pack') { - self.last = m[1]; - self.commit = m[2]; - - if (m[3] == 'heads') { - type = 'branch'; - self.evName = 'push'; - } else { - type = 'version'; - self.evName = 'tag'; - } - - var headers = { - last: self.last, - commit: self.commit - }; - headers[type] = self[type] = m[4]; - self.emit('header', headers); - } else if (self.service === 'upload-pack') { - self.commit = m[1]; - self.evName = 'fetch'; - self.emit('header', { - commit: self.commit - }); - } - }); - }); - - self.once('accept', function onAccept() { - process.nextTick(function() { - const cmd = os.platform() == 'win32' ? - ['git', opts.service, '--stateless-rpc', opts.cwd] - : - ['git-' + opts.service, '--stateless-rpc', opts.cwd]; - - const ps = spawn(cmd[0], cmd.slice(1)); - - ps.on('error', function(err) { - self.emit('error', new Error(`${err.message} running command ${cmd.join(' ')}`)); - }); - - self.emit('service', ps); - - var respStream = through(function write(c) { - if (self.listeners('response').length === 0) { - if(self.logs.length > 0) { - while(self.logs.length > 0) { - this.queue(self.logs.pop()); - } - } - - return this.queue(c); - } - // prevent git from sending the close signal - if (c.length === 4 && c.toString() === '0000') return; - this.queue(c); - }, function end() { - if (self.listeners('response').length > 0) return; - - this.queue(null); - }); - - respStream.log = function() { - self.log(...arguments); - }; - - self.emit('response', respStream, function endResponse() { - res.queue(Buffer.from('0000')); - res.queue(null); - }); - - ps.stdout.pipe(respStream).pipe(res); - - buffered.pipe(ps.stdin); - buffered.resume(); - - ps.on('exit', () => { - if(self.logs.length > 0) { - while(self.logs.length > 0) { - respStream.queue(self.logs.pop()); - } - respStream.queue(Buffer.from('0000')); - respStream.queue(null); - } - - self.emit.bind(self, 'exit'); - }); - }); - }); - - self.once('reject', function onReject(code, msg) { - res.statusCode = code; - res.end(msg); - }); - } - - log() { - const _log = util.format(...arguments); - const SIDEBAND = String.fromCharCode(2); // PROGRESS - const message = `${SIDEBAND}${_log}\n`; - const formattedMessage = Buffer.from(packSideband(message)); - - this.logs.unshift(formattedMessage); - } - /** - * reject request in flight - * @method reject - * @memberof Service - * @param {Number} code - http response code - * @param {String} msg - message that should be displayed on teh client - */ - reject(code, msg) { - if (this.status !== 'pending') return; - - if (msg === undefined && typeof code === 'string') { - msg = code; - code = 500; - } - this.status = 'rejected'; - this.emit('reject', code || 500, msg); - } - /** - * accepts request to access resource - * @method accept - * @memberof Service - */ - accept() { - if (this.status !== 'pending') return; - - this.status = 'accepted'; - this.emit('accept'); - } -} - -module.exports = Service; diff --git a/lib/util.js b/lib/util.js deleted file mode 100644 index 3bed53c..0000000 --- a/lib/util.js +++ /dev/null @@ -1,190 +0,0 @@ -/** - * @module lib/util - */ - -const { spawn } = require('child_process'); - -const httpDuplex = require('./http-duplex'); -const Service = require('./service'); - -const Util = { - /** - * adds headers to the response object to add cache control - * @method noCache - * @param {http.ServerResponse} res - http response - */ - noCache: function noCache(res) { - res.setHeader('expires', 'Fri, 01 Jan 1980 00:00:00 GMT'); - res.setHeader('pragma', 'no-cache'); - res.setHeader('cache-control', 'no-cache, max-age=0, must-revalidate'); - }, - /** - * sets and parses basic auth headers if they exist - * @method basicAuth - * @param {http.IncomingMessage } req - http request object - * @param {http.ServerResponse} res - http response - * @param {Function} callback - function(username, password, error) - */ - basicAuth: function basicAuth(req, res, callback) { - if(!req.headers["authorization"]) { - res.setHeader("Content-Type", 'text/plain'); - res.setHeader("WWW-Authenticate", 'Basic realm="authorization needed"'); - res.writeHead(401); - res.end('401 Unauthorized'); - } else { - const tokens = req.headers["authorization"].split(" "); - if (tokens[0] === "Basic") { - const splitHash = Buffer.from(tokens[1], 'base64').toString('utf8').split(":"); - const username = splitHash.shift(); - const password = splitHash.join(":"); - callback(username, password, null); - } - } - }, - /** - * returns when process has fully exited - * @method onExit - * @param {EventEmitter} ps - event emitter to listen to - * @param {Function} callback - function(code, signature) - */ - onExit: function onExit(ps, callback) { - let code; - let sig; - let pending = 3; - - const onend = () => { - if (--pending === 0) { - callback(code, sig); - } - }; - - ps.on('exit', (c, s) => { - code = c; - sig = s; - }); - - ps.on('exit', onend); - ps.stdout.on('end', onend); - ps.stderr.on('end', onend); - }, - /** - * execute given git operation and respond - * @method serviceRespond - * @param {HttpDuplex} dup - duplex object to catch errors - * @param {String} service - the method that is responding infoResponse (push, pull, clone) - * @param {String} repoLocation - the repo path on disk - * @param {http.ServerResponse} res - http response - */ - serviceRespond: function serviceRespond(dup, service, repoLocation, res) { - const pack = (s) => { - var n = (4 + s.length).toString(16); - return Array(4 - n.length + 1).join('0') + n + s; - }; - - res.write(pack('# service=git-' + service + '\n')); - res.write('0000'); - - var cmd = null; - var isWin = /^win/.test(process.platform); - if (isWin) { - cmd = ['git', service, '--stateless-rpc', '--advertise-refs', repoLocation]; - } else { - cmd = ['git-' + service, '--stateless-rpc', '--advertise-refs', repoLocation]; - } - - const ps = spawn(cmd[0], cmd.slice(1)); - ps.on('error', (err) => { - dup.emit('error', new Error(`${err.message} running command ${cmd.join(' ')}`)); - }); - ps.stdout.pipe(res); - }, - /** - * sends http response using the appropriate output from service call - * @method infoResponse - * @param {Git} git - an instance of git object - * @param {String} repo - the repository - * @param {String} service - the method that is responding infoResponse (push, pull, clone) - * @param {http.IncomingMessage } req - http request object - * @param {http.ServerResponse} res - http response - */ - infoResponse: function infoResponse(git, repo, service, req, res) { - var dup = new httpDuplex(req, res); - dup.cwd = git.dirMap(repo); - dup.repo = repo; - - dup.accept = dup.emit.bind(dup, 'accept'); - dup.reject = dup.emit.bind(dup, 'reject'); - - dup.once('reject', (code) => { - res.statusCode = code || 500; - res.end(); - }); - - var anyListeners = git.listeners('info').length > 0; - - git.exists(repo, (ex) => { - dup.exists = ex; - - if (!ex && git.autoCreate) { - dup.once('accept', () => { - git.create(repo, next); - }); - - git.emit('info', dup); - if (!anyListeners) dup.accept(); - } else if (!ex) { - res.statusCode = 404; - res.setHeader('content-type', 'text/plain'); - res.end('repository not found'); - } else { - dup.once('accept', next); - git.emit('info', dup); - - if (!anyListeners) dup.accept(); - } - }); - - function next() { - res.setHeader( - 'content-type', - 'application/x-git-' + service + '-advertisement' - ); - Util.noCache(res); - Util.serviceRespond( - git, - service, - git.dirMap(repo), - res - ); - } - }, - /** - * parses a git string and returns the repo name - * @method parseGitName - * @param {String} repo - the raw repo name containing .git - * @return {String} returns the name of the repo - */ - parseGitName: function parseGitName(repo) { - const locationOfGit = repo.lastIndexOf('.git'); - return repo.substr(0, locationOfGit > 0 ? locationOfGit : repo.length); - }, - /** - * responds with the correct service depending on the action - * @method createAction - * @param {Object} opts - options to pass Service - * @param {http.IncomingMessage } req - http request object - * @param {http.ServerResponse} res - http response - * @return {Service} - */ - createAction: function createAction(opts, req, res) { - let service = new Service(opts, req, res); - - Object.keys(opts).forEach((key) => { - service[key] = opts[key]; - }); - - return service; - } -}; - -module.exports = Util; diff --git a/package.json b/package.json index 958d09d..23c2a90 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,16 @@ { "name": "node-git-server", - "version": "0.6.1", + "version": "1.0.0-beta.1", "description": "🎡 A configurable git server written in Node.js", "author": "Gabriel J. Csapo ", "contributors": [ { "name": "echopoint", - "email": "echopoint " + "email": "echopoint@tutanota.com" + }, + { + "name": "Buj Itself", + "email": "primary@buj-dev.site" } ], "license": "MIT", @@ -18,26 +22,38 @@ "type": "git", "url": "git+https://github.com/gabrielcsapo/node-git-server.git" }, - "main": "index.js", + "main": "dist/index.js", "engine": { - "node": ">= 6" + "node": ">= 14" }, "scripts": { - "lint": "eslint .", - "test": "tape test/*.js", - "coverage": "tap test/*.js --coverage --coverage-report=lcov", - "generate-docs": "tryitout && jsdoc -c jsdoc.json" + "lint": "eslint src/*", + "test": "jest src/*.test.ts", + "build": "echo \"\" > ./build-complete.meta && tsc", + "coverage": "jest --coverage", + "install": "( [ -f ./git-package.meta ] && [ ! -f ./build-complete.meta ] && echo \"\" > ./build-complete.meta && npm install . && tsc ) || echo \"\" > ./build-complete.meta" }, "dependencies": { "through": "^2.3.8" }, "devDependencies": { - "async": "^2.6.0", - "docdash": "^0.4.0", - "eslint": "^4.15.0", - "jsdoc": "^3.5.5", - "tap": "^12.5.3", - "tape": "^4.8.0", - "tryitout": "^2.1.1" - } + "@types/jest": "^27.4.0", + "@types/node": "^15.6.1", + "@types/node-fetch": "^2.5.12", + "@types/through": "^0.0.30", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^8.6.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "^27.4.5", + "node-fetch": "^2.6.6", + "prettier": "^2.5.1", + "ts-jest": "^27.0.7", + "ts-node": "^10.4.0", + "typescript": "^4.5.4" + }, + "workspaces": [ + "./website" + ] } diff --git a/src/git.test.ts b/src/git.test.ts new file mode 100644 index 0000000..c22b23b --- /dev/null +++ b/src/git.test.ts @@ -0,0 +1,1027 @@ +import fs from 'fs'; +import path from 'path'; +import { spawn, exec, SpawnOptionsWithoutStdio } from 'child_process'; +import http from 'http'; + +import { Git } from './git'; + +jest.setTimeout(15000); + +const wrapCallback = (func: { (callback: any): void }) => { + return new Promise((resolve) => { + func(resolve); + }); +}; + +describe('git', () => { + test('create, push to, and clone a repo', async () => { + expect.assertions(11); + + let lastCommit: string; + + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + const server = http + .createServer((req, res) => { + repos.handle(req, res); + }) + .listen(port); + + process.chdir(srcDir); + + repos.on('push', (push) => { + expect(push.repo).toBe('xyz/doom'); + expect(push.commit).toBe(lastCommit); + expect(push.branch).toBe('master'); + + expect(push.headers.host).toBe('localhost:' + port); + expect(push.method).toBe('POST'); + expect(push.url).toBe('/xyz/doom/git-receive-pack'); + + push.accept(); + }); + + await wrapCallback((callback: () => void) => { + repos.mkdir('xyz'); + callback(); + }); + + await wrapCallback((callback: () => void) => { + repos.create('xyz/doom', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['init']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'abcd', () => { + callback(); + }); + }); + + await wrapCallback((callback: () => void) => { + spawn('git', ['add', 'a.txt']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['commit', '-am', 'a!!']).on('exit', () => { + exec('git log | head -n1', (err, stdout) => { + lastCommit = stdout.split(/\s+/)[1]; + callback(); + }); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', [ + 'push', + 'http://localhost:' + port + '/xyz/doom', + 'master', + ]).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + spawn('git', ['clone', 'http://localhost:' + port + '/xyz/doom']).on( + 'exit', + (code) => { + expect(code).toBe(0); + callback(); + } + ); + }); + + const ex = fs.existsSync(dstDir + '/doom/a.txt'); + expect(ex).toBeTruthy(); + + server.close(); + }); + + test('create, push to, and clone a repo successful', async () => { + expect.assertions(8); + + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + const server = http.createServer((req, res) => { + repos.handle(req, res); + }); + server.listen(port); + + repos.on('push', (push) => { + expect(push.repo).toBe('doom'); + push.accept(); + }); + + process.chdir(srcDir); + + await wrapCallback((callback: () => void) => { + spawn('git', ['init']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { + expect(!err).toBeTruthy(); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['add', 'a.txt']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['commit', '-am', 'a!!']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['push', 'http://localhost:' + port + '/doom', 'master']).on( + 'exit', + (code) => { + expect(code).toBe(0); + callback(); + } + ); + }); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + spawn('git', ['clone', 'http://localhost:' + port + '/doom']).on( + 'exit', + (code) => { + expect(code).toBe(0); + callback(); + } + ); + }); + await wrapCallback((callback: () => void) => { + fs.stat(dstDir + '/doom/a.txt', (ex) => { + expect(!ex).toBeTruthy(); + callback(); + }); + }); + + server.close(); + }); + + test('clone into programatic directories', async () => { + expect.assertions(19); + + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const targetDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + fs.mkdirSync(targetDir, '0700'); + + const server = new Git((dir?: string) => { + expect(dir).toBe('doom.git'); + + return path.join(targetDir, dir || ''); + }); + + server.listen(port); + + server.on('push', (push) => { + expect(push.repo).toBe('doom.git'); + push.accept(); + }); + + process.chdir(srcDir); + await wrapCallback((callback: () => void) => { + spawn('git', ['init']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { + expect(!err).toBeTruthy(); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['add', 'a.txt'], { + cwd: srcDir, + }).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['commit', '-am', 'a!!'], { + cwd: srcDir, + }).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn( + 'git', + ['push', 'http://localhost:' + port + '/doom.git', 'master'], + { + cwd: srcDir, + } + ).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + spawn('git', ['clone', 'http://localhost:' + port + '/doom.git']).on( + 'exit', + (code) => { + expect(code).toBe(0); + callback(); + } + ); + }); + await wrapCallback((callback: () => void) => { + fs.stat(dstDir + '/doom/a.txt', (ex) => { + expect(!ex).toBeTruthy(); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.stat(targetDir + '/doom.git/HEAD', (ex) => { + expect(!ex).toBeTruthy(); + callback(); + }); + }); + + server.close(); + }); + + test('test tagging', async () => { + expect.assertions(27); + + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + let lastCommit: string; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + const server = http.createServer((req, res) => { + repos.handle(req, res); + }); + server.listen(port); + + repos.on('push', (push) => { + expect(push.repo).toBe('doom'); + expect(push.commit).toBe(lastCommit); + expect(push.branch).toBe('master'); + + expect(push.headers.host).toBe('localhost:' + port); + expect(push.method).toBe('POST'); + expect(push.url).toBe('/doom/git-receive-pack'); + + push.accept(); + }); + + let firstTag = true; + repos.on('tag', (tag) => { + expect(tag.repo).toBe('doom'); + expect(tag.version).toBe('0.0.' + (firstTag ? 1 : 2)); + + expect(tag.headers.host).toBe('localhost:' + port); + expect(tag.method).toBe('POST'); + expect(tag.url).toBe('/doom/git-receive-pack'); + + tag.accept(); + firstTag = false; + }); + + process.chdir(srcDir); + await wrapCallback((callback: () => void) => { + repos.create('doom', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['init']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { + expect(!err).toBeTruthy(); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['add', 'a.txt']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['commit', '-am', 'a!!']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['tag', '0.0.1']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'efgh', (err) => { + expect(!err).toBeTruthy(); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['add', 'a.txt']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['commit', '-am', 'a!!']).on('exit', () => { + exec('git log | head -n1', (err, stdout) => { + lastCommit = stdout.split(/\s+/)[1]; + callback(); + }); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['tag', '0.0.2']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', [ + 'push', + '--tags', + 'http://localhost:' + port + '/doom', + 'master', + ]).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + spawn('git', ['clone', 'http://localhost:' + port + '/doom']).on( + 'exit', + (code) => { + expect(code).toBe(0); + callback(); + } + ); + }); + await wrapCallback((callback: () => void) => { + fs.exists(dstDir + '/doom/a.txt', (ex) => { + expect(ex).toBeTruthy(); + callback(); + }); + }); + server.close(); + }); + + describe('repos list', () => { + const workingRepoDir = path.resolve( + __dirname, + '..', + 'fixtures', + 'server', + 'tmp' + ); + const notWorkingRepoDir = path.resolve( + __dirname, + '..', + 'fixtures', + 'server', + 'temp' + ); + + test('should return back with one directory in server', (done: () => void) => { + jest.setTimeout(15000); + + expect.assertions(2); + + const repos = new Git(workingRepoDir, { + autoCreate: true, + }); + + repos.list((err, results) => { + expect(err).toBeFalsy(); + expect(['test.git']).toEqual(results); + done(); + }); + }); + + test('should return back error directory does not exist', (done: () => void) => { + expect.assertions(2); + + const repos = new Git(notWorkingRepoDir, { + autoCreate: true, + }); + + repos.list((err, results) => { + expect(err !== null).toBeTruthy(); + expect(results === undefined).toBeTruthy(); + done(); + }); + }); + }); + + test('create, push to, and clone a repo reject', async () => { + expect.assertions(12); + + function _spawn( + cmd: string, + args: any[] | readonly string[] | undefined, + opts: SpawnOptionsWithoutStdio | undefined + ) { + const ps = spawn(cmd, args, opts); + ps.on('error', (err) => { + console.error( // eslint-disable-line + err.message + ' while executing: ' + cmd + ' ' + args?.join(' ') + ); + }); + return ps; + } + + let lastCommit: string; + + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + const server = http.createServer((req, res) => { + repos.handle(req, res); + }); + server.listen(port); + + process.chdir(srcDir); + + repos.on('push', (push) => { + expect(push.repo).toBe('doom'); + expect(push.commit).toBe(lastCommit); + expect(push.branch).toBe('master'); + + expect(push.headers.host).toBe('localhost:' + port); + expect(push.method).toBe('POST'); + expect(push.url).toBe('/doom/git-receive-pack'); + + push.reject(500, 'ACCESS DENIED'); + }); + + await wrapCallback((callback: () => void) => { + repos.create('doom', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + _spawn('git', ['init'], {}).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { + expect(!err).toBeTruthy(); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + _spawn('git', ['add', 'a.txt'], {}).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + _spawn('git', ['commit', '-am', 'a!!'], {}).on('exit', () => { + exec('git log | head -n1', (err, stdout) => { + lastCommit = stdout.split(/\s+/)[1]; + callback(); + }); + }); + }); + await wrapCallback((callback: () => void) => { + _spawn( + 'git', + ['push', 'http://localhost:' + port + '/doom', 'master'], + {} + ).on('exit', (code) => { + expect(code).not.toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + const glog = _spawn('git', ['log'], { + cwd: repoDir + '/doom.git', + }); + glog.on('exit', (code) => { + expect(code).toBe(128); + callback(); + }); + let data = ''; + glog.stderr.on('data', (buf) => (data += buf)); + glog.stderr.on('end', () => { + const res = + /fatal: bad default revision 'HEAD'/.test(data) || + /fatal: your current branch 'master' does not have any commits yet/.test( + data + ); + expect(res).toBeTruthy(); + }); + }); + server.close(); + }); + + test('create git server via listen() command', async () => { + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + expect(repos.listen(port)).toBe(repos); + + process.chdir(srcDir); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + spawn('git', ['clone', 'http://localhost:' + port + '/doom']).on( + 'exit', + (code) => { + expect(code).toBe(0); + callback(); + } + ); + }); + repos.close(); + }); + + test('should return promise that resolves when server is closed if no callback specified', (done: () => void) => { + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + + fs.mkdirSync(repoDir, '0700'); + + const repos = new Git(repoDir); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + repos.listen(port, undefined, () => { + repos.close().then(() => { + done(); + }); + }); + }); + + test('should be able to protect certain routes', async () => { + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + authenticate: ({ type, repo, user }, next) => { + if (type === 'fetch' && repo === 'doom') { + user((username, password) => { + if (username == 'root' && password == 'root') { + next(); + } else { + next(new Error('that is not the correct password')); + } + }); + } else { + next(new Error('that is not the correct password')); + } + }, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + repos.listen(port); + + process.chdir(srcDir); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + const clone = spawn('git', [ + 'clone', + `http://root:root@localhost:${port}/doom.git`, + ]); + + clone.on('close', function (code) { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + const clone = spawn('git', [ + 'clone', + `http://root:world@localhost:${port}/doom.git doom1`, + ]); + let error = ''; + + clone.stderr.on('data', (d) => { + error += d.toString('utf8'); + }); + + clone.on('close', function (code) { + expect(error).toBe( + `Cloning into 'doom.git doom1'...\nfatal: unable to access 'http://localhost:${port}/doom.git doom1/': The requested URL returned error: 400\n` + ); + expect(code).toBe(128); + callback(); + }); + }); + repos.close(); + }); + + test('should be able to access headers in authenticate', async () => { + expect.assertions(13); + + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + authenticate: ({ type, repo, user, headers }, next) => { + if (type === 'fetch' && repo === 'doom') { + expect(headers['host']).toBeTruthy(); + expect(headers['user-agent']).toBeTruthy(); + expect(headers['accept']).toBeTruthy(); + expect(headers['pragma']).toBeTruthy(); + expect(headers['accept-encoding']).toBeTruthy(); + + user((username, password) => { + if (username == 'root' && password == 'root') { + next(); + } else { + next(new Error('that is not the correct password')); + } + }); + } else { + next(new Error('that is not the correct password')); + } + }, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + repos.listen(port); + + process.chdir(srcDir); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + const clone = spawn('git', [ + 'clone', + `http://root:root@localhost:${port}/doom.git`, + ]); + + clone.on('close', function (code) { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + const clone = spawn('git', [ + 'clone', + `http://root:world@localhost:${port}/doom.git doom1`, + ]); + let error = ''; + + clone.stderr.on('data', (d) => { + error += d.toString('utf8'); + }); + + clone.on('close', function (code) { + expect(error).toBe( + `Cloning into 'doom.git doom1'...\nfatal: unable to access 'http://localhost:${port}/doom.git doom1/': The requested URL returned error: 400\n` + ); + expect(code).toBe(128); + callback(); + }); + }); + repos.close(); + }); + + test('should be able to protect certain routes with a promised authenticate', async () => { + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + authenticate: ({ type, repo, user }) => { + return new Promise(function (resolve, reject) { + if (type === 'fetch' && repo === 'doom') { + user((username, password) => { + if (username == 'root' && password == 'root') { + return resolve(void 0); + } else { + return reject('that is not the correct password'); + } + }); + } else { + return reject('that is not the correct password'); + } + }); + }, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + repos.listen(port); + + process.chdir(srcDir); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + const clone = spawn('git', [ + 'clone', + `http://root:root@localhost:${port}/doom.git`, + ]); + + clone.on('close', function (code) { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + process.chdir(dstDir); + const clone = spawn('git', [ + 'clone', + `http://root:world@localhost:${port}/doom.git doom1`, + ]); + let error = ''; + + clone.stderr.on('data', (d) => { + error += d.toString('utf8'); + }); + + clone.on('close', function (code) { + expect(error).toBe( + `Cloning into 'doom.git doom1'...\nfatal: unable to access 'http://localhost:${port}/doom.git doom1/': The requested URL returned error: 400\n` + ); + expect(code).toBe(128); + callback(); + }); + }); + repos.close(); + }); + + test('should be able to send custom messages to git client (main stream)', async () => { + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + + repos.on('push', (push) => { + push.log(' '); + push.log('Have a great day!'); + push.log(' '); + + push.accept(); + }); + + repos.listen(port); + + process.chdir(srcDir); + + await wrapCallback((callback: () => void) => { + repos.create('doom', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['init']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'abcd', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['add', 'a.txt']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['commit', '-m', 'a!!']).on('exit', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + const logs: any[] = []; + const push = spawn('git', [ + 'push', + 'http://localhost:' + port + '/doom.git', + 'master', + ]); + + push.stdout.on('data', (data) => { + if (data.toString() !== '') { + logs.push(data.toString()); + } + }); + + push.stderr.on('data', (data) => { + if (data.toString() !== '') { + logs.push(data.toString()); + } + }); + + push.on('exit', () => { + expect( + logs.join(' ').indexOf('remote: Have a great day!') > -1 + ).toBeTruthy(); + callback(); + }); + }); + + repos.close(); + }); + + test('should be able to send custom messages to git client (response stream)', async () => { + const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString( + 16 + )}`; + const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; + + fs.mkdirSync(repoDir, '0700'); + fs.mkdirSync(srcDir, '0700'); + fs.mkdirSync(dstDir, '0700'); + + const repos = new Git(repoDir, { + autoCreate: true, + }); + const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; + + repos.on('push', (push) => { + console.log(`push ${push.repo}/${push.commit}`); // eslint-disable-line + + push.on('response', (stream: { log: (arg0: string) => void }) => { + stream.log(' '); + stream.log('Have a great day!'); + stream.log(' '); + }); + + push.accept(); + }); + + repos.listen(port); + + process.chdir(srcDir); + + await wrapCallback((callback: () => void) => { + repos.create('doom', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['init']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + fs.writeFile(srcDir + '/a.txt', 'abcd', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['add', 'a.txt']).on('exit', (code) => { + expect(code).toBe(0); + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + spawn('git', ['commit', '-m', 'a!!']).on('exit', () => { + callback(); + }); + }); + await wrapCallback((callback: () => void) => { + const logs: any[] = []; + const push = spawn('git', [ + 'push', + 'http://localhost:' + port + '/doom.git', + 'master', + ]); + + push.stdout.on('data', (data) => { + if (data.toString() !== '') { + logs.push(data.toString()); + } + }); + + push.stderr.on('data', (data) => { + if (data.toString() !== '') { + logs.push(data.toString()); + } + }); + + push.on('exit', () => { + expect( + logs.join(' ').indexOf('remote: Have a great day!') > -1 + ).toBeTruthy(); + callback(); + }); + }); + repos.close(); + }); +}); diff --git a/src/git.ts b/src/git.ts new file mode 100644 index 0000000..e9763ac --- /dev/null +++ b/src/git.ts @@ -0,0 +1,547 @@ +import fs from 'fs'; + +import path from 'path'; +import http, { ServerOptions } from 'http'; +import https from 'https'; +import url from 'url'; +import qs from 'querystring'; +import { HttpDuplex } from './http-duplex'; + +import { spawn } from 'child_process'; +import { EventEmitter } from 'events'; + +import { + parseGitName, + createAction, + infoResponse, + basicAuth, + noCache, +} from './util'; +import { ServiceString } from './types'; + +const services = ['upload-pack', 'receive-pack']; + +interface GitServerOptions extends ServerOptions { + type: 'http' | 'https'; +} + +export interface GitOptions { + autoCreate?: boolean; + authenticate?: ( + options: GitAuthenticateOptions, + callback: (error?: Error) => void | undefined + ) => void | Promise | undefined; + checkout?: boolean; +} + +export interface GitAuthenticateOptions { + type: string; + repo: string; + user: (() => Promise<[string | undefined, string | undefined]>) & + (( + callback: ( + username?: string | undefined, + password?: string | undefined + ) => void + ) => void); + headers: http.IncomingHttpHeaders; +} + +/** + * An http duplex object (see below) with these extra properties: + */ +export interface TagData extends HttpDuplex { + repo: string; // The string that defines the repo + commit: string; // The string that defines the commit sha + version: string; // The string that defines the tag being pushed +} + +/** + * Is a http duplex object (see below) with these extra properties + */ +export interface PushData extends HttpDuplex { + repo: string; // The string that defines the repo + commit: string; // The string that defines the commit sha + branch: string; // The string that defines the branch +} + +/** + * an http duplex object (see below) with these extra properties + */ +export interface FetchData extends HttpDuplex { + repo: string; // The string that defines the repo + commit: string; // The string that defines the commit sha +} + +/** + * an http duplex object (see below) with these extra properties + */ +export interface InfoData extends HttpDuplex { + repo: string; // The string that defines the repo +} + +/** + * an http duplex object (see below) with these extra properties + */ +export interface HeadData extends HttpDuplex { + repo: string; // The string that defines the repo +} + +export interface GitEvents { + /** + * @example + * repos.on('push', function (push) { ... } + * + * Emitted when somebody does a `git push` to the repo. + * + * Exactly one listener must call `push.accept()` or `push.reject()`. If there are + * no listeners, `push.accept()` is called automatically. + **/ + on(event: 'push', listener: (push: PushData) => void): this; + + /** + * @example + * repos.on('tag', function (tag) { ... } + * + * Emitted when somebody does a `git push --tags` to the repo. + * Exactly one listener must call `tag.accept()` or `tag.reject()`. If there are + * No listeners, `tag.accept()` is called automatically. + **/ + on(event: 'tag', listener: (tag: TagData) => void): this; + + /** + * @example + * repos.on('fetch', function (fetch) { ... } + * + * Emitted when somebody does a `git fetch` to the repo (which happens whenever you + * do a `git pull` or a `git clone`). + * + * Exactly one listener must call `fetch.accept()` or `fetch.reject()`. If there are + * no listeners, `fetch.accept()` is called automatically. + **/ + on(event: 'fetch', listener: (fetch: FetchData) => void): this; + + /** + * @example + * repos.on('info', function (info) { ... } + * + * Emitted when the repo is queried for info before doing other commands. + * + * Exactly one listener must call `info.accept()` or `info.reject()`. If there are + * no listeners, `info.accept()` is called automatically. + **/ + on(event: 'info', listener: (info: InfoData) => void): this; + + /** + * @example + * repos.on('head', function (head) { ... } + * + * Emitted when the repo is queried for HEAD before doing other commands. + * + * Exactly one listener must call `head.accept()` or `head.reject()`. If there are + * no listeners, `head.accept()` is called automatically. + * + **/ + on(event: 'head', listener: (head: HeadData) => void): this; +} +export class Git extends EventEmitter implements GitEvents { + dirMap: (dir?: string) => string; + + authenticate: + | (( + options: GitAuthenticateOptions, + callback: (error?: Error) => void | undefined + ) => void | Promise | undefined) + | undefined; + + autoCreate: boolean; + checkout: boolean | undefined; + server: https.Server | http.Server | undefined; + + /** + * + * Handles invoking the git-*-pack binaries + * @param repoDir - Create a new repository collection from the directory `repoDir`. `repoDir` should be entirely empty except for git repo directories. If `repoDir` is a function, `repoDir(repo)` will be used to dynamically resolve project directories. The return value of `repoDir(repo)` should be a string path specifying where to put the string `repo`. Make sure to return the same value for `repo` every time since `repoDir(repo)` will be called multiple times. + * @param options - options that can be applied on the new instance being created + * @param options.autoCreate - By default, repository targets will be created if they don't exist. You can + disable that behavior with `options.autoCreate = true` + * @param options.authenticate - a function that has the following arguments ({ type, repo, username, password, headers }, next) and will be called when a request comes through if set + * + authenticate: ({ type, repo, username, password, headers }, next) => { + console.log(type, repo, username, password); + next(); + } + // alternatively you can also pass authenticate a promise + authenticate: ({ type, repo, username, password, headers }, next) => { + console.log(type, repo, username, password); + return new Promise((resolve, reject) => { + if(username === 'foo') { + return resolve(); + } + return reject("sorry you don't have access to this content"); + }); + } + * @param options.checkout - If `opts.checkout` is true, create and expected checked-out repos instead of bare repos + */ + constructor( + repoDir: string | ((dir?: string) => string), + options: GitOptions = {} + ) { + super(); + + if (typeof repoDir === 'function') { + this.dirMap = repoDir; + } else { + this.dirMap = (dir?: string): string => { + return path.normalize( + (dir ? path.join(repoDir, dir) : repoDir) as string + ); + }; + } + + if (options.authenticate) { + this.authenticate = options.authenticate; + } + + this.autoCreate = options.autoCreate === false ? false : true; + this.checkout = options.checkout; + } + /** + * Get a list of all the repositories + * @param {Function} callback function to be called when repositories have been found `function(error, repos)` + */ + list(callback: (error: Error | undefined, repos?: string[]) => void): void; + list(): Promise; + list( + callback?: (error: Error | undefined, repos?: string[]) => void + ): Promise | void { + const execf = (res: (repos: string[]) => void, rej: (err: Error) => void) => + fs.readdir(this.dirMap(), (error, results) => { + if (error) return rej(error); + const repos = results.filter((r) => { + return r.substring(r.length - 3, r.length) == 'git'; + }, []); + + res(repos); + }); + if (callback) + return execf( + (repos) => callback(void 0, repos), + (err) => callback(err, void 0) + ); + else return new Promise((res, rej) => execf(res, rej)); + } + /** + * Find out whether `repoName` exists in the callback `cb(exists)`. + * @param repo - name of the repo + * @param callback - function to be called when finished + */ + exists(repo: string): boolean { + return fs.existsSync(this.dirMap(repo)); + } + /** + * Create a subdirectory `dir` in the repo dir with a callback. + * @param dir - directory name + * @param callback - callback to be called when finished + */ + mkdir(dir: string) { + fs.mkdirSync(path.dirname(dir), { recursive: true }); + } + /** + * Create a new bare repository `repoName` in the instance repository directory. + * @param repo - the name of the repo + * @param callback - Optionally get a callback `cb(err)` to be notified when the repository was created. + */ + create(repo: string, callback: (error?: Error) => void) { + function next(self: Git) { + let ps; + let _error = ''; + + const dir = self.dirMap(repo); + + if (self.checkout) { + ps = spawn('git', ['init', dir]); + } else { + ps = spawn('git', ['init', '--bare', dir]); + } + + ps.stderr.on('data', function (chunk: string) { + _error += chunk; + }); + + ps.on('exit', (code) => { + if (!callback) { + return; + } else if (code) { + callback(new Error(_error)); + } else { + callback(); + } + }); + } + + if (typeof callback !== 'function') + callback = () => { + return; + }; + + if (!/\.git$/.test(repo)) repo += '.git'; + + const exists = this.exists(repo); + + if (!exists) { + this.mkdir(repo); + } + + next(this); + } + /** + * returns the typeof service being process. This will respond with either fetch or push. + * @param service - the service type + */ + getType(service: string): string { + switch (service) { + case 'upload-pack': + return 'fetch'; + case 'receive-pack': + return 'push'; + default: + return 'unknown'; + } + } + + /** + * Handle incoming HTTP requests with a connect-style middleware + * @param http request object + * @param http response object + */ + handle(req: http.IncomingMessage, res: http.ServerResponse) { + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + + const handlers = [ + (req: http.IncomingMessage, res: http.ServerResponse) => { + if (req.method !== 'GET') return false; + + // eslint-disable-next-line @typescript-eslint/no-this-alias + const u = url.parse(req?.url || ''); + const m = u.pathname?.match(/\/(.+)\/info\/refs$/); + if (!m) return false; + if (/\.\./.test(m[1])) return false; + + const repo = m[1]; + const params = qs.parse(u?.query || ''); + if (!params.service || typeof params.service !== 'string') { + res.statusCode = 400; + res.end('service parameter required'); + return; + } + + const service = params.service.replace(/^git-/, ''); + + if (services.indexOf(service) < 0) { + res.statusCode = 405; + res.end('service not available'); + return; + } + + const repoName = parseGitName(m[1]); + const next = (error?: Error | void) => { + if (error) { + res.setHeader('Content-Type', 'text/plain'); + res.setHeader( + 'WWW-Authenticate', + 'Basic realm="authorization needed"' + ); + res.writeHead(401); + res.end(typeof error === 'string' ? error : error.toString()); + return; + } else { + return infoResponse(this, repo, service as ServiceString, req, res); + } + }; + + // check if the repo is authenticated + if (this.authenticate) { + const type = this.getType(service); + const headers = req.headers; + const user = ( + callback?: (username?: string, password?: string) => void + ) => + callback + ? basicAuth(req, res, callback) + : new Promise<[string | undefined, string | undefined]>( + (resolve) => basicAuth(req, res, (u, p) => resolve([u, p])) + ); + + const promise = this.authenticate( + { + type, + repo: repoName, + user: user as unknown as GitAuthenticateOptions['user'], + headers, + }, + (error?: Error) => { + return next(error); + } + ); + + if (promise instanceof Promise) { + return promise.then(next).catch(next); + } + } else { + return next(); + } + }, + (req: http.IncomingMessage, res: http.ServerResponse) => { + if (req.method !== 'GET') return false; + + const u = url.parse(req.url || ''); + const m = u.pathname?.match(/^\/(.+)\/HEAD$/); + if (!m) return false; + if (/\.\./.test(m[1])) return false; + + const repo = m[1]; + + const next = () => { + const file = this.dirMap(path.join(m[1], 'HEAD')); + const exists = this.exists(file); + + if (exists) { + fs.createReadStream(file).pipe(res); + } else { + res.statusCode = 404; + res.end('not found'); + } + }; + + const exists = this.exists(repo); + const anyListeners = self.listeners('head').length > 0; + const dup = new HttpDuplex(req, res); + dup.exists = exists; + dup.repo = repo; + dup.cwd = this.dirMap(repo); + + dup.accept = dup.emit.bind(dup, 'accept'); + dup.reject = dup.emit.bind(dup, 'reject'); + + dup.once('reject', (code: number) => { + dup.statusCode = code || 500; + dup.end(); + }); + + if (!exists && self.autoCreate) { + dup.once('accept', (dir: string) => { + self.create(dir || repo, next); + }); + self.emit('head', dup); + if (!anyListeners) dup.accept(); + } else if (!exists) { + res.statusCode = 404; + res.setHeader('content-type', 'text/plain'); + res.end('repository not found'); + } else { + dup.once('accept', next); + self.emit('head', dup); + if (!anyListeners) dup.accept(); + } + }, + (req: http.IncomingMessage, res: http.ServerResponse) => { + if (req.method !== 'POST') return false; + const m = req.url?.match(/\/(.+)\/git-(.+)/); + if (!m) return false; + if (/\.\./.test(m[1])) return false; + + const repo = m[1], + service = m[2]; + + if (services.indexOf(service) < 0) { + res.statusCode = 405; + res.end('service not available'); + return; + } + + res.setHeader( + 'content-type', + 'application/x-git-' + service + '-result' + ); + noCache(res); + + const action = createAction( + { + repo: repo, + service: service as ServiceString, + cwd: self.dirMap(repo), + }, + req, + res + ); + + action.on('header', () => { + const evName = action.evName; + if (evName) { + const anyListeners = self.listeners(evName).length > 0; + self.emit(evName, action); + if (!anyListeners) action.accept(); + } + }); + }, + (req: http.IncomingMessage, res: http.ServerResponse) => { + if (req.method !== 'GET' && req.method !== 'POST') { + res.statusCode = 405; + res.end('method not supported'); + } else { + return false; + } + }, + (req: http.IncomingMessage, res: http.ServerResponse) => { + res.statusCode = 404; + res.end('not found'); + }, + ]; + res.setHeader('connection', 'close'); + + (function next(ix) { + const x = handlers[ix].call(self, req, res); + if (x === false) next(ix + 1); + })(0); + } + /** + * starts a git server on the given port + * @param port - the port to start the server on + * @param options - the options to add extended functionality to the server + * @param options.type - this is either https or http (the default is http) + * @param options.key - the key file for the https server + * @param options.cert - the cert file for the https server + * @param callback - the function to call when server is started or error has occurred + */ + listen(port: number, options?: GitServerOptions, callback?: () => void): Git { + if (!options) { + options = { type: 'http' }; + } + + const createServer = + options.type == 'http' + ? http.createServer + : https.createServer.bind(this, options); + + this.server = createServer((req, res) => { + this.handle(req, res); + }); + + this.server.listen(port, callback); + + return this; + } + /** + * closes the server instance + * @param will resolve or reject when the server closes or fails to close. + */ + close(): Promise { + return new Promise((resolve, reject) => { + this.server?.close((err) => { + err ? reject(err) : resolve('Success'); + }); + }); + } +} diff --git a/src/http-duplex.test.ts b/src/http-duplex.test.ts new file mode 100644 index 0000000..4372245 --- /dev/null +++ b/src/http-duplex.test.ts @@ -0,0 +1,174 @@ +import { HttpDuplex } from './http-duplex'; +import http, { Server } from 'http'; +import fetch from 'node-fetch'; +import { readFileSync } from 'fs'; +import { AddressInfo } from 'net'; + +// eslint-disable-next-line no-undef +const selfSrc = readFileSync(__filename); + +declare global { + interface Object { + serialize(): string; + filterKeys(keys: string): object; + } + interface String { + format(...args: any[]): string; + streamlineLineEndings(ending?: string): string; + streamlineSpace(): string; + streamline(ending?: string): string; + } +} + +Object.prototype.serialize = (): string => { + return JSON.stringify(this, null, 4); +}; + +Object.prototype.filterKeys = function (key: string) { + Object.keys(this).forEach((i) => { + if (i == key) delete (this as any)[i]; + }); + + return this; +}; + +String.prototype.format = function () { + // eslint-disable-next-line prefer-rest-params + const args = Array.from(arguments); + return this.replace(/{(\d+)}/g, function (match, number) { + return typeof args[number] != 'undefined' ? args[number] : match; + }); +}; + +String.prototype.streamlineLineEndings = function (ending = '\n') { + return this.replace(/[\r\n,\r,\n]+/g, ending); +}; + +String.prototype.streamlineSpace = function () { + return this.replace(/[\f\t\v ]{2,}/g, ' '); +}; + +String.prototype.streamline = function (ending = '\n') { + return this.streamlineSpace().streamlineLineEndings(ending); +}; + +describe('http-duplex', () => { + let server: Server; + + jest.setTimeout(15000); + + beforeEach(() => { + console.log('create server'); + server = http.createServer(function (req, res) { + const dup = new HttpDuplex(req, res); + console.log(dup.method + ' ' + dup.url); // eslint-disable-line + switch (dup.url) { + case '/': + dup.setHeader('content-type', 'text/plain'); + if (dup.method === 'POST') { + dup.end(dup.headers['content-length']); + } else { + dup.end(readFileSync(__filename)); + } + break; + case '/info': + if (dup.method == 'GET') { + dup.setHeader('content-type', 'text/plain'); + const output = ( + 'Method: {0}\n' + + 'Path: {1}\n' + + 'Status: {2}\n' + + 'Http Version 1: {3}\n' + + 'Http Version 2: {4}\n' + + 'Headers: \n{5}\n' + + 'Trailers: {6}\n' + + 'Complete: {7}\n' + + 'Readable: {8}\n' + + 'Writeable: {9}\n' + + 'Connection: {10}\n' + + 'Socket: {11}\n' + ).format( + dup.method, + dup.url, + dup.statusCode, + dup.httpVersion, + '{0}.{1}'.format(dup.httpVersionMajor, dup.httpVersionMinor), + JSON.stringify(dup.headers), + JSON.stringify(dup.trailers), + dup.complete, + dup.readable, + dup.writable, + dup.connection, + dup.socket + ); + dup.end(output.streamline()); + } else { + dup.statusCode = 400; + dup.end('Bad Request'); + } + break; + default: + dup.statusCode = 404; + dup.end("File doesn't exist"); + break; + } + }); + server.listen(); + }); + + afterEach(() => { + server.close(); + }); + + test('should be able to handle requests', (done) => { + expect.assertions(3); + + server.on('error', (e) => { + console.log('error', e); + }); + + server.on('listening', async function () { + const { port } = server.address() as AddressInfo; + + const u = `http://localhost:${port}/`; + const response = await fetch(u); + const body = await response.text(); + + expect(String(body)).toBe(String(selfSrc)); + + const response1 = await fetch(u, { + method: 'POST', + body: 'beep boop\n', + headers: { 'Content-Type': 'text/plain' }, + }); + const body1 = await response1.text(); + expect(body1).toBe('10'); + + const response2 = await fetch(u + 'info'); + const body2 = await response2.text(); + + expect(String(body2.streamline())).toMatchInlineSnapshot(` + "Method: GET + Path: /info + Status: 200 + Http Version 1: 1.1 + Http Version 2: 1.1 + Headers: + {\\"accept\\":\\"*/*\\" + \\"user-agent\\":\\"node-fetch/1.0 (+https://github.com/bitinn/node-fetch)\\" + \\"accept-encoding\\":\\"gzip + deflate\\" + \\"connection\\":\\"close\\" + \\"host\\":\\"localhost:${port}\\"} + Trailers: {} + Complete: false + Readable: true + Writeable: true + Connection: [object Object] + Socket: [object Object] + " + `); + done(); + }); + }); +}); diff --git a/src/http-duplex.ts b/src/http-duplex.ts new file mode 100644 index 0000000..60933d8 --- /dev/null +++ b/src/http-duplex.ts @@ -0,0 +1,286 @@ +import http from 'http'; +import EventEmitter from 'events'; + +export class HttpDuplex extends EventEmitter { + setHeader(arg0: string, arg1: string) { + throw new Error('Method not implemented.'); + } + end(reason?: any) { + throw new Error('Method not implemented.'); + } + destroy() { + throw new Error('Method not implemented.'); + } + accept() { + throw new Error('Method not implemented.'); + } + reject(code: number, msg: string) { + throw new Error('Method not implemented.'); + } + + /** + * A IncomingMessage created by http.Server or http.ClientRequest usually passed as the + * first parameter to the 'request' and 'response' events. Implements Readable Stream interface + * but may not be a decendant thereof. + * @see {@link https://nodejs.org/api/http.html#http_event_request|request} + * @see {@link https://nodejs.org/api/http.html#http_class_http_incomingmessage|http.IncomingMessage} + * + */ + req: http.IncomingMessage; + + /** + * Created http.server. Passed as the second parameter to the 'request' event. + * The response implements Writable Stream interface but isn't a descendent thereof. + * @see {@link https://nodejs.org/api/http.html#http_event_request|request} + * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse} + */ + res: http.ServerResponse; + cwd: string | undefined; + repo: string | undefined; + exists: boolean | undefined; + + /** + * Constructs a proxy object over input and output resulting in a unified stream. + * Generally meant to combine request and response streams in the http.request event + * @see {@link https://nodejs.org/api/http.html#http_event_request|request} + * @see {@link https://nodejs.org/api/http.html#http_class_http_incomingmessage|http.IncomingMessage} + * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse} + * @example A simple example is shown below + ``` + http.createServer(function (req, res) { + var dup = new HttpDuplex(req, res); + res.end("Request: " + req.method + " " + req.url); + }).listen(80); + ``` + */ + constructor(input: http.IncomingMessage, output: http.ServerResponse) { + super(); + + this.req = input; + this.res = output; + + // request / input proxy events + ['data', 'end', 'error', 'close'].forEach((name) => { + this.req.on(name, this.emit.bind(this, name)); + }); + + // respone / output proxy events + ['error', 'drain'].forEach((name) => { + this.res.on(name, this.emit.bind(this, name)); + }); + } + + get complete() { + return this.req.complete; + } + + /** + * Reference to the underlying socket for the request connection. + * @readonly + * @see {@link https://nodejs.org/api/http.html#http_request_socket|request.Socket} + */ + get connection() { + return this.req.connection; + } + + /** + * Request/response headers. Key-value pairs of header names and values. Header names are always lower-case. + * @readonly + * @see {@link https://nodejs.org/api/http.html#http_message_headers|message.headers} + */ + get headers() { + return this.req.headers; + } + + /** + * Requested HTTP Version sent by the client. Usually either '1.0' or '1.1' + * @see {@link https://nodejs.org/api/http.html#http_message_httpversion|message.httpVersion} + * @readonly + */ + get httpVersion() { + return this.req.httpVersion; + } + + /** + * First integer in the httpVersion string + * @see httpVersion + * @readonly + */ + get httpVersionMajor() { + return this.req.httpVersionMajor; + } + + /** + * Second integer ni the httpVersion string + * @see httpVersion + * @readonly + */ + get httpVersionMinor() { + return this.req.httpVersionMinor; + } + + /** + * Request method of the incoming request. + * @see {@link https://nodejs.org/api/http.html#http_event_request|request} + * @see {@link https://nodejs.org/api/http.html#http_class_http_serverresponse|http.ServerResponse} + * @example 'GET', 'DELETE' + * @readonly + */ + get method() { + return this.req.method; + } + + /** + * Is this stream readable. + * @readonly + */ + get readable() { + return this.req.readable; + } + + /** + * net.Socket object associated with the connection. + * @see {@link https://nodejs.org/api/net.html#net_class_net_socket|net.Socket} + * @readonly + */ + get socket() { + return this.req.socket; + } + + /** + * The HTTP status code. Generally assigned before sending headers for a response to a client. + * @see {@link https://nodejs.org/api/http.html#http_response_statuscode|response.statusCode} + * @example request.statusCode = 404; + */ + get statusCode() { + return this.res.statusCode; + } + + set statusCode(val) { + this.res.statusCode = val; + } + + /** + * Controls the status message sent to the client as long as an explicit call to response.writeHead() isn't made + * If ignored or the value is undefined, the default message corresponding to the status code will be used. + * @see {@link https://nodejs.org/api/http.html#http_response_statusmessage|response.statusMessage} + * @example request.statusMessage = 'Document Not found'; + */ + get statusMessage() { + return this.res.statusMessage; + } + + set statusMessage(val) { + this.res.statusMessage = val; + } + + /** + * Request/response trailer headers. Just like {@link headers} except these are only written + * after the initial response to the client. + * This object is only populated at the 'end' event and only work if a 'transfer-encoding: chunked' + * header is sent in the initial response. + * @readonly + * @see headers + * @see addTrailers + * @see {@link https://nodejs.org/api/http.html#http_message_trailers|message.trailers} + * @see {@link https://nodejs.org/api/http.html#http_response_addtrailers_headers|response.addTrailers} + */ + get trailers() { + return this.req.trailers; + } + + /** + * Request URL string. + * @example A request made as: + * GET /info?check=none HTTP/1.1 + * @example Will return the string + * '/info?check=none' + * @readonly + */ + get url() { + return this.req.url; + } + + // output / response wrapping + get writable() { + return this.res.writable; + } + + /** + * Sends a response header to the client request. Must only be called one time and before calling response.end(). + * @param statusCode 3-digit HTTP status code, like 404 + * @param statusMessage - An optional human readable status message to send with the status code + * @param headers - An object containing the response headers to send + * @see {@link https://nodejs.org/api/http.html#http_response_writehead_statuscode_statusmessage_headers|response.writeHead} + * @example var content = 'Under Construction...'; + * response.writeHead(200, { + * 'Content-Length': Buffer.byteLength(content), + * 'Content-Type': 'text/plain' + * }); + * response.end(content); + */ + writeHead(statusCode: number, statusMessage: string, headers: string[]) { + this.res.writeHead(statusCode, statusMessage, headers); + return this; + } + + /** + * Buffers written data in memory. This data will be flushed when either the uncork or end methods are called. + * @see uncork + * @see {@link https://nodejs.org/api/stream.html#stream_writable_cork|stream.Writeable.cork} + * @example + * request.cork(); + * request.write('buffer data '); + * request.write('before sending '); + * request.uncork(); + */ + cork() { + this.res.socket?.cork(); + return this; + } + + /** + * Flushes all data buffered since cork() was called. + * @see cork + * @see {@link https://nodejs.org/api/stream.html#stream_writable_uncork|stream.Writeable.uncork} + */ + uncork() { + this.res.socket?.uncork(); + return this; + } +} + +// proxy request methods +['pause', 'resume', 'setEncoding'].forEach(function (name) { + (HttpDuplex.prototype as any)[name] = function () { + // eslint-disable-next-line prefer-rest-params + return (this.req as any)[name].apply(this.req, Array.from(arguments)); + }; +}); + +// proxy respone methods +[ + 'setDefaultEncoding', + 'write', + 'end', + 'flush', + 'writeHeader', + 'writeContinue', + 'setHeader', + 'getHeader', + 'removeHeader', + 'addTrailers', +].forEach(function (name) { + (HttpDuplex.prototype as any)[name] = function () { + // eslint-disable-next-line prefer-rest-params + return (this.res as any)[name].apply(this.res, Array.from(arguments)); + }; +}); + +/** + * Destroys object and it's bound streams + */ +HttpDuplex.prototype.destroy = function () { + this.req.destroy(); + this.res.destroy(); +}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..e5354fe --- /dev/null +++ b/src/index.ts @@ -0,0 +1,5 @@ +export * from './git'; +export * from './http-duplex'; +export * from './service'; +export * from './types'; +export * from './util'; diff --git a/src/service.ts b/src/service.ts new file mode 100644 index 0000000..81e23b9 --- /dev/null +++ b/src/service.ts @@ -0,0 +1,235 @@ +import http from 'http'; +import zlib from 'zlib'; +import through, { ThroughStream } from 'through'; +import util from 'util'; +import os from 'os'; +import { spawn } from 'child_process'; + +import { HttpDuplex } from './http-duplex'; +import { ServiceString } from './types'; +import { packSideband } from './util'; + +const headerRegex: { [key: string]: string } = { + 'receive-pack': '([0-9a-fA-F]+) ([0-9a-fA-F]+) refs\/(heads|tags)\/(.*?)( |00|\u0000)|^(0000)$', // eslint-disable-line + 'upload-pack': '^\\S+ ([0-9a-fA-F]+)', +}; + +const decoder: { [key: string]: () => zlib.Gunzip | zlib.Deflate } = { + gzip: (): zlib.Gunzip => zlib.createGunzip(), + deflate: (): zlib.Deflate => zlib.createDeflate(), +}; +export interface ServiceOptions { + repo: string; + cwd: string; + service: ServiceString; +} + +export class Service extends HttpDuplex { + status: string; + repo: string; + service: string; + cwd: string; + logs: string[]; + last: string | undefined; + commit: string | undefined; + evName: string | undefined; + username: string | undefined; + + /** + * Handles invoking the git-*-pack binaries + * @param opts - options to bootstrap the service object + * @param req - http request object + * @param res - http response + */ + constructor( + opts: ServiceOptions, + req: http.IncomingMessage, + res: http.ServerResponse + ) { + super(req, res); + + let data = ''; + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + + this.status = 'pending'; + this.repo = opts.repo; + this.service = opts.service; + this.cwd = opts.cwd; + this.logs = []; + + const buffered = through().pause(); + + // stream needed to receive data after decoding, but before accepting + const ts = through(); + + const encoding = req.headers['content-encoding']; + + if (encoding && decoder[encoding]) { + // data is compressed with gzip or deflate + req.pipe(decoder[encoding]()).pipe(ts).pipe(buffered); + } else { + // data is not compressed + req.pipe(ts).pipe(buffered); + } + + if (req.headers['authorization']) { + const tokens = req.headers['authorization'].split(' '); + if (tokens[0] === 'Basic') { + const splitHash = Buffer.from(tokens[1], 'base64') + .toString('utf8') + .split(':'); + this.username = splitHash.shift(); + } + } + + ts.once('data', function onData(chunk: string) { + data += chunk; + + const ops = data.match(new RegExp(headerRegex[self.service], 'gi')); + if (!ops) return; + data = ''; + + ops.forEach(function (op) { + let type; + const m = op.match(new RegExp(headerRegex[self.service])); + + if (!m) return; + + if (self.service === 'receive-pack') { + self.last = m[1]; + self.commit = m[2]; + + if (m[3] == 'heads') { + type = 'branch'; + self.evName = 'push'; + } else { + type = 'version'; + self.evName = 'tag'; + } + + const headers: { [key: string]: string } = { + last: self.last, + commit: self.commit, + }; + headers[type] = (self as any)[type] = m[4]; + self.emit('header', headers); + } else if (self.service === 'upload-pack') { + self.commit = m[1]; + self.evName = 'fetch'; + self.emit('header', { + commit: self.commit, + }); + } + }); + }); + + self.once('accept', function onAccept() { + process.nextTick(function () { + const cmd = + os.platform() == 'win32' + ? ['git', opts.service, '--stateless-rpc', opts.cwd] + : ['git-' + opts.service, '--stateless-rpc', opts.cwd]; + + const ps = spawn(cmd[0], cmd.slice(1)); + + ps.on('error', function (error: Error) { + self.emit( + 'error', + new Error(`${error.message} running command ${cmd.join(' ')}`) + ); + }); + + self.emit('service', ps); + + const respStream = through( + function write(this: ThroughStream, c: any) { + if (self.listeners('response').length === 0) { + if (self.logs.length > 0) { + while (self.logs.length > 0) { + this.queue(self.logs.pop()); + } + } + + return this.queue(c); + } + // prevent git from sending the close signal + if (c.length === 4 && c.toString() === '0000') return; + this.queue(c); + }, + function end(this: ThroughStream) { + if (self.listeners('response').length > 0) return; + + this.queue(null); + } + ); + + (respStream as any).log = function () { + // eslint-disable-next-line prefer-rest-params + (self as any).log(...arguments); + }; + + self.emit('response', respStream, function endResponse() { + (res as any).queue(Buffer.from('0000')); + (res as any).queue(null); + }); + + ps.stdout.pipe(respStream).pipe(res); + + buffered.pipe(ps.stdin); + buffered.resume(); + + ps.on('exit', () => { + if (self.logs.length > 0) { + while (self.logs.length > 0) { + respStream.queue(self.logs.pop()); + } + respStream.queue(Buffer.from('0000')); + respStream.queue(null); + } + + self.emit.bind(self, 'exit'); + }); + }); + }); + + self.once('reject', function onReject(code: number, msg: string) { + res.statusCode = code; + res.end(msg); + }); + } + + log() { + // eslint-disable-next-line prefer-rest-params + const _log = util.format(...arguments); + const SIDEBAND = String.fromCharCode(2); // PROGRESS + const message = `${SIDEBAND}${_log}\n`; + const formattedMessage = Buffer.from(packSideband(message)); + + this.logs.unshift(formattedMessage.toString()); + } + /** + * reject request in flight + * @param code - http response code + * @param msg - message that should be displayed on the client + */ + reject(code: number, msg: string) { + if (this.status !== 'pending') return; + + if (msg === undefined && typeof code === 'string') { + msg = code; + code = 500; + } + this.status = 'rejected'; + this.emit('reject', code || 500, msg); + } + /** + * accepts request to access resource + */ + accept() { + if (this.status !== 'pending') return; + + this.status = 'accepted'; + this.emit('accept'); + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..6b755b4 --- /dev/null +++ b/src/types.ts @@ -0,0 +1 @@ +export type ServiceString = 'upload-pack' | 'receive-pack'; diff --git a/src/util.test.ts b/src/util.test.ts new file mode 100644 index 0000000..2f5c6df --- /dev/null +++ b/src/util.test.ts @@ -0,0 +1,89 @@ +import { basicAuth, noCache, parseGitName } from './util'; + +describe('util', () => { + describe('basicAuth', () => { + test('should send back basic auth headers', (done) => { + const headers: any = {}; + + const req: any = { + headers: {}, + }; + + const res: any = { + writeHead: function (_code: number) { + code = _code; + }, + setHeader: function (key: string | number, value: any) { + headers[key] = value; + }, + end: function (_status: number) { + status = _status; + expect(code).toBe(401); + expect(headers).toEqual({ + 'Content-Type': 'text/plain', + 'WWW-Authenticate': 'Basic realm="authorization needed"', + }); + expect(status).toBe('401 Unauthorized'); + done(); + }, + }; + + let code = 0; + let status = 0; + + basicAuth(req, res, () => { + expect('').not.toEqual('should not have entered this callback'); + done(); + }); + }); + + test('should accept headers and call callback', (done) => { + const req: any = { + headers: { + authorization: 'Basic T3BlbjpTZXNhbWU=', + }, + }; + + const res: any = {}; + + basicAuth(req, res, (username, password) => { + expect(username).toBe('Open'); + expect(password).toBe('Sesame'); + done(); + }); + }); + }); + + describe('noCache', () => { + const headers: any = { + 'persisted-header': 'I have been here foreveeeerrr', + }; + + const res: any = { + setHeader: function (key: string | number, value: any) { + headers[key] = value; + }, + }; + noCache(res); + expect(headers).toEqual({ + 'persisted-header': 'I have been here foreveeeerrr', + expires: 'Fri, 01 Jan 1980 00:00:00 GMT', + pragma: 'no-cache', + 'cache-control': 'no-cache, max-age=0, must-revalidate', + }); + }); + + describe('parseGitName', () => { + test('should remove .git from repo name', () => { + expect(parseGitName('test.git')).toBe('test'); + }); + + test('should remove .git from the end of repo name but not in the middle', () => { + expect(parseGitName('test.git.git')).toBe('test.git'); + }); + + test("if .git does not exist in the string, don't remove it", () => { + expect(parseGitName('test')).toBe('test'); + }); + }); +}); diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..95c8a78 --- /dev/null +++ b/src/util.ts @@ -0,0 +1,171 @@ +import http from 'http'; +import { spawn } from 'child_process'; + +import { Git } from './git'; +import { HttpDuplex } from './http-duplex'; +import { Service, ServiceOptions } from './service'; +import { ServiceString } from './types'; + +export function packSideband(s: string): string { + const n = (4 + s.length).toString(16); + return Array(4 - n.length + 1).join('0') + n + s; +} + +/** + * adds headers to the response object to add cache control + * @param res - http response + */ +export function noCache(res: http.ServerResponse) { + res.setHeader('expires', 'Fri, 01 Jan 1980 00:00:00 GMT'); + res.setHeader('pragma', 'no-cache'); + res.setHeader('cache-control', 'no-cache, max-age=0, must-revalidate'); +} + +/** + * sets and parses basic auth headers if they exist + * @param req - http request object + * @param res - http response + * @param callback - function(username, password) + */ +export function basicAuth( + req: http.IncomingMessage, + res: http.ServerResponse, + callback: (username?: string, password?: string) => void +) { + if (!req.headers['authorization']) { + res.setHeader('Content-Type', 'text/plain'); + res.setHeader('WWW-Authenticate', 'Basic realm="authorization needed"'); + res.writeHead(401); + res.end('401 Unauthorized'); + } else { + const tokens = req.headers['authorization'].split(' '); + if (tokens[0] === 'Basic') { + const splitHash = Buffer.from(tokens[1], 'base64') + .toString('utf8') + .split(':'); + const username = splitHash.shift(); + const password = splitHash.join(':'); + + callback(username, password); + } + } +} +/** + * execute given git operation and respond + * @param dup - duplex object to catch errors + * @param service - the method that is responding infoResponse (push, pull, clone) + * @param repoLocation - the repo path on disk + * @param res - http response + */ +export function serviceRespond( + dup: HttpDuplex | Git, + service: ServiceString, + repoLocation: string, + res: http.ServerResponse +) { + res.write(packSideband('# service=git-' + service + '\n')); + res.write('0000'); + + const isWin = /^win/.test(process.platform); + + const cmd = isWin + ? ['git', service, '--stateless-rpc', '--advertise-refs', repoLocation] + : ['git-' + service, '--stateless-rpc', '--advertise-refs', repoLocation]; + + const ps = spawn(cmd[0], cmd.slice(1)); + + ps.on('error', (err) => { + dup.emit( + 'error', + new Error(`${err.message} running command ${cmd.join(' ')}`) + ); + }); + ps.stdout.pipe(res); +} +/** + * sends http response using the appropriate output from service call + * @param git - an instance of git object + * @param repo - the repository + * @param service - the method that is responding infoResponse (push, pull, clone) + * @param req - http request object + * @param res - http response + */ +export function infoResponse( + git: Git, + repo: string, + service: ServiceString, + req: http.IncomingMessage, + res: http.ServerResponse +) { + function next() { + res.setHeader( + 'content-type', + 'application/x-git-' + service + '-advertisement' + ); + noCache(res); + serviceRespond(git, service, git.dirMap(repo), res); + } + + const dup = new HttpDuplex(req, res); + dup.cwd = git.dirMap(repo); + dup.repo = repo; + + dup.accept = dup.emit.bind(dup, 'accept'); + dup.reject = dup.emit.bind(dup, 'reject'); + + dup.once('reject', (code: number) => { + res.statusCode = code || 500; + res.end(); + }); + + const anyListeners = git.listeners('info').length > 0; + + const exists = git.exists(repo); + dup.exists = exists; + + if (!exists && git.autoCreate) { + dup.once('accept', () => { + git.create(repo, next); + }); + + git.emit('info', dup); + if (!anyListeners) dup.accept(); + } else if (!exists) { + res.statusCode = 404; + res.setHeader('content-type', 'text/plain'); + res.end('repository not found'); + } else { + dup.once('accept', next); + git.emit('info', dup); + + if (!anyListeners) dup.accept(); + } +} +/** + * parses a git string and returns the repo name + * @param repo - the raw repo name containing .git + */ +export function parseGitName(repo: string): string { + const locationOfGit = repo.lastIndexOf('.git'); + return repo.slice(0, locationOfGit > 0 ? locationOfGit : repo.length); +} +/** + * responds with the correct service depending on the action + * @param opts - options to pass Service + * @param req - http request object + * @param res - http response + */ +export function createAction( + opts: ServiceOptions, + req: http.IncomingMessage, + res: http.ServerResponse +): Service { + const service = new Service(opts, req, res); + + // TODO: see if this works or not + // Object.keys(opts).forEach((key) => { + // service[key] = opts[key]; + // }); + + return service; +} diff --git a/test/git.js b/test/git.js deleted file mode 100644 index 0f132ee..0000000 --- a/test/git.js +++ /dev/null @@ -1,1014 +0,0 @@ -const test = require('tape'); - -const fs = require('fs'); -const path = require('path'); -const spawn = require('child_process').spawn; -const exec = require('child_process').exec; -const http = require('http'); -const async = require('async'); - -const GitServer = require('../'); - -test('git', (t) => { - t.plan(10); - - t.test('create, push to, and clone a repo', (t) => { - var lastCommit; - - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - const server = http.createServer((req, res) => { - repos.handle(req, res); - }).listen(port); - - process.chdir(srcDir); - - async.waterfall([ - (callback) => { - repos.mkdir('xyz', () => { - callback(); - }); - }, - (callback) => { - repos.create('xyz/doom', () => { - callback(); - }); - }, - (callback) => { - spawn('git', ['init']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'abcd', () => { - callback(); - }); - }, - (callback) => { - spawn('git', ['add', 'a.txt']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['commit', '-am', 'a!!']) - .on('exit', () => { - exec('git log | head -n1', (err, stdout) => { - lastCommit = stdout.split(/\s+/)[1]; - callback(); - }); - }); - }, - (callback) => { - spawn('git', [ - 'push', 'http://localhost:' + port + '/xyz/doom', 'master' - ]) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - process.chdir(dstDir); - spawn('git', ['clone', 'http://localhost:' + port + '/xyz/doom']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.exists(dstDir + '/doom/a.txt', (ex) => { - t.ok(ex, 'a.txt exists'); - callback(); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - server.close(); - t.end(); - }); - - repos.on('push', (push) => { - t.equal(push.repo, 'xyz/doom', 'repo name'); - t.equal(push.commit, lastCommit, 'commit ok'); - t.equal(push.branch, 'master', 'master branch'); - - t.equal(push.headers.host, 'localhost:' + port, 'http host'); - t.equal(push.method, 'POST', 'is a post'); - t.equal(push.url, '/xyz/doom/git-receive-pack', 'receive pack'); - - push.accept(); - }); - }); - - - - t.test('create, push to, and clone a repo successful', (t) => { - t.plan(9); - - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - const server = http.createServer((req, res) => { - repos.handle(req, res); - }); - server.listen(port); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - spawn('git', ['init']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { - t.ok(!err, 'no error on write'); - callback(); - }); - }, - (callback) => { - spawn('git', ['add', 'a.txt']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['commit', '-am', 'a!!']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', [ - 'push', 'http://localhost:' + port + '/doom', 'master' - ]) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - process.chdir(dstDir); - spawn('git', ['clone', 'http://localhost:' + port + '/doom']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.stat(dstDir + '/doom/a.txt', (ex) => { - t.ok(!ex, 'a.txt exists'); - callback(); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - server.close(); - t.end(); - }); - - repos.on('push', (push) => { - t.equal(push.repo, 'doom'); - push.accept(); - }); - }); - - test('clone into programatic directories', (t) => { - t.plan(21); - - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const targetDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - fs.mkdirSync(targetDir, 0700); - - const server = new GitServer((dir) => { - t.equal(dir, 'doom.git'); - return path.join(targetDir, dir); - }); - server.listen(port); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - spawn('git', ['init']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { - t.ok(!err, 'no error on write'); - callback(); - }); - }, - (callback) => { - spawn('git', ['add', 'a.txt'], { - cwd: srcDir - }) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['commit', '-am', 'a!!'], { - cwd: srcDir - }) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', [ - 'push', 'http://localhost:' + port + '/doom.git', 'master' - ], { - cwd: srcDir - }) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - process.chdir(dstDir); - spawn('git', ['clone', 'http://localhost:' + port + '/doom.git']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.stat(dstDir + '/doom/a.txt', (ex) => { - t.ok(!ex, 'a.txt exists'); - callback(); - }); - }, - (callback) => { - fs.stat(targetDir + '/doom.git/HEAD', (ex) => { - t.ok(!ex, 'INFO exists'); - callback(); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - server.close(); - t.end(); - }); - - server.on('push', (push) => { - t.equal(push.repo, 'doom.git'); - push.accept(); - }); - }); - - test('test tagging', (t) => { - t.plan(28); - - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - var lastCommit; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - const server = http.createServer((req, res) => { - repos.handle(req, res); - }); - server.listen(port); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - repos.create('doom', () => { - callback(); - }); - }, - (callback) => { - spawn('git', ['init']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { - t.ok(!err, 'no error on write'); - callback(); - }); - }, - (callback) => { - spawn('git', ['add', 'a.txt']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['commit', '-am', 'a!!']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['tag', '0.0.1']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'efgh', (err) => { - t.ok(!err, 'no error on write'); - callback(); - }); - }, - (callback) => { - spawn('git', ['add', 'a.txt']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['commit', '-am', 'a!!']) - .on('exit', () => { - exec('git log | head -n1', (err, stdout) => { - lastCommit = stdout.split(/\s+/)[1]; - callback(); - }); - }); - }, - (callback) => { - spawn('git', ['tag', '0.0.2']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', [ - 'push', '--tags', 'http://localhost:' + port + '/doom', 'master' - ]) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - process.chdir(dstDir); - spawn('git', ['clone', 'http://localhost:' + port + '/doom']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.exists(dstDir + '/doom/a.txt', (ex) => { - t.ok(ex, 'a.txt exists'); - callback(); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - server.close(); - t.end(); - }); - - repos.on('push', (push) => { - t.equal(push.repo, 'doom', 'repo name'); - t.equal(push.commit, lastCommit, 'commit ok'); - t.equal(push.branch, 'master', 'master branch'); - - t.equal(push.headers.host, 'localhost:' + port, 'http host'); - t.equal(push.method, 'POST', 'is a post'); - t.equal(push.url, '/doom/git-receive-pack', 'receive pack'); - - push.accept(); - }); - - var firstTag = true; - repos.on('tag', (tag) => { - t.equal(tag.repo, 'doom', 'repo name'); - t.equal(tag.version, '0.0.' + (firstTag ? 1 : 2), 'tag received'); - - t.equal(tag.headers.host, 'localhost:' + port, 'http host'); - t.equal(tag.method, 'POST', 'is a post'); - t.equal(tag.url, '/doom/git-receive-pack', 'receive pack'); - - tag.accept(); - firstTag = false; - }); - }); - - t.test('repos list', (t) => { - t.plan(2); - - const workingRepoDir = path.resolve(__dirname, 'fixtures', 'server', 'tmp'); - const notWorkingRepoDir = path.resolve(__dirname, 'fixtures', 'server', 'temp'); - - t.test('should return back with one directory in server', (t) => { - t.plan(2); - - const repos = new GitServer(workingRepoDir, { - autoCreate: true - }); - - repos.list((err, results) => { - t.ok(err === null, 'there is no error'); - t.deepEqual(['test.git'], results); - t.end(); - }); - }); - - t.test('should return back error directory does not exist', (t) => { - t.plan(2); - - const repos = new GitServer(notWorkingRepoDir, { - autoCreate: true - }); - - repos.list((err, results) => { - t.ok(err !== null, 'there is an error'); - t.ok(results === undefined); - t.end(); - }); - }); - - t.end(); - }); - - test('create, push to, and clone a repo reject', (t) => { - t.plan(13); - - function _spawn(cmd, args, opts) { - var ps = spawn(cmd, args, opts); - ps.on('error', (err) => { - console.error( // eslint-disable-line - err.message + ' while executing: ' + - cmd + ' ' + args.join(' ') - ); - }); - return ps; - } - - var lastCommit; - - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - const server = http.createServer((req, res) => { - repos.handle(req, res); - }); - server.listen(port); - - t.on('end', () => { - server.close(); - }); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - repos.create('doom', () => { - callback(); - }); - }, - (callback) => { - _spawn('git', ['init']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'abcd', (err) => { - t.ok(!err, 'no error on write'); - callback(); - }); - }, - (callback) => { - _spawn('git', ['add', 'a.txt']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - _spawn('git', ['commit', '-am', 'a!!']) - .on('exit', () => { - exec('git log | head -n1', (err, stdout) => { - lastCommit = stdout.split(/\s+/)[1]; - callback(); - }); - }); - }, - (callback) => { - _spawn('git', [ - 'push', 'http://localhost:' + port + '/doom', 'master' - ]) - .on('exit', (code) => { - t.notEqual(code, 0); - callback(); - }); - }, - (callback) => { - const glog = _spawn('git', ['log'], { - cwd: repoDir + '/doom.git' - }); - glog.on('exit', (code) => { - t.equal(code, 128); - callback(); - }); - var data = ''; - glog.stderr.on('data', (buf) => data += buf); - glog.stderr.on('end', () => { - const res = /fatal: bad default revision 'HEAD'/.test(data) || /fatal: your current branch 'master' does not have any commits yet/.test(data); - t.ok(res); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - server.close(); - t.end(); - }); - - repos.on('push', (push) => { - t.equal(push.repo, 'doom', 'repo name'); - t.equal(push.commit, lastCommit, 'commit ok'); - t.equal(push.branch, 'master', 'master branch'); - - t.equal(push.headers.host, 'localhost:' + port, 'http host'); - t.equal(push.method, 'POST', 'is a post'); - t.equal(push.url, '/doom/git-receive-pack', 'receive pack'); - - push.reject(500, 'ACCESS DENIED'); - }); - }); - - t.test('create git server via listen() command', (t) => { - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - t.equal(repos.listen(port), repos); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - process.chdir(dstDir); - spawn('git', ['clone', 'http://localhost:' + port + '/doom']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - ], (err) => { - t.ok(!err, 'no errors'); - repos.close(); - t.end(); - }); - }); - - t.test('should return promise that resolves when server is closed if no callback specified', (t) => { - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - - const repos = new GitServer(repoDir); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - repos.listen(port, () => { - repos.close().then(() => { - t.end(); - }); - }); - }); - - t.test('should be able to protect certain routes', (t) => { - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true, - authenticate: ({ type, repo, user }, next) => { - - if (type == 'download', repo == 'doom') { - user((username, password) => { - if (username == 'root' && password == 'root') { - next(); - } else { - next('that is not the correct password'); - } - }); - } else { - next('that is not the correct password'); - } - } - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - repos.listen(port); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - process.chdir(dstDir); - const clone = spawn('git', ['clone', `http://root:root@localhost:${port}/doom.git`]); - - clone.on('close', function(code) { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - process.chdir(dstDir); - const clone = spawn('git', ['clone', `http://root:world@localhost:${port}/doom.git doom1`]); - let error = ''; - - clone.stderr.on('data', (d) => { - error += d.toString('utf8'); - }); - - clone.on('close', function(code) { - t.equal(error, `Cloning into \'doom.git doom1\'...\nfatal: unable to access \'http://localhost:${port}/doom.git doom1/\': The requested URL returned error: 400\n`); - t.equal(code, 128); - callback(); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - repos.close(); - t.end(); - }); - - }); - - t.test('should be able to access headers in authenticate', (t) => { - t.plan(14); - - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true, - authenticate: ({ type, repo, user, headers }, next) => { - if (type == 'download', repo == 'doom') { - t.ok(headers['host']); - t.ok(headers['user-agent']); - t.ok(headers['accept']); - t.ok(headers['pragma']); - t.ok(headers['accept-encoding']); - - user((username, password) => { - if (username == 'root' && password == 'root') { - next(); - } else { - next('that is not the correct password'); - } - }); - } else { - next('that is not the correct password'); - } - } - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - repos.listen(port); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - process.chdir(dstDir); - const clone = spawn('git', ['clone', `http://root:root@localhost:${port}/doom.git`]); - - clone.on('close', function(code) { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - process.chdir(dstDir); - const clone = spawn('git', ['clone', `http://root:world@localhost:${port}/doom.git doom1`]); - let error = ''; - - clone.stderr.on('data', (d) => { - error += d.toString('utf8'); - }); - - clone.on('close', function(code) { - t.equal(error, `Cloning into \'doom.git doom1\'...\nfatal: unable to access \'http://localhost:${port}/doom.git doom1/\': The requested URL returned error: 400\n`); - t.equal(code, 128); - callback(); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - repos.close(); - t.end(); - }); - - }); - - t.test('should be able to protect certain routes with a promised authenticate', (t) => { - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true, - authenticate: ({ type, repo, user }) => { - return new Promise(function(resolve, reject) { - if (type == 'download', repo == 'doom') { - user((username, password) => { - if (username == 'root' && password == 'root') { - return resolve(); - } else { - return reject('that is not the correct password'); - } - }); - } else { - return reject('that is not the correct password'); - } - }); - } - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - repos.listen(port); - - process.chdir(srcDir); - async.waterfall([ - (callback) => { - process.chdir(dstDir); - const clone = spawn('git', ['clone', `http://root:root@localhost:${port}/doom.git`]); - - clone.on('close', function(code) { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - process.chdir(dstDir); - const clone = spawn('git', ['clone', `http://root:world@localhost:${port}/doom.git doom1`]); - let error = ''; - - clone.stderr.on('data', (d) => { - error += d.toString('utf8'); - }); - - clone.on('close', function(code) { - t.equal(error, `Cloning into \'doom.git doom1\'...\nfatal: unable to access \'http://localhost:${port}/doom.git doom1/\': The requested URL returned error: 400\n`); - t.equal(code, 128); - callback(); - }); - } - ], (err) => { - t.ok(!err, 'no errors'); - repos.close(); - t.end(); - }); - }); - - t.test('should be able to send custom messages to git client (main stream)', (t) => { - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - - repos.on('push', (push) => { - console.log(`push ${push.repo}/${push.commit}`); // eslint-disable-line - push.log(' '); - push.log('Have a great day!'); - push.log(' '); - - push.accept(); - }); - - repos.listen(port); - - process.chdir(srcDir); - - async.waterfall([ - (callback) => { - repos.create('doom', () => { - callback(); - }); - }, - (callback) => { - spawn('git', ['init']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'abcd', () => { - callback(); - }); - }, - (callback) => { - spawn('git', ['add', 'a.txt']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['commit', '-m', 'a!!']) - .on('exit', () => { - callback(); - }); - }, - (callback) => { - const logs = []; - const push = spawn('git', [ - 'push', 'http://localhost:' + port + '/doom.git', 'master' - ]); - - push.stdout.on('data', (data) => { - if (data.toString() !== '') { - logs.push(data.toString()); - } - }); - - push.stderr.on('data', (data) => { - if (data.toString() !== '') { - logs.push(data.toString()); - } - }); - - push.on('exit', () => { - t.ok(logs.join(' ').indexOf('remote: Have a great day!') > -1); - callback(); - }); - }, - ], (err) => { - t.ok(!err, 'no errors'); - repos.close(); - t.end(); - }); - }); - - t.test('should be able to send custom messages to git client (response stream)', (t) => { - const repoDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const srcDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - const dstDir = `/tmp/${Math.floor(Math.random() * (1 << 30)).toString(16)}`; - - fs.mkdirSync(repoDir, 0700); - fs.mkdirSync(srcDir, 0700); - fs.mkdirSync(dstDir, 0700); - - const repos = new GitServer(repoDir, { - autoCreate: true - }); - const port = Math.floor(Math.random() * ((1 << 16) - 1e4)) + 1e4; - - repos.on('push', (push) => { - console.log(`push ${push.repo}/${push.commit}`); // eslint-disable-line - - push.on('response', stream => { - stream.log(' '); - stream.log('Have a great day!'); - stream.log(' '); - }); - - push.accept(); - }); - - repos.listen(port); - - process.chdir(srcDir); - - async.waterfall([ - (callback) => { - repos.create('doom', () => { - callback(); - }); - }, - (callback) => { - spawn('git', ['init']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - fs.writeFile(srcDir + '/a.txt', 'abcd', () => { - callback(); - }); - }, - (callback) => { - spawn('git', ['add', 'a.txt']) - .on('exit', (code) => { - t.equal(code, 0); - callback(); - }); - }, - (callback) => { - spawn('git', ['commit', '-m', 'a!!']) - .on('exit', () => { - callback(); - }); - }, - (callback) => { - const logs = []; - const push = spawn('git', [ - 'push', 'http://localhost:' + port + '/doom.git', 'master' - ]); - - push.stdout.on('data', (data) => { - if (data.toString() !== '') { - logs.push(data.toString()); - } - }); - - push.stderr.on('data', (data) => { - if (data.toString() !== '') { - logs.push(data.toString()); - } - }); - - push.on('exit', () => { - t.ok(logs.join(' ').indexOf('remote: Have a great day!') > -1); - callback(); - }); - }, - ], (err) => { - t.ok(!err, 'no errors'); - repos.close(); - t.end(); - }); - }); -}); diff --git a/test/http-duplex.js b/test/http-duplex.js deleted file mode 100644 index 542a8cb..0000000 --- a/test/http-duplex.js +++ /dev/null @@ -1,150 +0,0 @@ -var test = require('tap').test; -var httpDuplex = require('../lib/http-duplex'); -var http = require('http'); -var request = require('request'); -var fs = require('fs'); -var selfSrc = fs.readFileSync(__filename); - -Object.prototype.serialize = function() { - return JSON.stringify(this, null, 4); -}; - -Object.prototype.filterKeys = function(key) { - var obj = this; - Object.keys(this).forEach(function (i) { - if (i == key) - delete obj[i]; - }); - - return obj; -}; - -String.prototype.format = function() { - var args = Array.from(arguments); - return this.replace(/{(\d+)}/g, function(match, number) { - return typeof args[number] != 'undefined' ? args[number] : match; - }); -}; - -String.prototype.streamlineLineEndings = function(ending = "\n") { - return this.replace(/[\r\n,\r,\n]+/g, ending); -}; - -String.prototype.streamlineSpace = function() { - return this.replace(/[\f\t\v ]{2,}/g, ' '); -}; - -String.prototype.streamline = function(ending = "\n") { - return this.streamlineSpace().streamlineLineEndings(ending); -}; - -var server = http.createServer(function (req, res) { - var dup = new httpDuplex(req, res); - console.log(dup.method + ' ' + dup.url); // eslint-disable-line - - switch (dup.url) { - case '/': - dup.setHeader('content-type', 'text/plain'); - if (dup.method === 'POST') { - var size = 0; - dup.on('data', function (buf) { size += buf.length; }); - dup.on('end', function () { - dup.end(size + '\n'); - }); - } - else fs.createReadStream(__filename).pipe(dup); - break; - case '/info': - if (dup.method == 'GET') { - dup.setHeader('content-type', 'text/plain'); - var output = ( - "Method: {0}\n" + - "Path: {1}\n" + - "Status: {2}\n" + - "Upgrade: {3}\n" + - "Http Version 1: {4}\n" + - "Http Version 2: {5}\n" + - "Headers: \n{6}\n" + - "Trailers: {7}\n" + - "Complete: {8}\n" + - "Readable: {9}\n" + - "Writeable: {10}\n" + - "Connection: {11}\n" + - "Client: {12}\n" + - "Socket: {13}\n" - ).format ( - dup.method, - dup.url, - dup.statusCode, - dup.upgrade, - dup.httpVersion, - "{0}.{1}".format(dup.httpVersionMajor, dup.httpVersionMinor), - dup.headers.filterKeys('undefined').serialize(), - dup.trailers.serialize(), - dup.complete, - dup.readable, - dup.writeable, - dup.connection, - dup.client, - dup.socket - ); - dup.end(output.streamline()); - } else { - dup.statusCode = 400; - dup.end("Bad Request"); - } - break; - default: - dup.statusCode = 404; - dup.end("File doesn't exist"); - break; - } -}); - -test('http-duplex', (t) => { - t.plan(3); - - server.listen(0); - server.on('listening', function () { - var u = 'http://localhost:' + server.address().port + '/'; - - request(u, function (err, res, body) { - if (err) t.fail(err); - t.equal(String(body), String(selfSrc)); - }); - - var r = request.post(u, function (err, res, body) { - if (err) t.fail(err); - t.equal(body, '10\n'); - }); - r.end('beep boop\n'); - - request(u + 'info', function (err, res, body) { - if (err) t.fail(err); - var check = "Method: GET\n" + - "Path: /info\n" + - "Status: 200\n" + - "Upgrade: false\n" + - "Http Version 1: 1.1\n" + - "Http Version 2: 1.1\n" + - "Headers: \n" + - "{\n" + - " \"host\": \"localhost:" + server.address().port + "\",\n" + - " \"connection\": \"close\"\n" + - "}\n" + - "Trailers: {}\n" + - "Complete: false\n" + - "Readable: true\n" + - "Writeable: {10}\n" + - "Connection: [object Object]\n" + - "Client: [object Object]\n" + - "Socket: [object Object]\n"; - - t.equal(String(body.streamline()), String(check.streamline())); - }); - }); - - t.on('end', function () { - server.close(); - }); -}); diff --git a/test/util.js b/test/util.js deleted file mode 100644 index 26a4de0..0000000 --- a/test/util.js +++ /dev/null @@ -1,96 +0,0 @@ -const test = require('tape'); - -const { basicAuth, noCache, parseGitName } = require('../lib/util'); - -test('util', (t) => { - t.plan(3); - - t.test('basicAuth', (t) => { - t.plan(2); - - t.test('should send back basic auth headers', (t) => { - let code = 0; - let headers = {}; - let status = 0; - - let res = { - writeHead: function(_code) { - code = _code; - }, - setHeader: function(key, value) { - headers[key] = value; - }, - end: function(_status) { - status = _status; - t.equal(code, 401); - t.deepEqual(headers, { - 'Content-Type': 'text/plain', - 'WWW-Authenticate': 'Basic realm="authorization needed"' - }); - t.equal(status, '401 Unauthorized'); - t.end(); - } - }; - basicAuth({ - headers: {} - }, res, () => { - t.fail('should not have entered this callback'); - }); - }); - - t.test('should accept headers and call callback', (t) => { - - basicAuth({ - headers: { - 'authorization': 'Basic T3BlbjpTZXNhbWU=' - } - }, {}, (username, password) => { - t.equal(username, 'Open'); - t.equal(password, 'Sesame'); - t.end(); - }); - - }); - }); - - t.test('noCache', (t) => { - let headers = { - 'persisted-header': 'I have been here foreveeeerrr' - }; - - let res = { - setHeader: function(key, value) { - headers[key] = value; - } - }; - noCache(res); - t.deepEqual(headers, { - 'persisted-header': 'I have been here foreveeeerrr', - 'expires': 'Fri, 01 Jan 1980 00:00:00 GMT', - 'pragma': 'no-cache', - 'cache-control': 'no-cache, max-age=0, must-revalidate' - }); - t.end(); - }); - - t.test('parseGitName', (t) => { - t.plan(3); - - t.test('should remove .git from repo name', (t) => { - t.equal(parseGitName('test.git'), 'test'); - t.end(); - }); - - t.test('should remove .git from the end of repo name but not in the middle', (t) => { - t.equal(parseGitName('test.git.git'), 'test.git'); - t.end(); - }); - - t.test('if .git does not exist in the string, don\'t remove it', (t) => { - t.equal(parseGitName('test'), 'test'); - t.end(); - }); - - }); - -}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9d9b632 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "lib": ["esnext"], + "target": "es2020", + "module": "commonjs", + "outDir": "dist", + "rootDir": "src", + "strict": true, + "noImplicitAny": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "types": ["node", "jest", "node-fetch"], + "allowJs": true, + "checkJs": false + }, + "include": ["src"] +} diff --git a/tsdoc-metadata.json b/tsdoc-metadata.json new file mode 100644 index 0000000..5e804b3 --- /dev/null +++ b/tsdoc-metadata.json @@ -0,0 +1,11 @@ +// This file is read by tools that parse documentation comments conforming to the TSDoc standard. +// It should be published with your NPM package. It should not be tracked by Git. +{ + "tsdocVersion": "0.12", + "toolPackages": [ + { + "packageName": "@microsoft/api-extractor", + "packageVersion": "7.18.19" + } + ] +} diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000..b2d6de3 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000..55d0c3e --- /dev/null +++ b/website/README.md @@ -0,0 +1,33 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +``` +$ GIT_USER= USE_SSH=true yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/babel.config.js b/website/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/website/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/website/docs/api/.api-extractor-meta b/website/docs/api/.api-extractor-meta new file mode 100644 index 0000000..1170f2f --- /dev/null +++ b/website/docs/api/.api-extractor-meta @@ -0,0 +1 @@ +{"0":["/Users/gabrielcsapo/Documents/coding/node-git-server/src","/Users/gabrielcsapo/Documents/coding/node-git-server/temp"],"1":["git.test.ts","git.ts","http-duplex.test.ts","http-duplex.ts","index.ts","node-git-server.api.md","service.ts","types.ts","util.test.ts","util.ts"],"2":[1637267065568,1637267407399,1637267065563,1637267705329,1637267437079],"3":[33188],"4":[28989,15940,4899,8637,130,6077,6491,60,2365,4744],"5":[0,0,0,0,0,0,1,0,1,1,0,2,0,2,2,0,3,0,3,3,0,4,0,2,4,1,5,0,4,5,0,6,0,2,6,0,7,0,2,7,0,8,0,0,8,0,9,0,2,9]} \ No newline at end of file diff --git a/website/docs/api/_category_.json b/website/docs/api/_category_.json new file mode 100644 index 0000000..38c866f --- /dev/null +++ b/website/docs/api/_category_.json @@ -0,0 +1,3 @@ +{ + "label": "API" +} \ No newline at end of file diff --git a/website/docs/api/api-sidebar.js b/website/docs/api/api-sidebar.js new file mode 100644 index 0000000..80fd299 --- /dev/null +++ b/website/docs/api/api-sidebar.js @@ -0,0 +1,540 @@ +// Do not edit this file. It is automatically generated by docusaurus-plugin-api-extractor. +module.exports = (dir = 'api') => [ + { + type: 'category', + label: 'Packages', + collapsed: false, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/index`, + }, + { + type: 'category', + label: 'node-git-server', + collapsed: false, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server`, + }, + { + type: 'doc', + label: 'basicAuth', + id: `${dir}/node-git-server.basicauth`, + }, + { + type: 'doc', + label: 'createAction', + id: `${dir}/node-git-server.createaction`, + }, + { + type: 'category', + label: 'Git', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.git`, + }, + { + type: 'doc', + label: '(constructor)', + id: `${dir}/node-git-server.git._constructor_`, + }, + { + type: 'doc', + label: 'authenticate', + id: `${dir}/node-git-server.git.authenticate`, + }, + { + type: 'doc', + label: 'autoCreate', + id: `${dir}/node-git-server.git.autocreate`, + }, + { + type: 'doc', + label: 'checkout', + id: `${dir}/node-git-server.git.checkout`, + }, + { + type: 'doc', + label: 'close', + id: `${dir}/node-git-server.git.close`, + }, + { + type: 'doc', + label: 'create', + id: `${dir}/node-git-server.git.create`, + }, + { + type: 'doc', + label: 'dirMap', + id: `${dir}/node-git-server.git.dirmap`, + }, + { + type: 'doc', + label: 'exists', + id: `${dir}/node-git-server.git.exists`, + }, + { + type: 'doc', + label: 'getType', + id: `${dir}/node-git-server.git.gettype`, + }, + { + type: 'doc', + label: 'handle', + id: `${dir}/node-git-server.git.handle`, + }, + { + type: 'doc', + label: 'list', + id: `${dir}/node-git-server.git.list`, + }, + { + type: 'doc', + label: 'listen', + id: `${dir}/node-git-server.git.listen`, + }, + { + type: 'doc', + label: 'mkdir', + id: `${dir}/node-git-server.git.mkdir`, + }, + { + type: 'doc', + label: 'server', + id: `${dir}/node-git-server.git.server`, + }, + ], + }, + { + type: 'category', + label: 'GitAuthenticateOptions', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.gitauthenticateoptions`, + }, + { + type: 'doc', + label: 'headers', + id: `${dir}/node-git-server.gitauthenticateoptions.headers`, + }, + { + type: 'doc', + label: 'repo', + id: `${dir}/node-git-server.gitauthenticateoptions.repo`, + }, + { + type: 'doc', + label: 'type', + id: `${dir}/node-git-server.gitauthenticateoptions.type`, + }, + { + type: 'doc', + label: 'user', + id: `${dir}/node-git-server.gitauthenticateoptions.user`, + }, + ], + }, + { + type: 'category', + label: 'GitEvents', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.gitevents`, + }, + { + type: 'doc', + label: 'addListener', + id: `${dir}/node-git-server.gitevents.addlistener`, + }, + { + type: 'doc', + label: 'addListener', + id: `${dir}/node-git-server.gitevents.addlistener_1`, + }, + ], + }, + { + type: 'category', + label: 'GitOptions', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.gitoptions`, + }, + { + type: 'doc', + label: 'authenticate', + id: `${dir}/node-git-server.gitoptions.authenticate`, + }, + { + type: 'doc', + label: 'autoCreate', + id: `${dir}/node-git-server.gitoptions.autocreate`, + }, + { + type: 'doc', + label: 'checkout', + id: `${dir}/node-git-server.gitoptions.checkout`, + }, + ], + }, + { + type: 'category', + label: 'HttpDuplex', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.httpduplex`, + }, + { + type: 'doc', + label: '(constructor)', + id: `${dir}/node-git-server.httpduplex._constructor_`, + }, + { + type: 'doc', + label: 'accept', + id: `${dir}/node-git-server.httpduplex.accept`, + }, + { + type: 'doc', + label: 'complete', + id: `${dir}/node-git-server.httpduplex.complete`, + }, + { + type: 'doc', + label: 'connection', + id: `${dir}/node-git-server.httpduplex.connection`, + }, + { + type: 'doc', + label: 'cork', + id: `${dir}/node-git-server.httpduplex.cork`, + }, + { + type: 'doc', + label: 'cwd', + id: `${dir}/node-git-server.httpduplex.cwd`, + }, + { + type: 'doc', + label: 'destroy', + id: `${dir}/node-git-server.httpduplex.destroy`, + }, + { + type: 'doc', + label: 'end', + id: `${dir}/node-git-server.httpduplex.end`, + }, + { + type: 'doc', + label: 'exists', + id: `${dir}/node-git-server.httpduplex.exists`, + }, + { + type: 'doc', + label: 'headers', + id: `${dir}/node-git-server.httpduplex.headers`, + }, + { + type: 'doc', + label: 'httpVersion', + id: `${dir}/node-git-server.httpduplex.httpversion`, + }, + { + type: 'doc', + label: 'httpVersionMajor', + id: `${dir}/node-git-server.httpduplex.httpversionmajor`, + }, + { + type: 'doc', + label: 'httpVersionMinor', + id: `${dir}/node-git-server.httpduplex.httpversionminor`, + }, + { + type: 'doc', + label: 'method', + id: `${dir}/node-git-server.httpduplex.method`, + }, + { + type: 'doc', + label: 'readable', + id: `${dir}/node-git-server.httpduplex.readable`, + }, + { + type: 'doc', + label: 'reject', + id: `${dir}/node-git-server.httpduplex.reject`, + }, + { + type: 'doc', + label: 'repo', + id: `${dir}/node-git-server.httpduplex.repo`, + }, + { + type: 'doc', + label: 'req', + id: `${dir}/node-git-server.httpduplex.req`, + }, + { + type: 'doc', + label: 'res', + id: `${dir}/node-git-server.httpduplex.res`, + }, + { + type: 'doc', + label: 'setHeader', + id: `${dir}/node-git-server.httpduplex.setheader`, + }, + { + type: 'doc', + label: 'socket', + id: `${dir}/node-git-server.httpduplex.socket`, + }, + { + type: 'doc', + label: 'statusCode', + id: `${dir}/node-git-server.httpduplex.statuscode`, + }, + { + type: 'doc', + label: 'statusMessage', + id: `${dir}/node-git-server.httpduplex.statusmessage`, + }, + { + type: 'doc', + label: 'trailers', + id: `${dir}/node-git-server.httpduplex.trailers`, + }, + { + type: 'doc', + label: 'uncork', + id: `${dir}/node-git-server.httpduplex.uncork`, + }, + { + type: 'doc', + label: 'url', + id: `${dir}/node-git-server.httpduplex.url`, + }, + { + type: 'doc', + label: 'writable', + id: `${dir}/node-git-server.httpduplex.writable`, + }, + { + type: 'doc', + label: 'writeHead', + id: `${dir}/node-git-server.httpduplex.writehead`, + }, + ], + }, + { + type: 'doc', + label: 'infoResponse', + id: `${dir}/node-git-server.inforesponse`, + }, + { + type: 'doc', + label: 'noCache', + id: `${dir}/node-git-server.nocache`, + }, + { + type: 'doc', + label: 'packSideband', + id: `${dir}/node-git-server.packsideband`, + }, + { + type: 'doc', + label: 'parseGitName', + id: `${dir}/node-git-server.parsegitname`, + }, + { + type: 'category', + label: 'PushData', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.pushdata`, + }, + { + type: 'doc', + label: 'branch', + id: `${dir}/node-git-server.pushdata.branch`, + }, + { + type: 'doc', + label: 'commit', + id: `${dir}/node-git-server.pushdata.commit`, + }, + { + type: 'doc', + label: 'repo', + id: `${dir}/node-git-server.pushdata.repo`, + }, + ], + }, + { + type: 'category', + label: 'Service', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.service`, + }, + { + type: 'doc', + label: '(constructor)', + id: `${dir}/node-git-server.service._constructor_`, + }, + { + type: 'doc', + label: 'accept', + id: `${dir}/node-git-server.service.accept`, + }, + { + type: 'doc', + label: 'commit', + id: `${dir}/node-git-server.service.commit`, + }, + { + type: 'doc', + label: 'cwd', + id: `${dir}/node-git-server.service.cwd`, + }, + { + type: 'doc', + label: 'evName', + id: `${dir}/node-git-server.service.evname`, + }, + { + type: 'doc', + label: 'last', + id: `${dir}/node-git-server.service.last`, + }, + { + type: 'doc', + label: 'log', + id: `${dir}/node-git-server.service.log`, + }, + { + type: 'doc', + label: 'logs', + id: `${dir}/node-git-server.service.logs`, + }, + { + type: 'doc', + label: 'reject', + id: `${dir}/node-git-server.service.reject`, + }, + { + type: 'doc', + label: 'repo', + id: `${dir}/node-git-server.service.repo`, + }, + { + type: 'doc', + label: 'service', + id: `${dir}/node-git-server.service.service`, + }, + { + type: 'doc', + label: 'status', + id: `${dir}/node-git-server.service.status`, + }, + { + type: 'doc', + label: 'username', + id: `${dir}/node-git-server.service.username`, + }, + ], + }, + { + type: 'category', + label: 'ServiceOptions', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.serviceoptions`, + }, + { + type: 'doc', + label: 'cwd', + id: `${dir}/node-git-server.serviceoptions.cwd`, + }, + { + type: 'doc', + label: 'repo', + id: `${dir}/node-git-server.serviceoptions.repo`, + }, + { + type: 'doc', + label: 'service', + id: `${dir}/node-git-server.serviceoptions.service`, + }, + ], + }, + { + type: 'doc', + label: 'serviceRespond', + id: `${dir}/node-git-server.servicerespond`, + }, + { + type: 'doc', + label: 'ServiceString', + id: `${dir}/node-git-server.servicestring`, + }, + { + type: 'category', + label: 'TagData', + collapsed: true, + items: [ + { + type: 'doc', + label: 'Overview', + id: `${dir}/node-git-server.tagdata`, + }, + { + type: 'doc', + label: 'commit', + id: `${dir}/node-git-server.tagdata.commit`, + }, + { + type: 'doc', + label: 'repo', + id: `${dir}/node-git-server.tagdata.repo`, + }, + { + type: 'doc', + label: 'version', + id: `${dir}/node-git-server.tagdata.version`, + }, + ], + }, + ], + }, + ], + }, +]; diff --git a/website/docs/api/index.md b/website/docs/api/index.md new file mode 100644 index 0000000..8846168 --- /dev/null +++ b/website/docs/api/index.md @@ -0,0 +1,19 @@ +--- +id: index +hide_title: true +custom_edit_url: null +title: API Reference +slug: / +--- + + + +[Home](./index.md) + +## API Reference + +## Packages + +| Package | Description | +| --- | --- | +| [node-git-server](./node-git-server.md) | | diff --git a/website/docs/api/node-git-server.basicauth.md b/website/docs/api/node-git-server.basicauth.md new file mode 100644 index 0000000..fd9e626 --- /dev/null +++ b/website/docs/api/node-git-server.basicauth.md @@ -0,0 +1,32 @@ +--- +id: node-git-server.basicauth +hide_title: true +custom_edit_url: null +title: basicAuth() function +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [basicAuth](./node-git-server.basicauth.md) + +## basicAuth() function + +sets and parses basic auth headers if they exist + +Signature: + +```typescript +export declare function basicAuth(req: http.IncomingMessage, res: http.ServerResponse, callback: (username?: string, password?: string) => void): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| req | http.IncomingMessage | http request object | +| res | http.ServerResponse | http response | +| callback | (username?: string, password?: string) => void | function(username, password) | + +Returns: + +void diff --git a/website/docs/api/node-git-server.createaction.md b/website/docs/api/node-git-server.createaction.md new file mode 100644 index 0000000..8e538fa --- /dev/null +++ b/website/docs/api/node-git-server.createaction.md @@ -0,0 +1,32 @@ +--- +id: node-git-server.createaction +hide_title: true +custom_edit_url: null +title: createAction() function +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [createAction](./node-git-server.createaction.md) + +## createAction() function + +responds with the correct service depending on the action + +Signature: + +```typescript +export declare function createAction(opts: any, req: http.IncomingMessage, res: http.ServerResponse): Service; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| opts | any | options to pass Service | +| req | http.IncomingMessage | http request object | +| res | http.ServerResponse | http response | + +Returns: + +[Service](./node-git-server.service.md) diff --git a/website/docs/api/node-git-server.git._constructor_.md b/website/docs/api/node-git-server.git._constructor_.md new file mode 100644 index 0000000..50e764d --- /dev/null +++ b/website/docs/api/node-git-server.git._constructor_.md @@ -0,0 +1,27 @@ +--- +id: node-git-server.git._constructor_ +hide_title: true +custom_edit_url: null +title: Git.(constructor) +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [(constructor)](./node-git-server.git._constructor_.md) + +## Git.(constructor) + +Handles invoking the git-\*-pack binaries + +Signature: + +```typescript +constructor(repoDir: string | ((dir?: string) => string), options?: GitOptions); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| repoDir | string | ((dir?: string) => string) | Create a new repository collection from the directory repoDir. repoDir should be entirely empty except for git repo directories. If repoDir is a function, repoDir(repo) will be used to dynamically resolve project directories. The return value of repoDir(repo) should be a string path specifying where to put the string repo. Make sure to return the same value for repo every time since repoDir(repo) will be called multiple times. | +| options | [GitOptions](./node-git-server.gitoptions.md) | options that can be applied on the new instance being created | diff --git a/website/docs/api/node-git-server.git.authenticate.md b/website/docs/api/node-git-server.git.authenticate.md new file mode 100644 index 0000000..527a190 --- /dev/null +++ b/website/docs/api/node-git-server.git.authenticate.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.git.authenticate +hide_title: true +custom_edit_url: null +title: Git.authenticate property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [authenticate](./node-git-server.git.authenticate.md) + +## Git.authenticate property + +Signature: + +```typescript +authenticate: ((options: GitAuthenticateOptions, callback: (error?: Error) => void | undefined) => void | Promise | undefined) | undefined; +``` diff --git a/website/docs/api/node-git-server.git.autocreate.md b/website/docs/api/node-git-server.git.autocreate.md new file mode 100644 index 0000000..e79431f --- /dev/null +++ b/website/docs/api/node-git-server.git.autocreate.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.git.autocreate +hide_title: true +custom_edit_url: null +title: Git.autoCreate property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [autoCreate](./node-git-server.git.autocreate.md) + +## Git.autoCreate property + +Signature: + +```typescript +autoCreate: boolean; +``` diff --git a/website/docs/api/node-git-server.git.checkout.md b/website/docs/api/node-git-server.git.checkout.md new file mode 100644 index 0000000..37225be --- /dev/null +++ b/website/docs/api/node-git-server.git.checkout.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.git.checkout +hide_title: true +custom_edit_url: null +title: Git.checkout property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [checkout](./node-git-server.git.checkout.md) + +## Git.checkout property + +Signature: + +```typescript +checkout: boolean | undefined; +``` diff --git a/website/docs/api/node-git-server.git.close.md b/website/docs/api/node-git-server.git.close.md new file mode 100644 index 0000000..0425123 --- /dev/null +++ b/website/docs/api/node-git-server.git.close.md @@ -0,0 +1,24 @@ +--- +id: node-git-server.git.close +hide_title: true +custom_edit_url: null +title: Git.close() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [close](./node-git-server.git.close.md) + +## Git.close() method + +closes the server instance + +Signature: + +```typescript +close(): Promise; +``` + +Returns: + +Promise\ diff --git a/website/docs/api/node-git-server.git.create.md b/website/docs/api/node-git-server.git.create.md new file mode 100644 index 0000000..f3b1ede --- /dev/null +++ b/website/docs/api/node-git-server.git.create.md @@ -0,0 +1,31 @@ +--- +id: node-git-server.git.create +hide_title: true +custom_edit_url: null +title: Git.create() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [create](./node-git-server.git.create.md) + +## Git.create() method + +Create a new bare repository `repoName` in the instance repository directory. + +Signature: + +```typescript +create(repo: string, callback: (error?: Error) => void): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| repo | string | the name of the repo | +| callback | (error?: Error) => void | Optionally get a callback cb(err) to be notified when the repository was created. | + +Returns: + +void diff --git a/website/docs/api/node-git-server.git.dirmap.md b/website/docs/api/node-git-server.git.dirmap.md new file mode 100644 index 0000000..cd3c292 --- /dev/null +++ b/website/docs/api/node-git-server.git.dirmap.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.git.dirmap +hide_title: true +custom_edit_url: null +title: Git.dirMap property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [dirMap](./node-git-server.git.dirmap.md) + +## Git.dirMap property + +Signature: + +```typescript +dirMap: (dir?: string) => string; +``` diff --git a/website/docs/api/node-git-server.git.exists.md b/website/docs/api/node-git-server.git.exists.md new file mode 100644 index 0000000..74596eb --- /dev/null +++ b/website/docs/api/node-git-server.git.exists.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.git.exists +hide_title: true +custom_edit_url: null +title: Git.exists() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [exists](./node-git-server.git.exists.md) + +## Git.exists() method + +Find out whether `repoName` exists in the callback `cb(exists)`. + +Signature: + +```typescript +exists(repo: string): boolean; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| repo | string | name of the repo | + +Returns: + +boolean diff --git a/website/docs/api/node-git-server.git.gettype.md b/website/docs/api/node-git-server.git.gettype.md new file mode 100644 index 0000000..ce5355f --- /dev/null +++ b/website/docs/api/node-git-server.git.gettype.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.git.gettype +hide_title: true +custom_edit_url: null +title: Git.getType() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [getType](./node-git-server.git.gettype.md) + +## Git.getType() method + +returns the typeof service being process. This will respond with either fetch or push. + +Signature: + +```typescript +getType(service: string): string; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| service | string | the service type | + +Returns: + +string diff --git a/website/docs/api/node-git-server.git.handle.md b/website/docs/api/node-git-server.git.handle.md new file mode 100644 index 0000000..dfaa782 --- /dev/null +++ b/website/docs/api/node-git-server.git.handle.md @@ -0,0 +1,31 @@ +--- +id: node-git-server.git.handle +hide_title: true +custom_edit_url: null +title: Git.handle() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [handle](./node-git-server.git.handle.md) + +## Git.handle() method + +Handle incoming HTTP requests with a connect-style middleware + +Signature: + +```typescript +handle(req: http.IncomingMessage, res: http.ServerResponse): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| req | http.IncomingMessage | | +| res | http.ServerResponse | | + +Returns: + +void diff --git a/website/docs/api/node-git-server.git.list.md b/website/docs/api/node-git-server.git.list.md new file mode 100644 index 0000000..723d3d6 --- /dev/null +++ b/website/docs/api/node-git-server.git.list.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.git.list +hide_title: true +custom_edit_url: null +title: Git.list() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [list](./node-git-server.git.list.md) + +## Git.list() method + +Get a list of all the repositories + +Signature: + +```typescript +list(callback: (error: Error | undefined, repos?: string[]) => void): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| callback | (error: Error | undefined, repos?: string\[]) => void | function to be called when repositories have been found function(error, repos) | + +Returns: + +void diff --git a/website/docs/api/node-git-server.git.listen.md b/website/docs/api/node-git-server.git.listen.md new file mode 100644 index 0000000..7c4c97e --- /dev/null +++ b/website/docs/api/node-git-server.git.listen.md @@ -0,0 +1,32 @@ +--- +id: node-git-server.git.listen +hide_title: true +custom_edit_url: null +title: Git.listen() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [listen](./node-git-server.git.listen.md) + +## Git.listen() method + +starts a git server on the given port + +Signature: + +```typescript +listen(port: number, options?: GitServerOptions, callback?: () => void): Git; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| port | number | the port to start the server on | +| options | GitServerOptions | the options to add extended functionality to the server | +| callback | () => void | the function to call when server is started or error has occurred | + +Returns: + +[Git](./node-git-server.git.md) diff --git a/website/docs/api/node-git-server.git.md b/website/docs/api/node-git-server.git.md new file mode 100644 index 0000000..d60542c --- /dev/null +++ b/website/docs/api/node-git-server.git.md @@ -0,0 +1,51 @@ +--- +id: node-git-server.git +hide_title: true +custom_edit_url: null +title: Git class +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) + +## Git class + +Signature: + +```typescript +export declare class Git extends EventEmitter implements GitEvents +``` + +**Extends:** EventEmitter + +**Implements:** [GitEvents](./node-git-server.gitevents.md) + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(repoDir, options)](./node-git-server.git._constructor_.md) | | Handles invoking the git-\*-pack binaries | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [authenticate](./node-git-server.git.authenticate.md) | | ((options: [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md), callback: (error?: Error) => void | undefined) => void | Promise\ | undefined) | undefined | | +| [autoCreate](./node-git-server.git.autocreate.md) | | boolean | | +| [checkout](./node-git-server.git.checkout.md) | | boolean | undefined | | +| [dirMap](./node-git-server.git.dirmap.md) | | (dir?: string) => string | | +| [server](./node-git-server.git.server.md) | | https.Server | http.Server | undefined | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [close()](./node-git-server.git.close.md) | | closes the server instance | +| [create(repo, callback)](./node-git-server.git.create.md) | | Create a new bare repository repoName in the instance repository directory. | +| [exists(repo)](./node-git-server.git.exists.md) | | Find out whether repoName exists in the callback cb(exists). | +| [getType(service)](./node-git-server.git.gettype.md) | | returns the typeof service being process. This will respond with either fetch or push. | +| [handle(req, res)](./node-git-server.git.handle.md) | | Handle incoming HTTP requests with a connect-style middleware | +| [list(callback)](./node-git-server.git.list.md) | | Get a list of all the repositories | +| [listen(port, options, callback)](./node-git-server.git.listen.md) | | starts a git server on the given port | +| [mkdir(dir)](./node-git-server.git.mkdir.md) | | Create a subdirectory dir in the repo dir with a callback. | diff --git a/website/docs/api/node-git-server.git.mkdir.md b/website/docs/api/node-git-server.git.mkdir.md new file mode 100644 index 0000000..93112e3 --- /dev/null +++ b/website/docs/api/node-git-server.git.mkdir.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.git.mkdir +hide_title: true +custom_edit_url: null +title: Git.mkdir() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [mkdir](./node-git-server.git.mkdir.md) + +## Git.mkdir() method + +Create a subdirectory `dir` in the repo dir with a callback. + +Signature: + +```typescript +mkdir(dir: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| dir | string | directory name | + +Returns: + +void diff --git a/website/docs/api/node-git-server.git.server.md b/website/docs/api/node-git-server.git.server.md new file mode 100644 index 0000000..44a8958 --- /dev/null +++ b/website/docs/api/node-git-server.git.server.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.git.server +hide_title: true +custom_edit_url: null +title: Git.server property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Git](./node-git-server.git.md) > [server](./node-git-server.git.server.md) + +## Git.server property + +Signature: + +```typescript +server: https.Server | http.Server | undefined; +``` diff --git a/website/docs/api/node-git-server.gitauthenticateoptions.headers.md b/website/docs/api/node-git-server.gitauthenticateoptions.headers.md new file mode 100644 index 0000000..bfdbb9c --- /dev/null +++ b/website/docs/api/node-git-server.gitauthenticateoptions.headers.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.gitauthenticateoptions.headers +hide_title: true +custom_edit_url: null +title: GitAuthenticateOptions.headers property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md) > [headers](./node-git-server.gitauthenticateoptions.headers.md) + +## GitAuthenticateOptions.headers property + +Signature: + +```typescript +headers: http.IncomingHttpHeaders; +``` diff --git a/website/docs/api/node-git-server.gitauthenticateoptions.md b/website/docs/api/node-git-server.gitauthenticateoptions.md new file mode 100644 index 0000000..0e5260a --- /dev/null +++ b/website/docs/api/node-git-server.gitauthenticateoptions.md @@ -0,0 +1,27 @@ +--- +id: node-git-server.gitauthenticateoptions +hide_title: true +custom_edit_url: null +title: GitAuthenticateOptions interface +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md) + +## GitAuthenticateOptions interface + +Signature: + +```typescript +export interface GitAuthenticateOptions +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [headers](./node-git-server.gitauthenticateoptions.headers.md) | http.IncomingHttpHeaders | | +| [repo](./node-git-server.gitauthenticateoptions.repo.md) | string | | +| [type](./node-git-server.gitauthenticateoptions.type.md) | string | | +| [user](./node-git-server.gitauthenticateoptions.user.md) | (callback: (username?: string | undefined, password?: string | undefined) => void) => void | | diff --git a/website/docs/api/node-git-server.gitauthenticateoptions.repo.md b/website/docs/api/node-git-server.gitauthenticateoptions.repo.md new file mode 100644 index 0000000..90392ed --- /dev/null +++ b/website/docs/api/node-git-server.gitauthenticateoptions.repo.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.gitauthenticateoptions.repo +hide_title: true +custom_edit_url: null +title: GitAuthenticateOptions.repo property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md) > [repo](./node-git-server.gitauthenticateoptions.repo.md) + +## GitAuthenticateOptions.repo property + +Signature: + +```typescript +repo: string; +``` diff --git a/website/docs/api/node-git-server.gitauthenticateoptions.type.md b/website/docs/api/node-git-server.gitauthenticateoptions.type.md new file mode 100644 index 0000000..5641841 --- /dev/null +++ b/website/docs/api/node-git-server.gitauthenticateoptions.type.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.gitauthenticateoptions.type +hide_title: true +custom_edit_url: null +title: GitAuthenticateOptions.type property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md) > [type](./node-git-server.gitauthenticateoptions.type.md) + +## GitAuthenticateOptions.type property + +Signature: + +```typescript +type: string; +``` diff --git a/website/docs/api/node-git-server.gitauthenticateoptions.user.md b/website/docs/api/node-git-server.gitauthenticateoptions.user.md new file mode 100644 index 0000000..45c3a74 --- /dev/null +++ b/website/docs/api/node-git-server.gitauthenticateoptions.user.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.gitauthenticateoptions.user +hide_title: true +custom_edit_url: null +title: GitAuthenticateOptions.user property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md) > [user](./node-git-server.gitauthenticateoptions.user.md) + +## GitAuthenticateOptions.user property + +Signature: + +```typescript +user: (callback: (username?: string | undefined, password?: string | undefined) => void) => void; +``` diff --git a/website/docs/api/node-git-server.gitevents.addlistener.md b/website/docs/api/node-git-server.gitevents.addlistener.md new file mode 100644 index 0000000..5e2d9fe --- /dev/null +++ b/website/docs/api/node-git-server.gitevents.addlistener.md @@ -0,0 +1,37 @@ +--- +id: node-git-server.gitevents.addlistener +hide_title: true +custom_edit_url: null +title: GitEvents.addListener() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitEvents](./node-git-server.gitevents.md) > [addListener](./node-git-server.gitevents.addlistener.md) + +## GitEvents.addListener() method + +Signature: + +```typescript +addListener(event: "push", listener: (push: PushData) => void): this; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| event | "push" | | +| listener | (push: [PushData](./node-git-server.pushdata.md)) => void | | + +Returns: + +this + +## Example + +repos.on('push', function (push) { ... } + +Emitted when somebody does a `git push` to the repo. + +Exactly one listener must call `push.accept()` or `push.reject()`. If there are no listeners, `push.accept()` is called automatically. diff --git a/website/docs/api/node-git-server.gitevents.addlistener_1.md b/website/docs/api/node-git-server.gitevents.addlistener_1.md new file mode 100644 index 0000000..fe3e816 --- /dev/null +++ b/website/docs/api/node-git-server.gitevents.addlistener_1.md @@ -0,0 +1,35 @@ +--- +id: node-git-server.gitevents.addlistener_1 +hide_title: true +custom_edit_url: null +title: GitEvents.addListener() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitEvents](./node-git-server.gitevents.md) > [addListener](./node-git-server.gitevents.addlistener_1.md) + +## GitEvents.addListener() method + +Signature: + +```typescript +addListener(event: "tag", listener: (tag: TagData) => void): this; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| event | "tag" | | +| listener | (tag: [TagData](./node-git-server.tagdata.md)) => void | | + +Returns: + +this + +## Example + +repos.on('tag', function (tag) { ... } + +Emitted when somebody does a `git push --tags` to the repo. Exactly one listener must call `tag.accept()` or `tag.reject()`. If there are No listeners, `tag.accept()` is called automatically. diff --git a/website/docs/api/node-git-server.gitevents.md b/website/docs/api/node-git-server.gitevents.md new file mode 100644 index 0000000..7e827bd --- /dev/null +++ b/website/docs/api/node-git-server.gitevents.md @@ -0,0 +1,25 @@ +--- +id: node-git-server.gitevents +hide_title: true +custom_edit_url: null +title: GitEvents interface +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitEvents](./node-git-server.gitevents.md) + +## GitEvents interface + +Signature: + +```typescript +export interface GitEvents +``` + +## Methods + +| Method | Description | +| --- | --- | +| [addListener(event, listener)](./node-git-server.gitevents.addlistener.md) | | +| [addListener(event, listener)](./node-git-server.gitevents.addlistener_1.md) | | diff --git a/website/docs/api/node-git-server.gitoptions.authenticate.md b/website/docs/api/node-git-server.gitoptions.authenticate.md new file mode 100644 index 0000000..976c2c9 --- /dev/null +++ b/website/docs/api/node-git-server.gitoptions.authenticate.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.gitoptions.authenticate +hide_title: true +custom_edit_url: null +title: GitOptions.authenticate property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitOptions](./node-git-server.gitoptions.md) > [authenticate](./node-git-server.gitoptions.authenticate.md) + +## GitOptions.authenticate property + +Signature: + +```typescript +authenticate?: (options: GitAuthenticateOptions, callback: (error?: Error) => void | undefined) => void | Promise | undefined; +``` diff --git a/website/docs/api/node-git-server.gitoptions.autocreate.md b/website/docs/api/node-git-server.gitoptions.autocreate.md new file mode 100644 index 0000000..921b62d --- /dev/null +++ b/website/docs/api/node-git-server.gitoptions.autocreate.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.gitoptions.autocreate +hide_title: true +custom_edit_url: null +title: GitOptions.autoCreate property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitOptions](./node-git-server.gitoptions.md) > [autoCreate](./node-git-server.gitoptions.autocreate.md) + +## GitOptions.autoCreate property + +Signature: + +```typescript +autoCreate?: boolean; +``` diff --git a/website/docs/api/node-git-server.gitoptions.checkout.md b/website/docs/api/node-git-server.gitoptions.checkout.md new file mode 100644 index 0000000..8f7f31a --- /dev/null +++ b/website/docs/api/node-git-server.gitoptions.checkout.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.gitoptions.checkout +hide_title: true +custom_edit_url: null +title: GitOptions.checkout property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitOptions](./node-git-server.gitoptions.md) > [checkout](./node-git-server.gitoptions.checkout.md) + +## GitOptions.checkout property + +Signature: + +```typescript +checkout?: boolean; +``` diff --git a/website/docs/api/node-git-server.gitoptions.md b/website/docs/api/node-git-server.gitoptions.md new file mode 100644 index 0000000..1b912ce --- /dev/null +++ b/website/docs/api/node-git-server.gitoptions.md @@ -0,0 +1,26 @@ +--- +id: node-git-server.gitoptions +hide_title: true +custom_edit_url: null +title: GitOptions interface +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [GitOptions](./node-git-server.gitoptions.md) + +## GitOptions interface + +Signature: + +```typescript +export interface GitOptions +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [authenticate?](./node-git-server.gitoptions.authenticate.md) | (options: [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md), callback: (error?: Error) => void | undefined) => void | Promise\ | undefined | (Optional) | +| [autoCreate?](./node-git-server.gitoptions.autocreate.md) | boolean | (Optional) | +| [checkout?](./node-git-server.gitoptions.checkout.md) | boolean | (Optional) | diff --git a/website/docs/api/node-git-server.httpduplex._constructor_.md b/website/docs/api/node-git-server.httpduplex._constructor_.md new file mode 100644 index 0000000..faa00dc --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex._constructor_.md @@ -0,0 +1,31 @@ +--- +id: node-git-server.httpduplex._constructor_ +hide_title: true +custom_edit_url: null +title: HttpDuplex.(constructor) +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [(constructor)](./node-git-server.httpduplex._constructor_.md) + +## HttpDuplex.(constructor) + +Constructs a proxy object over input and output resulting in a unified stream. Generally meant to combine request and response streams in the http.request event + +Signature: + +```typescript +constructor(input: http.IncomingMessage, output: http.ServerResponse); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| input | http.IncomingMessage | | +| output | http.ServerResponse | | + +## Example + +A simple example is shown below http.createServer(function (req, res) { var dup = new HttpDuplex(req, res); res.end("Request: " + req.method + " " + req.url); }).listen(80); diff --git a/website/docs/api/node-git-server.httpduplex.accept.md b/website/docs/api/node-git-server.httpduplex.accept.md new file mode 100644 index 0000000..09641c4 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.accept.md @@ -0,0 +1,22 @@ +--- +id: node-git-server.httpduplex.accept +hide_title: true +custom_edit_url: null +title: HttpDuplex.accept() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [accept](./node-git-server.httpduplex.accept.md) + +## HttpDuplex.accept() method + +Signature: + +```typescript +accept(): void; +``` + +Returns: + +void diff --git a/website/docs/api/node-git-server.httpduplex.complete.md b/website/docs/api/node-git-server.httpduplex.complete.md new file mode 100644 index 0000000..a12691d --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.complete.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.httpduplex.complete +hide_title: true +custom_edit_url: null +title: HttpDuplex.complete property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [complete](./node-git-server.httpduplex.complete.md) + +## HttpDuplex.complete property + +Signature: + +```typescript +get complete(): boolean; +``` diff --git a/website/docs/api/node-git-server.httpduplex.connection.md b/website/docs/api/node-git-server.httpduplex.connection.md new file mode 100644 index 0000000..85bba59 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.connection.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.connection +hide_title: true +custom_edit_url: null +title: HttpDuplex.connection property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [connection](./node-git-server.httpduplex.connection.md) + +## HttpDuplex.connection property + +Reference to the underlying socket for the request connection. + +Signature: + +```typescript +get connection(): Socket; +``` diff --git a/website/docs/api/node-git-server.httpduplex.cork.md b/website/docs/api/node-git-server.httpduplex.cork.md new file mode 100644 index 0000000..5f42720 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.cork.md @@ -0,0 +1,28 @@ +--- +id: node-git-server.httpduplex.cork +hide_title: true +custom_edit_url: null +title: HttpDuplex.cork() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [cork](./node-git-server.httpduplex.cork.md) + +## HttpDuplex.cork() method + +Buffers written data in memory. This data will be flushed when either the uncork or end methods are called. + +Signature: + +```typescript +cork(): this; +``` + +Returns: + +this + +## Example + +request.cork(); request.write('buffer data '); request.write('before sending '); request.uncork(); diff --git a/website/docs/api/node-git-server.httpduplex.cwd.md b/website/docs/api/node-git-server.httpduplex.cwd.md new file mode 100644 index 0000000..d509a21 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.cwd.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.httpduplex.cwd +hide_title: true +custom_edit_url: null +title: HttpDuplex.cwd property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [cwd](./node-git-server.httpduplex.cwd.md) + +## HttpDuplex.cwd property + +Signature: + +```typescript +cwd: string | undefined; +``` diff --git a/website/docs/api/node-git-server.httpduplex.destroy.md b/website/docs/api/node-git-server.httpduplex.destroy.md new file mode 100644 index 0000000..fb9e283 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.destroy.md @@ -0,0 +1,22 @@ +--- +id: node-git-server.httpduplex.destroy +hide_title: true +custom_edit_url: null +title: HttpDuplex.destroy() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [destroy](./node-git-server.httpduplex.destroy.md) + +## HttpDuplex.destroy() method + +Signature: + +```typescript +destroy(): void; +``` + +Returns: + +void diff --git a/website/docs/api/node-git-server.httpduplex.end.md b/website/docs/api/node-git-server.httpduplex.end.md new file mode 100644 index 0000000..033f318 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.end.md @@ -0,0 +1,28 @@ +--- +id: node-git-server.httpduplex.end +hide_title: true +custom_edit_url: null +title: HttpDuplex.end() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [end](./node-git-server.httpduplex.end.md) + +## HttpDuplex.end() method + +Signature: + +```typescript +end(reason?: any): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| reason | any | | + +Returns: + +void diff --git a/website/docs/api/node-git-server.httpduplex.exists.md b/website/docs/api/node-git-server.httpduplex.exists.md new file mode 100644 index 0000000..0ed0967 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.exists.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.httpduplex.exists +hide_title: true +custom_edit_url: null +title: HttpDuplex.exists property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [exists](./node-git-server.httpduplex.exists.md) + +## HttpDuplex.exists property + +Signature: + +```typescript +exists: boolean | undefined; +``` diff --git a/website/docs/api/node-git-server.httpduplex.headers.md b/website/docs/api/node-git-server.httpduplex.headers.md new file mode 100644 index 0000000..8f53082 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.headers.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.headers +hide_title: true +custom_edit_url: null +title: HttpDuplex.headers property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [headers](./node-git-server.httpduplex.headers.md) + +## HttpDuplex.headers property + +Request/response headers. Key-value pairs of header names and values. Header names are always lower-case. + +Signature: + +```typescript +get headers(): http.IncomingHttpHeaders; +``` diff --git a/website/docs/api/node-git-server.httpduplex.httpversion.md b/website/docs/api/node-git-server.httpduplex.httpversion.md new file mode 100644 index 0000000..e8943bf --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.httpversion.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.httpversion +hide_title: true +custom_edit_url: null +title: HttpDuplex.httpVersion property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [httpVersion](./node-git-server.httpduplex.httpversion.md) + +## HttpDuplex.httpVersion property + +Requested HTTP Version sent by the client. Usually either '1.0' or '1.1' + +Signature: + +```typescript +get httpVersion(): string; +``` diff --git a/website/docs/api/node-git-server.httpduplex.httpversionmajor.md b/website/docs/api/node-git-server.httpduplex.httpversionmajor.md new file mode 100644 index 0000000..d1d0efb --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.httpversionmajor.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.httpversionmajor +hide_title: true +custom_edit_url: null +title: HttpDuplex.httpVersionMajor property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [httpVersionMajor](./node-git-server.httpduplex.httpversionmajor.md) + +## HttpDuplex.httpVersionMajor property + +First integer in the httpVersion string + +Signature: + +```typescript +get httpVersionMajor(): number; +``` diff --git a/website/docs/api/node-git-server.httpduplex.httpversionminor.md b/website/docs/api/node-git-server.httpduplex.httpversionminor.md new file mode 100644 index 0000000..5e1a658 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.httpversionminor.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.httpversionminor +hide_title: true +custom_edit_url: null +title: HttpDuplex.httpVersionMinor property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [httpVersionMinor](./node-git-server.httpduplex.httpversionminor.md) + +## HttpDuplex.httpVersionMinor property + +Second integer ni the httpVersion string + +Signature: + +```typescript +get httpVersionMinor(): number; +``` diff --git a/website/docs/api/node-git-server.httpduplex.md b/website/docs/api/node-git-server.httpduplex.md new file mode 100644 index 0000000..3b21a35 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.md @@ -0,0 +1,63 @@ +--- +id: node-git-server.httpduplex +hide_title: true +custom_edit_url: null +title: HttpDuplex class +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) + +## HttpDuplex class + +Signature: + +```typescript +export declare class HttpDuplex extends EventEmitter +``` + +**Extends:** EventEmitter + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(input, output)](./node-git-server.httpduplex._constructor_.md) | | Constructs a proxy object over input and output resulting in a unified stream. Generally meant to combine request and response streams in the http.request event | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [complete](./node-git-server.httpduplex.complete.md) | | boolean | | +| [connection](./node-git-server.httpduplex.connection.md) | | Socket | Reference to the underlying socket for the request connection. | +| [cwd](./node-git-server.httpduplex.cwd.md) | | string | undefined | | +| [exists](./node-git-server.httpduplex.exists.md) | | boolean | undefined | | +| [headers](./node-git-server.httpduplex.headers.md) | | http.IncomingHttpHeaders | Request/response headers. Key-value pairs of header names and values. Header names are always lower-case. | +| [httpVersion](./node-git-server.httpduplex.httpversion.md) | | string | Requested HTTP Version sent by the client. Usually either '1.0' or '1.1' | +| [httpVersionMajor](./node-git-server.httpduplex.httpversionmajor.md) | | number | First integer in the httpVersion string | +| [httpVersionMinor](./node-git-server.httpduplex.httpversionminor.md) | | number | Second integer ni the httpVersion string | +| [method](./node-git-server.httpduplex.method.md) | | string | undefined | Request method of the incoming request. | +| [readable](./node-git-server.httpduplex.readable.md) | | boolean | Is this stream readable. | +| [repo](./node-git-server.httpduplex.repo.md) | | string | undefined | | +| [req](./node-git-server.httpduplex.req.md) | | http.IncomingMessage | A IncomingMessage created by http.Server or http.ClientRequest usually passed as the first parameter to the 'request' and 'response' events. Implements Readable Stream interface but may not be a decendant thereof. | +| [res](./node-git-server.httpduplex.res.md) | | http.ServerResponse | Created http.server. Passed as the second parameter to the 'request' event. The response implements Writable Stream interface but isn't a descendent thereof. | +| [socket](./node-git-server.httpduplex.socket.md) | | Socket | net.Socket object associated with the connection. | +| [statusCode](./node-git-server.httpduplex.statuscode.md) | | number | The HTTP status code. Generally assigned before sending headers for a response to a client. | +| [statusMessage](./node-git-server.httpduplex.statusmessage.md) | | string | Controls the status message sent to the client as long as an explicit call to response.writeHead() isn't made If ignored or the value is undefined, the default message corresponding to the status code will be used. | +| [trailers](./node-git-server.httpduplex.trailers.md) | | NodeJS.Dict\ | Request/response trailer headers. Just like except these are only written after the initial response to the client. This object is only populated at the 'end' event and only work if a 'transfer-encoding: chunked' header is sent in the initial response. | +| [url](./node-git-server.httpduplex.url.md) | | string | undefined | Request URL string. | +| [writable](./node-git-server.httpduplex.writable.md) | | boolean | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [accept()](./node-git-server.httpduplex.accept.md) | | | +| [cork()](./node-git-server.httpduplex.cork.md) | | Buffers written data in memory. This data will be flushed when either the uncork or end methods are called. | +| [destroy()](./node-git-server.httpduplex.destroy.md) | | | +| [end(reason)](./node-git-server.httpduplex.end.md) | | | +| [reject(code, msg)](./node-git-server.httpduplex.reject.md) | | | +| [setHeader(arg0, arg1)](./node-git-server.httpduplex.setheader.md) | | | +| [uncork()](./node-git-server.httpduplex.uncork.md) | | Flushes all data buffered since cork() was called. | +| [writeHead(statusCode, statusMessage, headers)](./node-git-server.httpduplex.writehead.md) | | Sends a response header to the client request. Must only be called one time and before calling response.end(). | diff --git a/website/docs/api/node-git-server.httpduplex.method.md b/website/docs/api/node-git-server.httpduplex.method.md new file mode 100644 index 0000000..5a74658 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.method.md @@ -0,0 +1,24 @@ +--- +id: node-git-server.httpduplex.method +hide_title: true +custom_edit_url: null +title: HttpDuplex.method property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [method](./node-git-server.httpduplex.method.md) + +## HttpDuplex.method property + +Request method of the incoming request. + +Signature: + +```typescript +get method(): string | undefined; +``` + +## Example + +'GET', 'DELETE' diff --git a/website/docs/api/node-git-server.httpduplex.readable.md b/website/docs/api/node-git-server.httpduplex.readable.md new file mode 100644 index 0000000..e11aedc --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.readable.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.readable +hide_title: true +custom_edit_url: null +title: HttpDuplex.readable property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [readable](./node-git-server.httpduplex.readable.md) + +## HttpDuplex.readable property + +Is this stream readable. + +Signature: + +```typescript +get readable(): boolean; +``` diff --git a/website/docs/api/node-git-server.httpduplex.reject.md b/website/docs/api/node-git-server.httpduplex.reject.md new file mode 100644 index 0000000..366d732 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.reject.md @@ -0,0 +1,29 @@ +--- +id: node-git-server.httpduplex.reject +hide_title: true +custom_edit_url: null +title: HttpDuplex.reject() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [reject](./node-git-server.httpduplex.reject.md) + +## HttpDuplex.reject() method + +Signature: + +```typescript +reject(code: number, msg: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| code | number | | +| msg | string | | + +Returns: + +void diff --git a/website/docs/api/node-git-server.httpduplex.repo.md b/website/docs/api/node-git-server.httpduplex.repo.md new file mode 100644 index 0000000..ef983df --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.repo.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.httpduplex.repo +hide_title: true +custom_edit_url: null +title: HttpDuplex.repo property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [repo](./node-git-server.httpduplex.repo.md) + +## HttpDuplex.repo property + +Signature: + +```typescript +repo: string | undefined; +``` diff --git a/website/docs/api/node-git-server.httpduplex.req.md b/website/docs/api/node-git-server.httpduplex.req.md new file mode 100644 index 0000000..a660ad2 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.req.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.req +hide_title: true +custom_edit_url: null +title: HttpDuplex.req property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [req](./node-git-server.httpduplex.req.md) + +## HttpDuplex.req property + +A IncomingMessage created by http.Server or http.ClientRequest usually passed as the first parameter to the 'request' and 'response' events. Implements Readable Stream interface but may not be a decendant thereof. + +Signature: + +```typescript +req: http.IncomingMessage; +``` diff --git a/website/docs/api/node-git-server.httpduplex.res.md b/website/docs/api/node-git-server.httpduplex.res.md new file mode 100644 index 0000000..09e8b64 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.res.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.res +hide_title: true +custom_edit_url: null +title: HttpDuplex.res property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [res](./node-git-server.httpduplex.res.md) + +## HttpDuplex.res property + +Created http.server. Passed as the second parameter to the 'request' event. The response implements Writable Stream interface but isn't a descendent thereof. + +Signature: + +```typescript +res: http.ServerResponse; +``` diff --git a/website/docs/api/node-git-server.httpduplex.setheader.md b/website/docs/api/node-git-server.httpduplex.setheader.md new file mode 100644 index 0000000..e5fb14b --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.setheader.md @@ -0,0 +1,29 @@ +--- +id: node-git-server.httpduplex.setheader +hide_title: true +custom_edit_url: null +title: HttpDuplex.setHeader() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [setHeader](./node-git-server.httpduplex.setheader.md) + +## HttpDuplex.setHeader() method + +Signature: + +```typescript +setHeader(arg0: string, arg1: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| arg0 | string | | +| arg1 | string | | + +Returns: + +void diff --git a/website/docs/api/node-git-server.httpduplex.socket.md b/website/docs/api/node-git-server.httpduplex.socket.md new file mode 100644 index 0000000..636008e --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.socket.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.socket +hide_title: true +custom_edit_url: null +title: HttpDuplex.socket property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [socket](./node-git-server.httpduplex.socket.md) + +## HttpDuplex.socket property + +net.Socket object associated with the connection. + +Signature: + +```typescript +get socket(): Socket; +``` diff --git a/website/docs/api/node-git-server.httpduplex.statuscode.md b/website/docs/api/node-git-server.httpduplex.statuscode.md new file mode 100644 index 0000000..65fcc5a --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.statuscode.md @@ -0,0 +1,26 @@ +--- +id: node-git-server.httpduplex.statuscode +hide_title: true +custom_edit_url: null +title: HttpDuplex.statusCode property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [statusCode](./node-git-server.httpduplex.statuscode.md) + +## HttpDuplex.statusCode property + +The HTTP status code. Generally assigned before sending headers for a response to a client. + +Signature: + +```typescript +get statusCode(): number; + +set statusCode(val: number); +``` + +## Example + +request.statusCode = 404; diff --git a/website/docs/api/node-git-server.httpduplex.statusmessage.md b/website/docs/api/node-git-server.httpduplex.statusmessage.md new file mode 100644 index 0000000..34e0f25 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.statusmessage.md @@ -0,0 +1,26 @@ +--- +id: node-git-server.httpduplex.statusmessage +hide_title: true +custom_edit_url: null +title: HttpDuplex.statusMessage property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [statusMessage](./node-git-server.httpduplex.statusmessage.md) + +## HttpDuplex.statusMessage property + +Controls the status message sent to the client as long as an explicit call to response.writeHead() isn't made If ignored or the value is undefined, the default message corresponding to the status code will be used. + +Signature: + +```typescript +get statusMessage(): string; + +set statusMessage(val: string); +``` + +## Example + +request.statusMessage = 'Document Not found'; diff --git a/website/docs/api/node-git-server.httpduplex.trailers.md b/website/docs/api/node-git-server.httpduplex.trailers.md new file mode 100644 index 0000000..3ef64e6 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.trailers.md @@ -0,0 +1,20 @@ +--- +id: node-git-server.httpduplex.trailers +hide_title: true +custom_edit_url: null +title: HttpDuplex.trailers property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [trailers](./node-git-server.httpduplex.trailers.md) + +## HttpDuplex.trailers property + +Request/response trailer headers. Just like except these are only written after the initial response to the client. This object is only populated at the 'end' event and only work if a 'transfer-encoding: chunked' header is sent in the initial response. + +Signature: + +```typescript +get trailers(): NodeJS.Dict; +``` diff --git a/website/docs/api/node-git-server.httpduplex.uncork.md b/website/docs/api/node-git-server.httpduplex.uncork.md new file mode 100644 index 0000000..41b090c --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.uncork.md @@ -0,0 +1,24 @@ +--- +id: node-git-server.httpduplex.uncork +hide_title: true +custom_edit_url: null +title: HttpDuplex.uncork() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [uncork](./node-git-server.httpduplex.uncork.md) + +## HttpDuplex.uncork() method + +Flushes all data buffered since cork() was called. + +Signature: + +```typescript +uncork(): this; +``` + +Returns: + +this diff --git a/website/docs/api/node-git-server.httpduplex.url.md b/website/docs/api/node-git-server.httpduplex.url.md new file mode 100644 index 0000000..56e25b0 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.url.md @@ -0,0 +1,28 @@ +--- +id: node-git-server.httpduplex.url +hide_title: true +custom_edit_url: null +title: HttpDuplex.url property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [url](./node-git-server.httpduplex.url.md) + +## HttpDuplex.url property + +Request URL string. + +Signature: + +```typescript +get url(): string | undefined; +``` + +## Example 1 + +A request made as: GET /info?check=none HTTP/1.1 + +## Example 2 + +Will return the string '/info?check=none' diff --git a/website/docs/api/node-git-server.httpduplex.writable.md b/website/docs/api/node-git-server.httpduplex.writable.md new file mode 100644 index 0000000..cef900a --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.writable.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.httpduplex.writable +hide_title: true +custom_edit_url: null +title: HttpDuplex.writable property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [writable](./node-git-server.httpduplex.writable.md) + +## HttpDuplex.writable property + +Signature: + +```typescript +get writable(): boolean; +``` diff --git a/website/docs/api/node-git-server.httpduplex.writehead.md b/website/docs/api/node-git-server.httpduplex.writehead.md new file mode 100644 index 0000000..f0f2055 --- /dev/null +++ b/website/docs/api/node-git-server.httpduplex.writehead.md @@ -0,0 +1,36 @@ +--- +id: node-git-server.httpduplex.writehead +hide_title: true +custom_edit_url: null +title: HttpDuplex.writeHead() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [HttpDuplex](./node-git-server.httpduplex.md) > [writeHead](./node-git-server.httpduplex.writehead.md) + +## HttpDuplex.writeHead() method + +Sends a response header to the client request. Must only be called one time and before calling response.end(). + +Signature: + +```typescript +writeHead(statusCode: number, statusMessage: string, headers: string[]): this; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| statusCode | number | 3-digit HTTP status code, like 404 | +| statusMessage | string | An optional human readable status message to send with the status code | +| headers | string\[] | An object containing the response headers to send | + +Returns: + +this + +## Example + +var content = 'Under Construction...'; response.writeHead(200, { 'Content-Length': Buffer.byteLength(content), 'Content-Type': 'text/plain' }); response.end(content); diff --git a/website/docs/api/node-git-server.inforesponse.md b/website/docs/api/node-git-server.inforesponse.md new file mode 100644 index 0000000..9fc67cf --- /dev/null +++ b/website/docs/api/node-git-server.inforesponse.md @@ -0,0 +1,34 @@ +--- +id: node-git-server.inforesponse +hide_title: true +custom_edit_url: null +title: infoResponse() function +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [infoResponse](./node-git-server.inforesponse.md) + +## infoResponse() function + +sends http response using the appropriate output from service call + +Signature: + +```typescript +export declare function infoResponse(git: Git, repo: string, service: ServiceString, req: http.IncomingMessage, res: http.ServerResponse): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| git | [Git](./node-git-server.git.md) | an instance of git object | +| repo | string | the repository | +| service | [ServiceString](./node-git-server.servicestring.md) | the method that is responding infoResponse (push, pull, clone) | +| req | http.IncomingMessage | http request object | +| res | http.ServerResponse | http response | + +Returns: + +void diff --git a/website/docs/api/node-git-server.md b/website/docs/api/node-git-server.md new file mode 100644 index 0000000..fcff516 --- /dev/null +++ b/website/docs/api/node-git-server.md @@ -0,0 +1,49 @@ +--- +id: node-git-server +hide_title: true +custom_edit_url: null +title: node-git-server package +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) + +## node-git-server package + +## Classes + +| Class | Description | +| --- | --- | +| [Git](./node-git-server.git.md) | | +| [HttpDuplex](./node-git-server.httpduplex.md) | | +| [Service](./node-git-server.service.md) | | + +## Functions + +| Function | Description | +| --- | --- | +| [basicAuth(req, res, callback)](./node-git-server.basicauth.md) | sets and parses basic auth headers if they exist | +| [createAction(opts, req, res)](./node-git-server.createaction.md) | responds with the correct service depending on the action | +| [infoResponse(git, repo, service, req, res)](./node-git-server.inforesponse.md) | sends http response using the appropriate output from service call | +| [noCache(res)](./node-git-server.nocache.md) | adds headers to the response object to add cache control | +| [packSideband(s)](./node-git-server.packsideband.md) | | +| [parseGitName(repo)](./node-git-server.parsegitname.md) | parses a git string and returns the repo name | +| [serviceRespond(dup, service, repoLocation, res)](./node-git-server.servicerespond.md) | execute given git operation and respond | + +## Interfaces + +| Interface | Description | +| --- | --- | +| [GitAuthenticateOptions](./node-git-server.gitauthenticateoptions.md) | | +| [GitEvents](./node-git-server.gitevents.md) | | +| [GitOptions](./node-git-server.gitoptions.md) | | +| [PushData](./node-git-server.pushdata.md) | Is a http duplex object (see below) with these extra properties | +| [ServiceOptions](./node-git-server.serviceoptions.md) | | +| [TagData](./node-git-server.tagdata.md) | An http duplex object (see below) with these extra properties: | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [ServiceString](./node-git-server.servicestring.md) | | diff --git a/website/docs/api/node-git-server.nocache.md b/website/docs/api/node-git-server.nocache.md new file mode 100644 index 0000000..8a3cf03 --- /dev/null +++ b/website/docs/api/node-git-server.nocache.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.nocache +hide_title: true +custom_edit_url: null +title: noCache() function +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [noCache](./node-git-server.nocache.md) + +## noCache() function + +adds headers to the response object to add cache control + +Signature: + +```typescript +export declare function noCache(res: http.ServerResponse): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| res | http.ServerResponse | http response | + +Returns: + +void diff --git a/website/docs/api/node-git-server.packsideband.md b/website/docs/api/node-git-server.packsideband.md new file mode 100644 index 0000000..cf64966 --- /dev/null +++ b/website/docs/api/node-git-server.packsideband.md @@ -0,0 +1,28 @@ +--- +id: node-git-server.packsideband +hide_title: true +custom_edit_url: null +title: packSideband() function +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [packSideband](./node-git-server.packsideband.md) + +## packSideband() function + +Signature: + +```typescript +export declare function packSideband(s: string): string; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| s | string | | + +Returns: + +string diff --git a/website/docs/api/node-git-server.parsegitname.md b/website/docs/api/node-git-server.parsegitname.md new file mode 100644 index 0000000..274789a --- /dev/null +++ b/website/docs/api/node-git-server.parsegitname.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.parsegitname +hide_title: true +custom_edit_url: null +title: parseGitName() function +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [parseGitName](./node-git-server.parsegitname.md) + +## parseGitName() function + +parses a git string and returns the repo name + +Signature: + +```typescript +export declare function parseGitName(repo: string): string; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| repo | string | the raw repo name containing .git | + +Returns: + +string diff --git a/website/docs/api/node-git-server.pushdata.branch.md b/website/docs/api/node-git-server.pushdata.branch.md new file mode 100644 index 0000000..5be447e --- /dev/null +++ b/website/docs/api/node-git-server.pushdata.branch.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.pushdata.branch +hide_title: true +custom_edit_url: null +title: PushData.branch property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [PushData](./node-git-server.pushdata.md) > [branch](./node-git-server.pushdata.branch.md) + +## PushData.branch property + +Signature: + +```typescript +branch: string; +``` diff --git a/website/docs/api/node-git-server.pushdata.commit.md b/website/docs/api/node-git-server.pushdata.commit.md new file mode 100644 index 0000000..3dbf019 --- /dev/null +++ b/website/docs/api/node-git-server.pushdata.commit.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.pushdata.commit +hide_title: true +custom_edit_url: null +title: PushData.commit property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [PushData](./node-git-server.pushdata.md) > [commit](./node-git-server.pushdata.commit.md) + +## PushData.commit property + +Signature: + +```typescript +commit: string; +``` diff --git a/website/docs/api/node-git-server.pushdata.md b/website/docs/api/node-git-server.pushdata.md new file mode 100644 index 0000000..c0d34d5 --- /dev/null +++ b/website/docs/api/node-git-server.pushdata.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.pushdata +hide_title: true +custom_edit_url: null +title: PushData interface +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [PushData](./node-git-server.pushdata.md) + +## PushData interface + +Is a http duplex object (see below) with these extra properties + +Signature: + +```typescript +export interface PushData extends HttpDuplex +``` + +**Extends:** [HttpDuplex](./node-git-server.httpduplex.md) + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [branch](./node-git-server.pushdata.branch.md) | string | | +| [commit](./node-git-server.pushdata.commit.md) | string | | +| [repo](./node-git-server.pushdata.repo.md) | string | | diff --git a/website/docs/api/node-git-server.pushdata.repo.md b/website/docs/api/node-git-server.pushdata.repo.md new file mode 100644 index 0000000..cc584fa --- /dev/null +++ b/website/docs/api/node-git-server.pushdata.repo.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.pushdata.repo +hide_title: true +custom_edit_url: null +title: PushData.repo property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [PushData](./node-git-server.pushdata.md) > [repo](./node-git-server.pushdata.repo.md) + +## PushData.repo property + +Signature: + +```typescript +repo: string; +``` diff --git a/website/docs/api/node-git-server.service._constructor_.md b/website/docs/api/node-git-server.service._constructor_.md new file mode 100644 index 0000000..817e98e --- /dev/null +++ b/website/docs/api/node-git-server.service._constructor_.md @@ -0,0 +1,28 @@ +--- +id: node-git-server.service._constructor_ +hide_title: true +custom_edit_url: null +title: Service.(constructor) +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [(constructor)](./node-git-server.service._constructor_.md) + +## Service.(constructor) + +Handles invoking the git-\*-pack binaries + +Signature: + +```typescript +constructor(opts: ServiceOptions, req: http.IncomingMessage, res: http.ServerResponse); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| opts | [ServiceOptions](./node-git-server.serviceoptions.md) | options to bootstrap the service object | +| req | http.IncomingMessage | http request object | +| res | http.ServerResponse | http response | diff --git a/website/docs/api/node-git-server.service.accept.md b/website/docs/api/node-git-server.service.accept.md new file mode 100644 index 0000000..db1fc3d --- /dev/null +++ b/website/docs/api/node-git-server.service.accept.md @@ -0,0 +1,24 @@ +--- +id: node-git-server.service.accept +hide_title: true +custom_edit_url: null +title: Service.accept() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [accept](./node-git-server.service.accept.md) + +## Service.accept() method + +accepts request to access resource + +Signature: + +```typescript +accept(): void; +``` + +Returns: + +void diff --git a/website/docs/api/node-git-server.service.commit.md b/website/docs/api/node-git-server.service.commit.md new file mode 100644 index 0000000..ebc5810 --- /dev/null +++ b/website/docs/api/node-git-server.service.commit.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.commit +hide_title: true +custom_edit_url: null +title: Service.commit property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [commit](./node-git-server.service.commit.md) + +## Service.commit property + +Signature: + +```typescript +commit: string | undefined; +``` diff --git a/website/docs/api/node-git-server.service.cwd.md b/website/docs/api/node-git-server.service.cwd.md new file mode 100644 index 0000000..58ed928 --- /dev/null +++ b/website/docs/api/node-git-server.service.cwd.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.cwd +hide_title: true +custom_edit_url: null +title: Service.cwd property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [cwd](./node-git-server.service.cwd.md) + +## Service.cwd property + +Signature: + +```typescript +cwd: string; +``` diff --git a/website/docs/api/node-git-server.service.evname.md b/website/docs/api/node-git-server.service.evname.md new file mode 100644 index 0000000..975d978 --- /dev/null +++ b/website/docs/api/node-git-server.service.evname.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.evname +hide_title: true +custom_edit_url: null +title: Service.evName property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [evName](./node-git-server.service.evname.md) + +## Service.evName property + +Signature: + +```typescript +evName: string | undefined; +``` diff --git a/website/docs/api/node-git-server.service.last.md b/website/docs/api/node-git-server.service.last.md new file mode 100644 index 0000000..f5c493a --- /dev/null +++ b/website/docs/api/node-git-server.service.last.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.last +hide_title: true +custom_edit_url: null +title: Service.last property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [last](./node-git-server.service.last.md) + +## Service.last property + +Signature: + +```typescript +last: string | undefined; +``` diff --git a/website/docs/api/node-git-server.service.log.md b/website/docs/api/node-git-server.service.log.md new file mode 100644 index 0000000..d43a3d9 --- /dev/null +++ b/website/docs/api/node-git-server.service.log.md @@ -0,0 +1,22 @@ +--- +id: node-git-server.service.log +hide_title: true +custom_edit_url: null +title: Service.log() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [log](./node-git-server.service.log.md) + +## Service.log() method + +Signature: + +```typescript +log(): void; +``` + +Returns: + +void diff --git a/website/docs/api/node-git-server.service.logs.md b/website/docs/api/node-git-server.service.logs.md new file mode 100644 index 0000000..3a5f275 --- /dev/null +++ b/website/docs/api/node-git-server.service.logs.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.logs +hide_title: true +custom_edit_url: null +title: Service.logs property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [logs](./node-git-server.service.logs.md) + +## Service.logs property + +Signature: + +```typescript +logs: string[]; +``` diff --git a/website/docs/api/node-git-server.service.md b/website/docs/api/node-git-server.service.md new file mode 100644 index 0000000..4ebcd15 --- /dev/null +++ b/website/docs/api/node-git-server.service.md @@ -0,0 +1,48 @@ +--- +id: node-git-server.service +hide_title: true +custom_edit_url: null +title: Service class +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) + +## Service class + +Signature: + +```typescript +export declare class Service extends HttpDuplex +``` + +**Extends:** [HttpDuplex](./node-git-server.httpduplex.md) + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(opts, req, res)](./node-git-server.service._constructor_.md) | | Handles invoking the git-\*-pack binaries | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [commit](./node-git-server.service.commit.md) | | string | undefined | | +| [cwd](./node-git-server.service.cwd.md) | | string | | +| [evName](./node-git-server.service.evname.md) | | string | undefined | | +| [last](./node-git-server.service.last.md) | | string | undefined | | +| [logs](./node-git-server.service.logs.md) | | string\[] | | +| [repo](./node-git-server.service.repo.md) | | string | | +| [service](./node-git-server.service.service.md) | | string | | +| [status](./node-git-server.service.status.md) | | string | | +| [username](./node-git-server.service.username.md) | | string | undefined | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [accept()](./node-git-server.service.accept.md) | | accepts request to access resource | +| [log()](./node-git-server.service.log.md) | | | +| [reject(code, msg)](./node-git-server.service.reject.md) | | reject request in flight | diff --git a/website/docs/api/node-git-server.service.reject.md b/website/docs/api/node-git-server.service.reject.md new file mode 100644 index 0000000..f4db985 --- /dev/null +++ b/website/docs/api/node-git-server.service.reject.md @@ -0,0 +1,31 @@ +--- +id: node-git-server.service.reject +hide_title: true +custom_edit_url: null +title: Service.reject() method +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [reject](./node-git-server.service.reject.md) + +## Service.reject() method + +reject request in flight + +Signature: + +```typescript +reject(code: number, msg: string): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| code | number | http response code | +| msg | string | message that should be displayed on the client | + +Returns: + +void diff --git a/website/docs/api/node-git-server.service.repo.md b/website/docs/api/node-git-server.service.repo.md new file mode 100644 index 0000000..04b0e5f --- /dev/null +++ b/website/docs/api/node-git-server.service.repo.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.repo +hide_title: true +custom_edit_url: null +title: Service.repo property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [repo](./node-git-server.service.repo.md) + +## Service.repo property + +Signature: + +```typescript +repo: string; +``` diff --git a/website/docs/api/node-git-server.service.service.md b/website/docs/api/node-git-server.service.service.md new file mode 100644 index 0000000..b0e45c4 --- /dev/null +++ b/website/docs/api/node-git-server.service.service.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.service +hide_title: true +custom_edit_url: null +title: Service.service property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [service](./node-git-server.service.service.md) + +## Service.service property + +Signature: + +```typescript +service: string; +``` diff --git a/website/docs/api/node-git-server.service.status.md b/website/docs/api/node-git-server.service.status.md new file mode 100644 index 0000000..e3c577e --- /dev/null +++ b/website/docs/api/node-git-server.service.status.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.status +hide_title: true +custom_edit_url: null +title: Service.status property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [status](./node-git-server.service.status.md) + +## Service.status property + +Signature: + +```typescript +status: string; +``` diff --git a/website/docs/api/node-git-server.service.username.md b/website/docs/api/node-git-server.service.username.md new file mode 100644 index 0000000..63654dc --- /dev/null +++ b/website/docs/api/node-git-server.service.username.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.service.username +hide_title: true +custom_edit_url: null +title: Service.username property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [Service](./node-git-server.service.md) > [username](./node-git-server.service.username.md) + +## Service.username property + +Signature: + +```typescript +username: string | undefined; +``` diff --git a/website/docs/api/node-git-server.serviceoptions.cwd.md b/website/docs/api/node-git-server.serviceoptions.cwd.md new file mode 100644 index 0000000..aaf10a6 --- /dev/null +++ b/website/docs/api/node-git-server.serviceoptions.cwd.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.serviceoptions.cwd +hide_title: true +custom_edit_url: null +title: ServiceOptions.cwd property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [ServiceOptions](./node-git-server.serviceoptions.md) > [cwd](./node-git-server.serviceoptions.cwd.md) + +## ServiceOptions.cwd property + +Signature: + +```typescript +cwd: string; +``` diff --git a/website/docs/api/node-git-server.serviceoptions.md b/website/docs/api/node-git-server.serviceoptions.md new file mode 100644 index 0000000..7f614f7 --- /dev/null +++ b/website/docs/api/node-git-server.serviceoptions.md @@ -0,0 +1,26 @@ +--- +id: node-git-server.serviceoptions +hide_title: true +custom_edit_url: null +title: ServiceOptions interface +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [ServiceOptions](./node-git-server.serviceoptions.md) + +## ServiceOptions interface + +Signature: + +```typescript +export interface ServiceOptions +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [cwd](./node-git-server.serviceoptions.cwd.md) | string | | +| [repo](./node-git-server.serviceoptions.repo.md) | string | | +| [service](./node-git-server.serviceoptions.service.md) | [ServiceString](./node-git-server.servicestring.md) | | diff --git a/website/docs/api/node-git-server.serviceoptions.repo.md b/website/docs/api/node-git-server.serviceoptions.repo.md new file mode 100644 index 0000000..6550715 --- /dev/null +++ b/website/docs/api/node-git-server.serviceoptions.repo.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.serviceoptions.repo +hide_title: true +custom_edit_url: null +title: ServiceOptions.repo property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [ServiceOptions](./node-git-server.serviceoptions.md) > [repo](./node-git-server.serviceoptions.repo.md) + +## ServiceOptions.repo property + +Signature: + +```typescript +repo: string; +``` diff --git a/website/docs/api/node-git-server.serviceoptions.service.md b/website/docs/api/node-git-server.serviceoptions.service.md new file mode 100644 index 0000000..93a3bdc --- /dev/null +++ b/website/docs/api/node-git-server.serviceoptions.service.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.serviceoptions.service +hide_title: true +custom_edit_url: null +title: ServiceOptions.service property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [ServiceOptions](./node-git-server.serviceoptions.md) > [service](./node-git-server.serviceoptions.service.md) + +## ServiceOptions.service property + +Signature: + +```typescript +service: ServiceString; +``` diff --git a/website/docs/api/node-git-server.servicerespond.md b/website/docs/api/node-git-server.servicerespond.md new file mode 100644 index 0000000..7193565 --- /dev/null +++ b/website/docs/api/node-git-server.servicerespond.md @@ -0,0 +1,33 @@ +--- +id: node-git-server.servicerespond +hide_title: true +custom_edit_url: null +title: serviceRespond() function +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [serviceRespond](./node-git-server.servicerespond.md) + +## serviceRespond() function + +execute given git operation and respond + +Signature: + +```typescript +export declare function serviceRespond(dup: HttpDuplex | Git, service: ServiceString, repoLocation: string, res: http.ServerResponse): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| dup | [HttpDuplex](./node-git-server.httpduplex.md) | [Git](./node-git-server.git.md) | duplex object to catch errors | +| service | [ServiceString](./node-git-server.servicestring.md) | the method that is responding infoResponse (push, pull, clone) | +| repoLocation | string | the repo path on disk | +| res | http.ServerResponse | http response | + +Returns: + +void diff --git a/website/docs/api/node-git-server.servicestring.md b/website/docs/api/node-git-server.servicestring.md new file mode 100644 index 0000000..c760f39 --- /dev/null +++ b/website/docs/api/node-git-server.servicestring.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.servicestring +hide_title: true +custom_edit_url: null +title: ServiceString type +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [ServiceString](./node-git-server.servicestring.md) + +## ServiceString type + +Signature: + +```typescript +export declare type ServiceString = "upload-pack" | "receive-pack"; +``` diff --git a/website/docs/api/node-git-server.tagdata.commit.md b/website/docs/api/node-git-server.tagdata.commit.md new file mode 100644 index 0000000..1813a55 --- /dev/null +++ b/website/docs/api/node-git-server.tagdata.commit.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.tagdata.commit +hide_title: true +custom_edit_url: null +title: TagData.commit property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [TagData](./node-git-server.tagdata.md) > [commit](./node-git-server.tagdata.commit.md) + +## TagData.commit property + +Signature: + +```typescript +commit: string; +``` diff --git a/website/docs/api/node-git-server.tagdata.md b/website/docs/api/node-git-server.tagdata.md new file mode 100644 index 0000000..744d6ad --- /dev/null +++ b/website/docs/api/node-git-server.tagdata.md @@ -0,0 +1,30 @@ +--- +id: node-git-server.tagdata +hide_title: true +custom_edit_url: null +title: TagData interface +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [TagData](./node-git-server.tagdata.md) + +## TagData interface + +An http duplex object (see below) with these extra properties: + +Signature: + +```typescript +export interface TagData extends HttpDuplex +``` + +**Extends:** [HttpDuplex](./node-git-server.httpduplex.md) + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [commit](./node-git-server.tagdata.commit.md) | string | | +| [repo](./node-git-server.tagdata.repo.md) | string | | +| [version](./node-git-server.tagdata.version.md) | string | | diff --git a/website/docs/api/node-git-server.tagdata.repo.md b/website/docs/api/node-git-server.tagdata.repo.md new file mode 100644 index 0000000..1dc2e35 --- /dev/null +++ b/website/docs/api/node-git-server.tagdata.repo.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.tagdata.repo +hide_title: true +custom_edit_url: null +title: TagData.repo property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [TagData](./node-git-server.tagdata.md) > [repo](./node-git-server.tagdata.repo.md) + +## TagData.repo property + +Signature: + +```typescript +repo: string; +``` diff --git a/website/docs/api/node-git-server.tagdata.version.md b/website/docs/api/node-git-server.tagdata.version.md new file mode 100644 index 0000000..04bc11e --- /dev/null +++ b/website/docs/api/node-git-server.tagdata.version.md @@ -0,0 +1,18 @@ +--- +id: node-git-server.tagdata.version +hide_title: true +custom_edit_url: null +title: TagData.version property +--- + + + +[Home](./index.md) > [node-git-server](./node-git-server.md) > [TagData](./node-git-server.tagdata.md) > [version](./node-git-server.tagdata.version.md) + +## TagData.version property + +Signature: + +```typescript +version: string; +``` diff --git a/website/docs/intro.md b/website/docs/intro.md new file mode 100644 index 0000000..3a587ad --- /dev/null +++ b/website/docs/intro.md @@ -0,0 +1,19 @@ +# Installation + +```shell +npm install node-git-server +``` + +## Start your site + +Run the development server: + +```shell +cd my-website + +npx docusaurus start +``` + +Your site starts at `http://localhost:3000`. + +Open `docs/intro.md` and edit some lines: the site **reloads automatically** and displays your changes. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 0000000..b988f18 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,103 @@ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion + +const lightCodeTheme = require("prism-react-renderer/themes/github"); +const darkCodeTheme = require("prism-react-renderer/themes/dracula"); + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: "node-git-server", + tagline: "🎡 A configurable git server written in Node.js", + url: "https://gabrielcsapo.github.io", + baseUrl: "/node-git-server/", + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "warn", + favicon: "img/favicon.ico", + organizationName: "gabrielcsapo", + projectName: "node-git-server", + plugins: [ + [ + require.resolve("docusaurus-plugin-search-local"), + { + highlightSearchTermsOnTargetPage: true, + }, + ], + "docusaurus-plugin-api-extractor", + ], + presets: [ + [ + "@docusaurus/preset-classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: require.resolve("./sidebars.js"), + editUrl: + "https://github.com/gabrielcsapo/node-git-server/edit/main/website/", + }, + blog: { + showReadingTime: true, + editUrl: + "https://github.com/gabrielcsapo/node-git-server/edit/main/website/blog/", + }, + theme: { + customCss: require.resolve("./src/css/custom.css"), + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + navbar: { + title: "My Site", + logo: { + alt: "My Site Logo", + src: "img/logo.svg", + }, + items: [ + { + type: "doc", + docId: "intro", + position: "left", + label: "Tutorial", + }, + { + href: "https://github.com/gabrielcsapo/node-git-server", + label: "GitHub", + position: "right", + }, + ], + }, + footer: { + style: "dark", + links: [ + { + title: "Docs", + items: [ + { + label: "Getting Started", + to: "/docs/intro", + }, + ], + }, + { + title: "More", + items: [ + { + label: "GitHub", + href: "https://github.com/gabrielcsapo/node-git-server", + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + }), +}; + +module.exports = config; diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000..df8f85e --- /dev/null +++ b/website/package.json @@ -0,0 +1,45 @@ +{ + "name": "website", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "api-extractor": "DOCUSAURUS_PLUGIN_API_EXTRACTOR_PROJECT_FOLDER_OVERRIDE=../ docusaurus api-extractor:run -s ./src -o api", + "start": "DOCUSAURUS_PLUGIN_API_EXTRACTOR_PROJECT_FOLDER_OVERRIDE=../ docusaurus start", + "lint": "echo 'none'", + "test": "echo 'none'", + "build": "DOCUSAURUS_PLUGIN_API_EXTRACTOR_PROJECT_FOLDER_OVERRIDE=../ docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "DOCUSAURUS_PLUGIN_API_EXTRACTOR_PROJECT_FOLDER_OVERRIDE=../ docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "2.0.0-beta.14", + "@docusaurus/preset-classic": "2.0.0-beta.14", + "@mdx-js/react": "^1.6.21", + "@svgr/webpack": "^5.5.0", + "clsx": "^1.1.1", + "docusaurus-plugin-api-extractor": "^0.4.2", + "docusaurus-plugin-search-local": "^0.1.4", + "file-loader": "^6.2.0", + "prism-react-renderer": "^1.2.1", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "url-loader": "^4.1.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 0000000..fd342f2 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,31 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + { + type: 'category', + label: 'Tutorial', + items: ['hello'], + }, + ], + */ +}; + +module.exports = sidebars; diff --git a/website/src/components/HomepageFeatures.js b/website/src/components/HomepageFeatures.js new file mode 100644 index 0000000..9ac0811 --- /dev/null +++ b/website/src/components/HomepageFeatures.js @@ -0,0 +1,59 @@ +import React from "react"; +import clsx from "clsx"; + +import styles from "./HomepageFeatures.module.css"; + +const FeatureList = [ + { + title: "Easy to Use", + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: "Focus on What Matters", + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: "Powered by React", + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({ title, description }) { + return ( +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/website/src/components/HomepageFeatures.module.css b/website/src/components/HomepageFeatures.module.css new file mode 100644 index 0000000..2132b3d --- /dev/null +++ b/website/src/components/HomepageFeatures.module.css @@ -0,0 +1,6 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 0000000..6abe148 --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,28 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: rgb(33, 175, 144); + --ifm-color-primary-darker: rgb(31, 165, 136); + --ifm-color-primary-darkest: rgb(26, 136, 112); + --ifm-color-primary-light: rgb(70, 203, 174); + --ifm-color-primary-lighter: rgb(102, 212, 189); + --ifm-color-primary-lightest: rgb(146, 224, 208); + --ifm-code-font-size: 95%; +} + +.docusaurus-highlight-code-line { + background-color: rgba(0, 0, 0, 0.1); + display: block; + margin: 0 calc(-1 * var(--ifm-pre-padding)); + padding: 0 var(--ifm-pre-padding); +} + +html[data-theme='dark'] .docusaurus-highlight-code-line { + background-color: rgba(0, 0, 0, 0.3); +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100644 index 0000000..7865e6c --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,42 @@ +import React from "react"; +import clsx from "clsx"; +import Layout from "@theme/Layout"; +import Link from "@docusaurus/Link"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import styles from "./index.module.css"; +import HomepageFeatures from "../components/HomepageFeatures"; + +function HomepageHeader() { + const { siteConfig } = useDocusaurusContext(); + return ( +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+ + Quick Start + +
+
+
+ ); +} + +export default function Home() { + const { siteConfig } = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css new file mode 100644 index 0000000..666feb6 --- /dev/null +++ b/website/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 966px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/website/src/pages/markdown-page.md b/website/src/pages/markdown-page.md new file mode 100644 index 0000000..9756c5b --- /dev/null +++ b/website/src/pages/markdown-page.md @@ -0,0 +1,7 @@ +--- +title: Markdown page example +--- + +# Markdown page example + +You don't need React to write simple standalone pages. diff --git a/website/static/.nojekyll b/website/static/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c01d54bcd39a5f853428f3cd5aa0f383d963c484 GIT binary patch literal 3626 zcmb`Je@s(X6vrR`EK3%b%orErlDW({vnABqA zcfaS{d+xbU5JKp0*;0YOg+;Fl!eT)XRuapIwFLL`=imZCSon$`se`_<%@MB=M~KG+ z=EW^FL`w|Bo>*ktlaS^(fut!95`iG5u=SZ8nfDHO#GaTlH1-XG^;vsjUb^gWTVz0+ z^=WR1wv9-2oeR=_;fL0H7rNWqAzGtO(D;`~cX(RcN0w2v24Y8)6t`cS^_ghs`_ho? z{0ka~1Dgo8TfAP$r*ua?>$_V+kZ!-(TvEJ7O2f;Y#tezt$&R4 zLI}=-y@Z!grf*h3>}DUL{km4R>ya_I5Ag#{h_&?+HpKS!;$x3LC#CqUQ8&nM?X))Q zXAy2?`YL4FbC5CgJu(M&Q|>1st8XXLZ|5MgwgjP$m_2Vt0(J z&Gu7bOlkbGzGm2sh?X`){7w69Y$1#@P@7DF{ZE=4%T0NDS)iH`tiPSKpDNW)zmtn( zw;4$f>k)4$LBc>eBAaTZeCM2(iD+sHlj!qd z2GjRJ>f_Qes(+mnzdA^NH?^NB(^o-%Gmg$c8MNMq&`vm@9Ut;*&$xSD)PKH{wBCEC z4P9%NQ;n2s59ffMn8*5)5AAg4-93gBXBDX`A7S& zH-|%S3Wd%T79fk-e&l`{!?lve8_epXhE{d3Hn$Cg!t=-4D(t$cK~7f&4s?t7wr3ZP z*!SRQ-+tr|e1|hbc__J`k3S!rMy<0PHy&R`v#aJv?`Y?2{avK5sQz%=Us()jcNuZV z*$>auD4cEw>;t`+m>h?f?%VFJZj8D|Y1e_SjxG%J4{-AkFtT2+ZZS5UScS~%;dp!V>)7zi`w(xwSd*FS;Lml=f6hn#jq)2is4nkp+aTrV?)F6N z>DY#SU0IZ;*?Hu%tSj4edd~kYNHMFvS&5}#3-M;mBCOCZL3&;2obdG?qZ>rD|zC|Lu|sny76pn2xl|6sk~Hs{X9{8iBW zwiwgQt+@hi`FYMEhX2 \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock new file mode 100644 index 0000000..e872d5b --- /dev/null +++ b/website/yarn.lock @@ -0,0 +1,7823 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@algolia/autocomplete-core@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz#c121e70c78fd0175c989a219918124ad7758e48b" + integrity sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw== + dependencies: + "@algolia/autocomplete-shared" "1.2.2" + +"@algolia/autocomplete-preset-algolia@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz#da734ef9e42a5f64cdad2dfc81c4e9fbf805d976" + integrity sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q== + dependencies: + "@algolia/autocomplete-shared" "1.2.2" + +"@algolia/autocomplete-shared@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz#ff25dc308f2a296b2b9b325f1e3b57498eea3e0c" + integrity sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw== + +"@algolia/cache-browser-local-storage@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.11.0.tgz#1c168add00b398a860db6c86039e33b2843a9425" + integrity sha512-4sr9vHIG1fVA9dONagdzhsI/6M5mjs/qOe2xUP0yBmwsTsuwiZq3+Xu6D3dsxsuFetcJgC6ydQoCW8b7fDJHYQ== + dependencies: + "@algolia/cache-common" "4.11.0" + +"@algolia/cache-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.11.0.tgz#066fe6d58b18e4b028dbef9bb8de07c5e22a3594" + integrity sha512-lODcJRuPXqf+6mp0h6bOxPMlbNoyn3VfjBVcQh70EDP0/xExZbkpecgHyyZK4kWg+evu+mmgvTK3GVHnet/xKw== + +"@algolia/cache-in-memory@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.11.0.tgz#763c8cb655e6fd2261588e04214fca0959ac07c1" + integrity sha512-aBz+stMSTBOBaBEQ43zJXz2DnwS7fL6dR0e2myehAgtfAWlWwLDHruc/98VOy1ZAcBk1blE2LCU02bT5HekGxQ== + dependencies: + "@algolia/cache-common" "4.11.0" + +"@algolia/client-account@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.11.0.tgz#67fadd3b0802b013ebaaa4b47bb7babae892374e" + integrity sha512-jwmFBoUSzoMwMqgD3PmzFJV/d19p1RJXB6C1ADz4ju4mU7rkaQLtqyZroQpheLoU5s5Tilmn/T8/0U2XLoJCRQ== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/client-search" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-analytics@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.11.0.tgz#cbdc8128205e2da749cafc79e54708d14c413974" + integrity sha512-v5U9585aeEdYml7JqggHAj3E5CQ+jPwGVztPVhakBk8H/cmLyPS2g8wvmIbaEZCHmWn4TqFj3EBHVYxAl36fSA== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/client-search" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.11.0.tgz#9a2d1f6f8eaad25ba5d6d4ce307ba5bd84e6f999" + integrity sha512-Qy+F+TZq12kc7tgfC+FM3RvYH/Ati7sUiUv/LkvlxFwNwNPwWGoZO81AzVSareXT/ksDDrabD4mHbdTbBPTRmQ== + dependencies: + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-personalization@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.11.0.tgz#d3bf0e760f85df876b4baf5b81996f0aa3a59940" + integrity sha512-mI+X5IKiijHAzf9fy8VSl/GTT67dzFDnJ0QAM8D9cMPevnfX4U72HRln3Mjd0xEaYUOGve8TK/fMg7d3Z5yG6g== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/client-search@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.11.0.tgz#c1105d715a2a04ba27231eca86f5d6620f68f4ae" + integrity sha512-iovPLc5YgiXBdw2qMhU65sINgo9umWbHFzInxoNErWnYoTQWfXsW6P54/NlKx5uscoLVjSf+5RUWwFu5BX+lpw== + dependencies: + "@algolia/client-common" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/transporter" "4.11.0" + +"@algolia/logger-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.11.0.tgz#bac1c2d59d29dee378b57412c8edd435b97de663" + integrity sha512-pRMJFeOY8hoWKIxWuGHIrqnEKN/kqKh7UilDffG/+PeEGxBuku+Wq5CfdTFG0C9ewUvn8mAJn5BhYA5k8y0Jqg== + +"@algolia/logger-console@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.11.0.tgz#ced19e3abb22eb782ed5268d51efb5aa9ef109ef" + integrity sha512-wXztMk0a3VbNmYP8Kpc+F7ekuvaqZmozM2eTLok0XIshpAeZ/NJDHDffXK2Pw+NF0wmHqurptLYwKoikjBYvhQ== + dependencies: + "@algolia/logger-common" "4.11.0" + +"@algolia/requester-browser-xhr@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.11.0.tgz#f9e1ad56f185432aa8dde8cad53ae271fd5d6181" + integrity sha512-Fp3SfDihAAFR8bllg8P5ouWi3+qpEVN5e7hrtVIYldKBOuI/qFv80Zv/3/AMKNJQRYglS4zWyPuqrXm58nz6KA== + dependencies: + "@algolia/requester-common" "4.11.0" + +"@algolia/requester-common@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.11.0.tgz#d16de98d3ff72434bac39e4d915eab08035946a9" + integrity sha512-+cZGe/9fuYgGuxjaBC+xTGBkK7OIYdfapxhfvEf03dviLMPmhmVYFJtJlzAjQ2YmGDJpHrGgAYj3i/fbs8yhiA== + +"@algolia/requester-node-http@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.11.0.tgz#beb2b6b68d5f4ce15aec80ede623f0ac96991368" + integrity sha512-qJIk9SHRFkKDi6dMT9hba8X1J1z92T5AZIgl+tsApjTGIRQXJLTIm+0q4yOefokfu4CoxYwRZ9QAq+ouGwfeOg== + dependencies: + "@algolia/requester-common" "4.11.0" + +"@algolia/transporter@4.11.0": + version "4.11.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.11.0.tgz#a8de3c173093ceceb02b26b577395ce3b3d4b96f" + integrity sha512-k4dyxiaEfYpw4UqybK9q7lrFzehygo6KV3OCYJMMdX0IMWV0m4DXdU27c1zYRYtthaFYaBzGF4Kjcl8p8vxCKw== + dependencies: + "@algolia/cache-common" "4.11.0" + "@algolia/logger-common" "4.11.0" + "@algolia/requester-common" "4.11.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa" + integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew== + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@^7.12.16", "@babel/core@^7.12.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.12.15", "@babel/generator@^7.12.5", "@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz#01d615762e796c17952c29e3ede9d6de07d235a8" + integrity sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10" + integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz#d5aa3b086e13a5fe05238ff40c3a5a0c2dab3ead" + integrity sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.0.tgz#875519c979c232f41adfbd43a3b0398c2e388183" + integrity sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.16", "@babel/parser@^7.12.7", "@babel/parser@^7.16.0": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.2.tgz#3723cd5c8d8773eef96ce57ea1d9b7faaccd12ac" + integrity sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.0": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + +"@babel/plugin-proposal-async-generator-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz#11425d47a60364352f668ad5fbc1d6596b2c5caf" + integrity sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1" + integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + +"@babel/plugin-transform-block-scoped-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== + dependencies: + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz#1b50765fc421c229819dc4c7cdb8911660b3c2d7" + integrity sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.0.tgz#1483b894b8e6ef0709d260532fbd4db9fc27a0e6" + integrity sha512-OgtklS+p9t1X37eWA4XdvvbZG/3gqzX569gqmo3q4/Ui6qjfTQmOs5UTSrfdD9nVByHhX6Gbm/Pyc4KbwUXGWA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-display-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.0.tgz#9a0ad8aa8e8790883a7bd2736f66229a58125676" + integrity sha512-FJFdJAqaCpndL+pIf0aeD/qlQwT7QXOvR6Cc8JPvNhKJBi2zc/DPc4g05Y3fbD/0iWAMQFGij4+Xw+4L/BMpTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-react-jsx-development@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.0.tgz#1cb52874678d23ab11d0d16488d54730807303ef" + integrity sha512-qq65iSqBRq0Hr3wq57YG2AmW0H6wgTnIzpffTphrUWUgLCOK+zf1f7G0vuOiXrp7dU1qq+fQBoqZ3wCDAkhFzw== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.16.0" + +"@babel/plugin-transform-react-jsx@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.0.tgz#55b797d4960c3de04e07ad1c0476e2bc6a4889f1" + integrity sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/plugin-transform-react-pure-annotations@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.0.tgz#23db6ddf558d8abde41b8ad9d59f48ad5532ccab" + integrity sha512-NC/Bj2MG+t8Ef5Pdpo34Ay74X4Rt804h5y81PwOpfPtmAK3i6CizmQqwyBQzIepz1Yt8wNr2Z2L7Lu3qBMfZMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@^7.15.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz#3fe0da36c2f0834bef7c4d3e7f2b2db0ee0c8909" + integrity sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-polyfill-corejs2 "^0.2.3" + babel-plugin-polyfill-corejs3 "^0.3.0" + babel-plugin-polyfill-regenerator "^0.2.3" + semver "^6.3.0" + +"@babel/plugin-transform-shorthand-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typescript@^7.16.0": + version "7.16.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" + integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.16.0" + +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.15.6": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.0.tgz#97228393d217560d6a1c6c56f0adb9d12bca67f5" + integrity sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.0" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.0" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.2.3" + babel-plugin-polyfill-corejs3 "^0.3.0" + babel-plugin-polyfill-regenerator "^0.2.3" + core-js-compat "^3.19.0" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.13", "@babel/preset-react@^7.12.5": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.0.tgz#f71d3e8dff5218478011df037fad52660ee6d82a" + integrity sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-react-jsx" "^7.16.0" + "@babel/plugin-transform-react-jsx-development" "^7.16.0" + "@babel/plugin-transform-react-pure-annotations" "^7.16.0" + +"@babel/preset-typescript@^7.12.16": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" + integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-typescript" "^7.16.0" + +"@babel/runtime-corejs3@^7.15.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz#58a7fb00e6948508f12f53a303993e8b6e2f6c70" + integrity sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ== + dependencies: + core-js-pure "^3.19.0" + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.15.4", "@babel/runtime@^7.8.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.0.tgz#e27b977f2e2088ba24748bf99b5e1dece64e4f0b" + integrity sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.12.7", "@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.0.tgz#965df6c6bfc0a958c1e739284d3c9fa4a6e3c45b" + integrity sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.12.6", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@docsearch/css@3.0.0-alpha.41": + version "3.0.0-alpha.41" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0-alpha.41.tgz#c5c8e803541bd157ad86e764c2c1e9f1b5a68592" + integrity sha512-AP1jqcF/9jCrm4s0lcES3QAtHueyipKjd14L/pguk0CZYK7uI7hC0FWodmRmrgK3/HST9jiHa1waUMR6ZYedlQ== + +"@docsearch/react@^3.0.0-alpha.39": + version "3.0.0-alpha.41" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0-alpha.41.tgz#07e85a664e85f251ce3d13153abce65a4d5997ab" + integrity sha512-UL0Gdter/NUea04lGuBGH0GzQ2/2q/hBfn7Rjo71rRKbjtfkQCM92leJ9tZ+9j9sFLoyuHb9XMm/B8vCjWwTEg== + dependencies: + "@algolia/autocomplete-core" "1.2.2" + "@algolia/autocomplete-preset-algolia" "1.2.2" + "@docsearch/css" "3.0.0-alpha.41" + algoliasearch "^4.0.0" + +"@docusaurus/core@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-beta.9.tgz#59b57c5e60fe83ef9e3c6aa7000d470eb0c52656" + integrity sha512-Bf9c6+yftZfAJk2h4HyaDvzBp5TLhqYtfnfWKKNi0Gdw9vRLXhi7IaiGaLWIuNAIJLTi++Ql0BAn+C0OO8EsWA== + dependencies: + "@babel/core" "^7.12.16" + "@babel/generator" "^7.12.15" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.15.0" + "@babel/preset-env" "^7.15.6" + "@babel/preset-react" "^7.12.13" + "@babel/preset-typescript" "^7.12.16" + "@babel/runtime" "^7.15.4" + "@babel/runtime-corejs3" "^7.15.4" + "@babel/traverse" "^7.12.13" + "@docusaurus/cssnano-preset" "2.0.0-beta.9" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@docusaurus/utils-common" "2.0.0-beta.9" + "@docusaurus/utils-validation" "2.0.0-beta.9" + "@slorber/static-site-generator-webpack-plugin" "^4.0.0" + "@svgr/webpack" "^5.5.0" + autoprefixer "^10.3.5" + babel-loader "^8.2.2" + babel-plugin-dynamic-import-node "2.3.0" + boxen "^5.0.1" + chalk "^4.1.2" + chokidar "^3.5.2" + clean-css "^5.1.5" + commander "^5.1.0" + copy-webpack-plugin "^9.0.1" + core-js "^3.18.0" + css-loader "^5.1.1" + css-minimizer-webpack-plugin "^3.0.2" + cssnano "^5.0.8" + del "^6.0.0" + detect-port "^1.3.0" + escape-html "^1.0.3" + eta "^1.12.3" + file-loader "^6.2.0" + fs-extra "^10.0.0" + github-slugger "^1.4.0" + globby "^11.0.2" + html-minifier-terser "^6.0.2" + html-tags "^3.1.0" + html-webpack-plugin "^5.4.0" + import-fresh "^3.3.0" + is-root "^2.1.0" + leven "^3.1.0" + lodash "^4.17.20" + mini-css-extract-plugin "^1.6.0" + nprogress "^0.2.0" + postcss "^8.3.7" + postcss-loader "^6.1.1" + prompts "^2.4.1" + react-dev-utils "12.0.0-next.47" + react-error-overlay "^6.0.9" + react-helmet "^6.1.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.2.0" + react-router-config "^5.1.1" + react-router-dom "^5.2.0" + remark-admonitions "^1.2.1" + resolve-pathname "^3.0.0" + rtl-detect "^1.0.4" + semver "^7.3.4" + serve-handler "^6.1.3" + shelljs "^0.8.4" + std-env "^2.2.1" + strip-ansi "^6.0.0" + terser-webpack-plugin "^5.2.4" + tslib "^2.3.1" + update-notifier "^5.1.0" + url-loader "^4.1.1" + wait-on "^6.0.0" + webpack "^5.61.0" + webpack-bundle-analyzer "^4.4.2" + webpack-dev-server "^4.4.0" + webpack-merge "^5.8.0" + webpackbar "^5.0.0-3" + +"@docusaurus/cssnano-preset@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.9.tgz#4ad9079c68b79744c08be6e48e51d2c12907f71f" + integrity sha512-oIdoiZ/i4LXRxmuLN2ZmvGpMqtwba+ck9TlaQDWC7wvHx+EA9mvvcewKWgc7e4dxPA00+777cQvrDctAreAqLw== + dependencies: + cssnano-preset-advanced "^5.1.4" + postcss "^8.3.7" + postcss-sort-media-queries "^4.1.0" + +"@docusaurus/mdx-loader@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.9.tgz#e87a1ff22fdabcb6bea59beae8b2d999dfb6eb81" + integrity sha512-qb+/Ew69kaAIiot+1lJ13ozsyCY+7/VryzopDTgr60BDCsLUvuDzjNKreBqo1xdC4JxYD/hJMV7UAHkZ8rWB8Q== + dependencies: + "@babel/parser" "^7.12.16" + "@babel/traverse" "^7.12.13" + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@mdx-js/mdx" "^1.6.21" + "@mdx-js/react" "^1.6.21" + chalk "^4.1.2" + escape-html "^1.0.3" + file-loader "^6.2.0" + fs-extra "^10.0.0" + github-slugger "^1.4.0" + gray-matter "^4.0.3" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.1.0" + stringify-object "^3.3.0" + unist-util-visit "^2.0.2" + url-loader "^4.1.1" + webpack "^5.61.0" + +"@docusaurus/plugin-content-blog@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.9.tgz#d72a32013232610552cbc45509ba2ddaea653690" + integrity sha512-KZ6UmUa/P4SSX8/xnZpwSt7krnAfRg3S/ghZ7zeIzcp12iumSZBmLNi5rIIXcsFVH0IPOnIofEoWEaEIwaNerg== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/mdx-loader" "2.0.0-beta.9" + "@docusaurus/types" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@docusaurus/utils-validation" "2.0.0-beta.9" + chalk "^4.1.2" + escape-string-regexp "^4.0.0" + feed "^4.2.2" + fs-extra "^10.0.0" + globby "^11.0.2" + js-yaml "^4.0.0" + loader-utils "^2.0.0" + lodash "^4.17.20" + reading-time "^1.5.0" + remark-admonitions "^1.2.1" + tslib "^2.3.1" + utility-types "^3.10.0" + webpack "^5.61.0" + +"@docusaurus/plugin-content-docs@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.9.tgz#53ac2b43beb0f183c8a9b8fab6201e5e8f444a67" + integrity sha512-GC+CvqKuravPpK5fqlYJVmj9hc6nkd/c/rM2ONueFCqw2wyuH7esWL8RpMqgS0JM1qwwuRpi0Dd3R/zdOptHIQ== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/mdx-loader" "2.0.0-beta.9" + "@docusaurus/types" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@docusaurus/utils-validation" "2.0.0-beta.9" + chalk "^4.1.2" + combine-promises "^1.1.0" + escape-string-regexp "^4.0.0" + execa "^5.0.0" + fs-extra "^10.0.0" + globby "^11.0.2" + import-fresh "^3.2.2" + js-yaml "^4.0.0" + loader-utils "^2.0.0" + lodash "^4.17.20" + remark-admonitions "^1.2.1" + shelljs "^0.8.4" + tslib "^2.3.1" + utility-types "^3.10.0" + webpack "^5.61.0" + +"@docusaurus/plugin-content-pages@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.9.tgz#115309f03bae2864bb9e4cd8fae646ea2e1f31dc" + integrity sha512-27nFHhPpZEWra6izyWgY+EkBspr3OAUUHojRXzMUKplYLZ5gIciM224PXbwLyECjpn51eaf8/2Ay+/H9BdTCBw== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/mdx-loader" "2.0.0-beta.9" + "@docusaurus/types" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@docusaurus/utils-validation" "2.0.0-beta.9" + globby "^11.0.2" + lodash "^4.17.20" + remark-admonitions "^1.2.1" + tslib "^2.3.1" + webpack "^5.61.0" + +"@docusaurus/plugin-debug@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.9.tgz#97920e6ba333f99537bd72ae97a8999beeb39a3b" + integrity sha512-uVnLfNE7YBMCWVcfoy6NgAxbqfG3bXfrLozM2RMafPmsCitaw+wrTdnba/irM364wPFFursF9lDrNLwSrYiRbw== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/types" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + fs-extra "^10.0.0" + react-json-view "^1.21.3" + tslib "^2.3.1" + +"@docusaurus/plugin-google-analytics@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.9.tgz#5584d20b2e64cc3f84978d42cb0edeeabaf49123" + integrity sha512-fYnunrefFko2jF/M973FONZjn9QHzNnt7+uMokR4frK/BX/zEyW2Yw6vh7dC0oo+ml5625Pv5OfwwlOJ9DRmHw== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + +"@docusaurus/plugin-google-gtag@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.9.tgz#70de97bb5a25bc10969941ec257d694db0abed79" + integrity sha512-AlVhbjN0OEiM8r8BncdiP82B9I7Dw3fN4cj2pPLtcOmvcRPQM2BfdzxbXPBUHgyT50Rd6hxS+R2Fl/s2RpUAHA== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + +"@docusaurus/plugin-sitemap@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.9.tgz#4c944b6fc4e8fa4625a6fd985ec21d6455c31647" + integrity sha512-p6Qc1vo/yb1v767/u0E72inkGKayx77HDKsDOGrNj2IH0db0cMsskBLeKYcDfVz5+dtmFrR+lubINp7TyofkvA== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/types" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@docusaurus/utils-common" "2.0.0-beta.9" + "@docusaurus/utils-validation" "2.0.0-beta.9" + fs-extra "^10.0.0" + sitemap "^7.0.0" + tslib "^2.3.1" + +"@docusaurus/preset-classic@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.9.tgz#853e6fa376eb389a2f06c0c85f2bc823b26b3010" + integrity sha512-wm4x+jOKYaBL+7ckJwskyiITayNm3127e42kz4CtvmjjccpZu68JCfjehqkpnoPDTByBYnaeOKyga4azeAQLSA== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/plugin-content-blog" "2.0.0-beta.9" + "@docusaurus/plugin-content-docs" "2.0.0-beta.9" + "@docusaurus/plugin-content-pages" "2.0.0-beta.9" + "@docusaurus/plugin-debug" "2.0.0-beta.9" + "@docusaurus/plugin-google-analytics" "2.0.0-beta.9" + "@docusaurus/plugin-google-gtag" "2.0.0-beta.9" + "@docusaurus/plugin-sitemap" "2.0.0-beta.9" + "@docusaurus/theme-classic" "2.0.0-beta.9" + "@docusaurus/theme-search-algolia" "2.0.0-beta.9" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.9.tgz#d4d246c295e91938bb4ae9745104e352bc5dfe94" + integrity sha512-vTijCGrkFkaqzpOu7w1AaXOBFOo6wirkNEN0+TMkx3oTu95Yj7h98rt/9Z60f6L9HVjOFQ18h3fU6cWloNG+Bg== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/plugin-content-blog" "2.0.0-beta.9" + "@docusaurus/plugin-content-docs" "2.0.0-beta.9" + "@docusaurus/plugin-content-pages" "2.0.0-beta.9" + "@docusaurus/theme-common" "2.0.0-beta.9" + "@docusaurus/types" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@docusaurus/utils-common" "2.0.0-beta.9" + "@docusaurus/utils-validation" "2.0.0-beta.9" + "@mdx-js/mdx" "^1.6.21" + "@mdx-js/react" "^1.6.21" + chalk "^4.1.2" + clsx "^1.1.1" + copy-text-to-clipboard "^3.0.1" + fs-extra "^10.0.0" + globby "^11.0.2" + infima "0.2.0-alpha.34" + lodash "^4.17.20" + parse-numeric-range "^1.3.0" + postcss "^8.3.7" + prism-react-renderer "^1.2.1" + prismjs "^1.23.0" + prop-types "^15.7.2" + react-router-dom "^5.2.0" + rtlcss "^3.3.0" + +"@docusaurus/theme-common@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-beta.9.tgz#a2bd5eb242baa38b110a191126f9054740267925" + integrity sha512-ZsFP+wH1CY6SBqkBGAdj9kHZHkV/7Y77Jw0rnEVbVU4zX2Jh6apWRCOJVaPrroDES8/9D6WWKQgQifeoJ2EeIA== + dependencies: + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/plugin-content-blog" "2.0.0-beta.9" + "@docusaurus/plugin-content-docs" "2.0.0-beta.9" + "@docusaurus/plugin-content-pages" "2.0.0-beta.9" + "@docusaurus/types" "2.0.0-beta.9" + clsx "^1.1.1" + fs-extra "^10.0.0" + tslib "^2.3.1" + utility-types "^3.10.0" + +"@docusaurus/theme-search-algolia@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.9.tgz#ccece22535b91e83757c21d895817c5f577fcc36" + integrity sha512-pbpA18kqr5H7A7snmHf4dzMYV+3nsTDYMhV9f2Tms7yP9cxW7ZMHJwaEKXh1myE58Nbkv84AF734TR1UgYrziw== + dependencies: + "@docsearch/react" "^3.0.0-alpha.39" + "@docusaurus/core" "2.0.0-beta.9" + "@docusaurus/theme-common" "2.0.0-beta.9" + "@docusaurus/utils" "2.0.0-beta.9" + "@docusaurus/utils-validation" "2.0.0-beta.9" + algoliasearch "^4.10.5" + algoliasearch-helper "^3.5.5" + clsx "^1.1.1" + eta "^1.12.3" + lodash "^4.17.20" + +"@docusaurus/types@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-beta.9.tgz#3561a0e3ce9bcb0892d02a025161bb854a189d10" + integrity sha512-7qK7PCwRImHzv9RMi5HJ7RoHKQ8r7oqZK79UucmzBXl5nyfZridBC7JQ+LG7GBqYVaIjfOHUflOOLIVn+gK2/g== + dependencies: + commander "^5.1.0" + joi "^17.4.2" + querystring "0.2.0" + utility-types "^3.10.0" + webpack "^5.61.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.0-beta.9.tgz#3c61db4dd87b4644266e9c240024049cd991f338" + integrity sha512-ftVRifnVXW9eQjwOSuTzhEb9P55KSVfqEbQHgUlMm8KYXHC4NNdn4V+9sHmdJ8rDWNU+PA/+FMjGxWLVejMkxg== + dependencies: + "@docusaurus/types" "2.0.0-beta.9" + tslib "^2.3.1" + +"@docusaurus/utils-validation@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.9.tgz#7a4e4ab29627b618a784e8b59fbe4b4bab736594" + integrity sha512-8XZ2wdg+HPSVqgFzhfvntPLwX0+sCypvODatXR8A3YUraZYqQU0NK7SLqD1epLpmHjT/bztSq5DydoGoFRJdIA== + dependencies: + "@docusaurus/utils" "2.0.0-beta.9" + chalk "^4.1.2" + joi "^17.4.2" + tslib "^2.3.1" + +"@docusaurus/utils@2.0.0-beta.9": + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-beta.9.tgz#b9d2b5e2baaed94b5041288fa759438e0164c408" + integrity sha512-f5TUY72Qux0wv1tjxsvjFDjfRnsWtQjsjR5Q/gJ5V021H9lycC9YCk0cEReg3bI3+IVL2iGvQqNnH3R1G7NcRw== + dependencies: + "@docusaurus/types" "2.0.0-beta.9" + "@mdx-js/runtime" "^1.6.22" + "@types/github-slugger" "^1.3.0" + chalk "^4.1.2" + escape-string-regexp "^4.0.0" + fs-extra "^10.0.0" + globby "^11.0.4" + gray-matter "^4.0.3" + lodash "^4.17.20" + micromatch "^4.0.4" + remark-mdx-remove-exports "^1.6.22" + remark-mdx-remove-imports "^1.6.22" + resolve-pathname "^3.0.0" + tslib "^2.3.1" + +"@hapi/hoek@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@mdx-js/mdx@1.6.22", "@mdx-js/mdx@^1.6.21": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@1.6.22", "@mdx-js/react@^1.6.21": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/runtime@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/runtime/-/runtime-1.6.22.tgz#3edd388bf68a519ffa1aaf9c446b548165102345" + integrity sha512-p17spaO2+55VLCuxXA3LVHC4phRx60NR2XMdZ+qgVU1lKvEX4y88dmFNOzGDCPLJ03IZyKrJ/rPWWRiBrd9JrQ== + dependencies: + "@mdx-js/mdx" "1.6.22" + "@mdx-js/react" "1.6.22" + buble-jsx-only "^0.19.8" + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@sideway/address@^4.1.0": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.2.tgz#811b84333a335739d3969cfc434736268170cad1" + integrity sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@slorber/static-site-generator-webpack-plugin@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.1.tgz#0c8852146441aaa683693deaa5aee2f991d94841" + integrity sha512-PSv4RIVO1Y3kvHxjvqeVisk3E9XFoO04uwYBDWe217MFqKspplYswTuKLiJu0aLORQWzuQjfVsSlLPojwfYsLw== + dependencies: + bluebird "^3.7.1" + cheerio "^0.22.0" + eval "^0.1.4" + url "^0.11.0" + webpack-sources "^1.4.3" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz#583a5e2a193e214da2f3afeb0b9e8d3250126b4a" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz#8af54f3e0a8add7b1e2b0fcd5a882c55393df327" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz#82e826b8715d71083120fe8f2492ec7d7874a579" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz#5ee52a9c2533f73e63f8f22b779f93cd432a5461" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz#1aa8cd798a1db7173ac043466d7b52236b369000" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz#02da55d85320549324e201c7b2e53bf431fcc246" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/eslint-scope@^3.7.0": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e" + integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.28.2.tgz#0ff2947cdd305897c52d5372294e8c76f351db68" + integrity sha512-KubbADPkfoU75KgKeKLsFHXnU4ipH7wYg0TRT33NK3N3yiu7jlFAAoygIWBV+KbuHx/G+AvuGX6DllnK35gfJA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/github-slugger@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/github-slugger/-/github-slugger-1.3.0.tgz#16ab393b30d8ae2a111ac748a015ac05a1fc5524" + integrity sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g== + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/html-minifier-terser@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.0.0.tgz#563c1c6c132cd204e71512f9c0b394ff90d3fae7" + integrity sha512-NZwaaynfs1oIoLAV1vg18e7QMVDvw+6SQrdJc8w3BwUaoroVSf6EBj/Sk4PBWGxsq0dzhA2drbsuMC1/6C6KgQ== + +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/mdast@^3.0.0": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== + dependencies: + "@types/unist" "*" + +"@types/node@*": + version "16.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.6.tgz#6bef7a2a0ad684cf6e90fcfe31cecabd9ce0a3ae" + integrity sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w== + +"@types/node@^15.0.1": + version "15.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" + integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/react@*": + version "17.0.34" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.34.tgz#797b66d359b692e3f19991b6b07e4b0c706c0102" + integrity sha512-46FEGrMjc2+8XhHXILr+3+/sTe3OfzSPU9YGKILLrUYbQ1CLQC9Daqo1KzENGXAWwrFwiY0l4ZbF20gRvgpWTg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/sax@^1.2.1": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.3.tgz#b630ac1403ebd7812e0bf9a10de9bf5077afb348" + integrity sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA== + dependencies: + "@types/node" "*" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.0.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^6.1.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^8.0.4, acorn@^8.4.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + +address@^1.0.1, address@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" + integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +algoliasearch-helper@^3.5.5: + version "3.6.2" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.6.2.tgz#45e19b12589cfa0c611b573287f65266ea2cc14a" + integrity sha512-Xx0NOA6k4ySn+R2l3UMSONAaMkyfmrZ3AP1geEMo32MxDJQJesZABZYsldO9fa6FKQxH91afhi4hO1G0Zc2opg== + dependencies: + events "^1.1.1" + +algoliasearch@^4.0.0, algoliasearch@^4.10.5: + version "4.11.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.11.0.tgz#234befb3ac355c094077f0edf3777240b1ee013c" + integrity sha512-IXRj8kAP2WrMmj+eoPqPc6P7Ncq1yZkFiyDrjTBObV1ADNL8Z/KdZ+dWC5MmYcBLAbcB/mMCpak5N/D1UIZvsA== + dependencies: + "@algolia/cache-browser-local-storage" "4.11.0" + "@algolia/cache-common" "4.11.0" + "@algolia/cache-in-memory" "4.11.0" + "@algolia/client-account" "4.11.0" + "@algolia/client-analytics" "4.11.0" + "@algolia/client-common" "4.11.0" + "@algolia/client-personalization" "4.11.0" + "@algolia/client-search" "4.11.0" + "@algolia/logger-common" "4.11.0" + "@algolia/logger-console" "4.11.0" + "@algolia/requester-browser-xhr" "4.11.0" + "@algolia/requester-common" "4.11.0" + "@algolia/requester-node-http" "4.11.0" + "@algolia/transporter" "4.11.0" + +alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.3.5, autoprefixer@^10.3.7: + version "10.4.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.0.tgz#c3577eb32a1079a440ec253e404eaf1eb21388c8" + integrity sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA== + dependencies: + browserslist "^4.17.5" + caniuse-lite "^1.0.30001272" + fraction.js "^4.1.1" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.1.0" + +axios@^0.21.1: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-loader@^8.2.2: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-dynamic-import-node@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-polyfill-corejs2@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f" + integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.4" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz#fa7ca3d1ee9ddc6193600ffb632c9785d54918af" + integrity sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.4" + core-js-compat "^3.18.0" + +babel-plugin-polyfill-regenerator@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d" + integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.2.4" + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base16@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" + integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird@^3.7.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +boxen@^5.0.0, boxen@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.17.6: + version "4.17.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d" + integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw== + dependencies: + caniuse-lite "^1.0.30001274" + electron-to-chromium "^1.3.886" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +buble-jsx-only@^0.19.8: + version "0.19.8" + resolved "https://registry.yarnpkg.com/buble-jsx-only/-/buble-jsx-only-0.19.8.tgz#6e3524aa0f1c523de32496ac9aceb9cc2b493867" + integrity sha512-7AW19pf7PrKFnGTEDzs6u9+JZqQwM1VnLS19OlqYDhXomtFFknnoQJAPHeg84RMFWAvOhYrG7harizJNwUKJsA== + dependencies: + acorn "^6.1.1" + acorn-dynamic-import "^4.0.0" + acorn-jsx "^5.0.1" + chalk "^2.4.2" + magic-string "^0.25.3" + minimist "^1.2.0" + regexpu-core "^4.5.4" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001272, caniuse-lite@^1.0.30001274: + version "1.0.30001277" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001277.tgz#9416dae5e075f47eacd8e0475ae1dcc5a20e9ca5" + integrity sha512-J2WtYj2Pl6LBEG214XmbGw1gzZEsYuinQFPqYtpZDB3/vm49qNlrcbJrTMkHKmdRDdmXYwkG0tgOBJsuI+J12Q== + +ccount@^1.0.0, ccount@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +cheerio@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^3.4.2, chokidar@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" + integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + +clean-css@^5.1.5: + version "5.2.2" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" + integrity sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e" + integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw== + +colorette@^2.0.10: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +combine-promises@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" + integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +consola@^2.15.0: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-text-to-clipboard@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" + integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== + +copy-webpack-plugin@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz#b71d21991599f61a4ee00ba79087b8ba279bbb59" + integrity sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw== + dependencies: + fast-glob "^3.2.5" + glob-parent "^6.0.0" + globby "^11.0.3" + normalize-path "^3.0.0" + p-limit "^3.1.0" + schema-utils "^3.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.18.0, core-js-compat@^3.19.0: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.1.tgz#fe598f1a9bf37310d77c3813968e9f7c7bb99476" + integrity sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g== + dependencies: + browserslist "^4.17.6" + semver "7.0.0" + +core-js-pure@^3.19.0: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.19.1.tgz#edffc1fc7634000a55ba05e95b3f0fe9587a5aa4" + integrity sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ== + +core-js@^3.18.0: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641" + integrity sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-fetch@^3.0.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" + integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== + dependencies: + node-fetch "2.6.1" + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-color-names@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" + integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== + +css-declaration-sorter@^6.0.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" + integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA== + dependencies: + timsort "^0.3.0" + +css-loader@^5.1.1: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== + dependencies: + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.1.1.tgz#27bafa3b75054713565b2266c64b0228acd18634" + integrity sha512-KlB8l5uoNcf9F7i5kXnkxoqJGd2BXH4f0+Lj2vSWSmuvMLYO1kNsJ1KHSzeDW8e45/whgSOPcKVT/3JopkT8dg== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + p-limit "^3.0.2" + postcss "^8.3.5" + schema-utils "^3.1.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-advanced@^5.1.4: + version "5.1.5" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.1.5.tgz#fc6e5738c3249e55658f5bca6c7cc7fe57f2c8a8" + integrity sha512-1u66ijw1aYyxxr9F2nFlBGS3UlzsRHUrGxVYf1CLiYZhvkcuX/+NHkgyO4P9da/j2C2Y2EvMsqk9Nd4VZkZ9jA== + dependencies: + autoprefixer "^10.3.7" + cssnano-preset-default "^5.1.5" + postcss-discard-unused "^5.0.1" + postcss-merge-idents "^5.0.1" + postcss-reduce-idents "^5.0.1" + postcss-zindex "^5.0.1" + +cssnano-preset-default@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.5.tgz#6effb7175ee5d296f95330e137587e27ee974d44" + integrity sha512-fF00UI+d3PWkGfMd62geqmoUe5h+LOhGE2GH4Fqq3beNKdCU1LWwLUyIcu4/A72lWv0737cHey5zhhWw3rW0sA== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^2.0.1" + postcss-calc "^8.0.0" + postcss-colormin "^5.2.1" + postcss-convert-values "^5.0.2" + postcss-discard-comments "^5.0.1" + postcss-discard-duplicates "^5.0.1" + postcss-discard-empty "^5.0.1" + postcss-discard-overridden "^5.0.1" + postcss-merge-longhand "^5.0.2" + postcss-merge-rules "^5.0.2" + postcss-minify-font-values "^5.0.1" + postcss-minify-gradients "^5.0.3" + postcss-minify-params "^5.0.1" + postcss-minify-selectors "^5.1.0" + postcss-normalize-charset "^5.0.1" + postcss-normalize-display-values "^5.0.1" + postcss-normalize-positions "^5.0.1" + postcss-normalize-repeat-style "^5.0.1" + postcss-normalize-string "^5.0.1" + postcss-normalize-timing-functions "^5.0.1" + postcss-normalize-unicode "^5.0.1" + postcss-normalize-url "^5.0.2" + postcss-normalize-whitespace "^5.0.1" + postcss-ordered-values "^5.0.2" + postcss-reduce-initial "^5.0.1" + postcss-reduce-transforms "^5.0.1" + postcss-svgo "^5.0.3" + postcss-unique-selectors "^5.0.1" + +cssnano-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" + integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== + +cssnano@^5.0.6, cssnano@^5.0.8: + version "5.0.9" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.9.tgz#bd03168835c0883c16754085704f57861a32d99c" + integrity sha512-Y4olTKBKsPKl5izpcXHRDiB/1rVdbIDM4qVXgEKBt466kYT42SEEsnCYOQFFXzEkUYV8pJNCII9JKzb8KfDk+g== + dependencies: + cssnano-preset-default "^5.1.5" + is-resolvable "^1.1.0" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^3.0.2: + version "3.0.9" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== + +debug@2.6.9, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +detect-port@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" + integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" + integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== + dependencies: + domelementtype "^1.3.0" + entities "^1.1.1" + +domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== + dependencies: + domelementtype "^2.2.0" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1, domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.1, duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.886: + version "1.3.889" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.889.tgz#0b7c6f7628559592d5406deda281788f37107790" + integrity sha512-suEUoPTD1mExjL9TdmH7cvEiWJVM2oEiAi+Y1p0QKxI2HcRlT44qDTP2c1aZmVwRemIPYOpxmV7CxQCOWcm4XQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +emoticon@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" + integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.2, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eta@^1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1" + integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eval@^0.1.4: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.6.tgz#9620d7d8c85515e97e6b47c5814f46ae381cb3cc" + integrity sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ== + dependencies: + require-like ">= 0.1.1" + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.5: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-url-parser@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== + dependencies: + fbjs "^3.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.1.tgz#70a053d34a96c2b513b559eaea124daed49ace64" + integrity sha512-8+vkGyT4lNDRKHQNPp0yh/6E7FfkLg89XqQbOYnvntRh+8RiSD43yrh9E5ejp1muCizTL4nDVG+y8W4e+LROHg== + dependencies: + cross-fetch "^3.0.4" + fbjs-css-vars "^1.0.0" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.30" + +feed@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" + integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== + dependencies: + xml-js "^1.6.11" + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filesize@^6.1.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" + integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flux@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.2.tgz#d71dcaf6cb51ca059f303f3d964d6f325d444952" + integrity sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ== + dependencies: + fbemitter "^3.0.0" + fbjs "^3.0.0" + +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.14.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" + integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== + +fork-ts-checker-webpack-plugin@^6.0.5: + version "6.4.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.4.0.tgz#057e477cf1d8b013b2ed2669437f818680289c4c" + integrity sha512-3I3wFkc4DbzaUDPWEi96wdYGu4EKtxBafhZYm0o4mX51d9bphAY4P3mBl8K5mFXFJqVzHfmdbm9kLGnm7vwwBg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.1.tgz#ac4e520473dae67012d618aab91eda09bcb400ff" + integrity sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +github-slugger@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" + integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +gzip-size@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" + integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== + dependencies: + duplexer "^0.1.1" + pify "^4.0.1" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz#3089dc0ee2ccf6ec8bc416919b51a54a589e097c" + integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== + dependencies: + ccount "^1.0.3" + hastscript "^5.0.0" + property-information "^5.0.0" + web-namespaces "^1.1.2" + xtend "^4.0.1" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" + integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +history@^4.9.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" + integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== + dependencies: + "@babel/runtime" "^7.1.2" + loose-envify "^1.2.0" + resolve-pathname "^3.0.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + value-equal "^1.0.1" + +hoist-non-react-statics@^3.1.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + +html-minifier-terser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.0.2.tgz#14059ad64b69bf9f8b8a33f25b53411d8321e75d" + integrity sha512-AgYO3UGhMYQx2S/FBJT3EM0ZYcKmH6m9XL9c1v77BeK/tYJxGPxT1/AtsdUi4FcP8kZGmqqnItCcjFPcX9hk6A== + dependencies: + camel-case "^4.1.2" + clean-css "^5.1.5" + commander "^8.1.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.7.2" + +html-tags@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" + integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +html-webpack-plugin@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^3.9.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9" + integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg== + +http-proxy-middleware@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.1.4: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + +immer@^9.0.6: + version "9.0.6" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" + integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== + +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.2.2, import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infima@0.2.0-alpha.34: + version "0.2.0-alpha.34" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.34.tgz#14a900d79a4de2013e025ac95749a4592f16ef6e" + integrity sha512-Na6A2Tl56i1p9dzu7VOAT1Kmu3f5buz63Wvd+D9ZZWL6siQ47L7wkEZUICVKFgc5gERFZVZ/PoPB57Kl++h37Q== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.5, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +internal-ip@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-6.2.0.tgz#d5541e79716e406b74ac6b07b856ef18dc1621c1" + integrity sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg== + dependencies: + default-gateway "^6.0.0" + ipaddr.js "^1.9.1" + is-ip "^3.1.0" + p-event "^4.2.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +ip-regex@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== + +ip@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + +is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jest-worker@^27.0.2, jest-worker@^27.0.6: + version "27.3.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.3.1.tgz#0def7feae5b8042be38479799aeb7b5facac24b2" + integrity sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +joi@^17.4.0, joi@^17.4.2: + version "17.4.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.2.tgz#02f4eb5cf88e515e614830239379dcbbe28ce7f7" + integrity sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.0" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lilconfig@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" + integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + +lodash.curry@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" + integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.flow@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" + integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.4.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= + +lodash.uniq@4.5.0, lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.3: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.1.2, memfs@^3.2.2: + version "3.3.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.3.0.tgz#4da2d1fc40a04b170a56622c7164c6be2c4cbef2" + integrity sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg== + dependencies: + fs-monkey "1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== + +mime-types@2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== + dependencies: + mime-db "~1.33.0" + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== + dependencies: + mime-db "1.50.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.3.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mini-create-react-context@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== + dependencies: + "@babel/runtime" "^7.12.1" + tiny-warning "^1.0.3" + +mini-css-extract-plugin@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz#83172b4fd812f8fc4a09d6f6d16f924f53990ca8" + integrity sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= + +nth-check@^1.0.2, nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.values@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^7.0.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-event@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + +p-timeout@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" + integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== + +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-colormin@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.1.tgz#6e444a806fd3c578827dbad022762df19334414d" + integrity sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.1.0" + +postcss-convert-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz#879b849dc3677c7d6bc94b6a2c1a3f0808798059" + integrity sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-discard-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" + integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== + +postcss-discard-duplicates@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" + integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== + +postcss-discard-empty@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" + integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== + +postcss-discard-overridden@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" + integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== + +postcss-discard-unused@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.0.1.tgz#63e35a74a154912f93d4e75a1e6ff3cc146f934b" + integrity sha512-tD6xR/xyZTwfhKYRw0ylfCY8wbfhrjpKAMnDKRTLMy2fNW5hl0hoV6ap5vo2JdCkuHkP3CHw72beO4Y8pzFdww== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-loader@^6.1.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.0.tgz#714370a3f567141cf4cadcdf9575f5234d186bc5" + integrity sha512-H9hv447QjQJVDbHj3OUdciyAXY3v5+UDduzEytAlZCVHCpNAAg/mCSwhYYqZr9BiGYhmYspU8QXxZwiHTLn3yA== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + semver "^7.3.5" + +postcss-merge-idents@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.0.1.tgz#6b5856fc28f2571f28ecce49effb9b0e64be9437" + integrity sha512-xu8ueVU0RszbI2gKkxR6mluupsOSSLvt8q4gA2fcKFkA+x6SlH3cb4cFHpDvcRCNFbUmCR/VUub+Y6zPOjPx+Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-merge-longhand@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41" + integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw== + dependencies: + css-color-names "^1.0.1" + postcss-value-parser "^4.1.0" + stylehacks "^5.0.1" + +postcss-merge-rules@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a" + integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^2.0.1" + postcss-selector-parser "^6.0.5" + vendors "^1.0.3" + +postcss-minify-font-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" + integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-minify-gradients@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz#f970a11cc71e08e9095e78ec3a6b34b91c19550e" + integrity sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q== + dependencies: + colord "^2.9.1" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-params@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c" + integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw== + dependencies: + alphanum-sort "^1.0.2" + browserslist "^4.16.0" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + uniqs "^2.0.0" + +postcss-minify-selectors@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" + integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" + integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== + +postcss-normalize-display-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" + integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-positions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" + integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-repeat-style@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" + integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-string@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-timing-functions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" + integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-unicode@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" + integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== + dependencies: + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" + +postcss-normalize-url@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763" + integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ== + dependencies: + is-absolute-url "^3.0.3" + normalize-url "^6.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-whitespace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" + integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-ordered-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" + integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-reduce-idents@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.0.1.tgz#99b49ce8ee6f9c179447671cc9693e198e877bb7" + integrity sha512-6Rw8iIVFbqtaZExgWK1rpVgP7DPFRPh0DDFZxJ/ADNqPiH10sPCoq5tgo6kLiTyfh9sxjKYjXdc8udLEcPOezg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-reduce-initial@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946" + integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw== + dependencies: + browserslist "^4.16.0" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" + integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-sort-media-queries@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.1.0.tgz#c2ca1374189259049dc039a9e95ba72a31b57bc7" + integrity sha512-pPiw94cMOqGFSlp4QGzOKrhYr8O3VyMNQnb7qlGM25H4EDEii3iKtIUMoFe5gKiCEAt/Iyk2ah47eoRhGqSBGA== + dependencies: + sort-css-media-queries "2.0.4" + +postcss-svgo@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30" + integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA== + dependencies: + postcss-value-parser "^4.1.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc" + integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + uniqs "^2.0.0" + +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss-zindex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.0.1.tgz#c585724beb69d356af8c7e68847b28d6298ece03" + integrity sha512-nwgtJJys+XmmSGoYCcgkf/VczP8Mp/0OfSv3v0+fw0uABY4yxw+eFs0Xp9nAZHIKnS5j+e9ywQ+RD+ONyvl5pA== + +postcss@^8.2.15, postcss@^8.3.11, postcss@^8.3.5, postcss@^8.3.7: + version "8.3.11" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" + integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^0.6.2" + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-time@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" + integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== + +prism-react-renderer@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz#392460acf63540960e5e3caa699d851264e99b89" + integrity sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg== + +prismjs@^1.23.0: + version "1.25.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" + integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.4.0, prompts@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +pure-color@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" + integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-base16-styling@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" + integrity sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw= + dependencies: + base16 "^1.0.0" + lodash.curry "^4.0.1" + lodash.flow "^3.3.0" + pure-color "^1.2.0" + +react-dev-utils@12.0.0-next.47: + version "12.0.0-next.47" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.0-next.47.tgz#e55c31a05eb30cfd69ca516e8b87d61724e880fb" + integrity sha512-PsE71vP15TZMmp/RZKOJC4fYD5Pvt0+wCoyG3QHclto0d4FyIJI78xGRICOOThZFROqgXYlZP6ddmeybm+jO4w== + dependencies: + "@babel/code-frame" "^7.10.4" + address "^1.1.2" + browserslist "^4.16.5" + chalk "^2.4.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^2.0.0" + filesize "^6.1.0" + find-up "^4.1.0" + fork-ts-checker-webpack-plugin "^6.0.5" + global-modules "^2.0.0" + globby "^11.0.1" + gzip-size "^5.1.1" + immer "^9.0.6" + is-root "^2.1.0" + loader-utils "^2.0.0" + open "^7.0.2" + pkg-up "^3.1.0" + prompts "^2.4.0" + react-error-overlay "7.0.0-next.54+1465357b" + recursive-readdir "^2.2.2" + shell-quote "^1.7.2" + strip-ansi "^6.0.0" + text-table "^0.2.0" + +react-dom@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" + integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react-error-overlay@7.0.0-next.54+1465357b: + version "7.0.0-next.54" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-7.0.0-next.54.tgz#c1eb5ab86aee15e9552e6d97897b08f2bd06d140" + integrity sha512-b96CiTnZahXPDNH9MKplvt5+jD+BkxDw7q5R3jnkUXze/ux1pLv32BBZmlj0OfCUeMqyz4sAmF+0ccJGVMlpXw== + +react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== + +react-fast-compare@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + +react-helmet@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" + integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== + dependencies: + object-assign "^4.1.1" + prop-types "^15.7.2" + react-fast-compare "^3.1.1" + react-side-effect "^2.1.0" + +react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== + dependencies: + flux "^4.0.1" + react-base16-styling "^0.6.0" + react-lifecycles-compat "^3.0.4" + react-textarea-autosize "^8.3.2" + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== + dependencies: + "@babel/runtime" "^7.10.3" + +react-router-config@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" + integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== + dependencies: + "@babel/runtime" "^7.1.2" + +react-router-dom@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" + integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + loose-envify "^1.3.1" + prop-types "^15.6.2" + react-router "5.2.1" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-router@5.2.1, react-router@^5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" + integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== + dependencies: + "@babel/runtime" "^7.12.13" + history "^4.9.0" + hoist-non-react-statics "^3.1.0" + loose-envify "^1.3.1" + mini-create-react-context "^0.4.0" + path-to-regexp "^1.7.0" + prop-types "^15.6.2" + react-is "^16.6.0" + tiny-invariant "^1.0.2" + tiny-warning "^1.0.0" + +react-side-effect@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz#66c5701c3e7560ab4822a4ee2742dee215d72eb3" + integrity sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ== + +react-textarea-autosize@^8.3.2: + version "8.3.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz#f70913945369da453fd554c168f6baacd1fa04d8" + integrity sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ== + dependencies: + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.0.0" + use-latest "^1.0.0" + +react@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + 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" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" + integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== + dependencies: + minimatch "3.0.4" + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.5.4, regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + +rehype-parse@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz#aeb3fdd68085f9f796f1d3137ae2b85a98406964" + integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== + dependencies: + hast-util-from-parse5 "^5.0.0" + parse5 "^5.0.0" + xtend "^4.0.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remark-admonitions@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz#87caa1a442aa7b4c0cafa04798ed58a342307870" + integrity sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow== + dependencies: + rehype-parse "^6.0.2" + unified "^8.4.2" + unist-util-visit "^2.0.1" + +remark-emoji@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== + dependencies: + emoticon "^3.2.0" + node-emoji "^1.10.0" + unist-util-visit "^2.0.3" + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx-remove-exports@^1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx-remove-exports/-/remark-mdx-remove-exports-1.6.22.tgz#9e34f3d02c9c54b02ca0a1fde946449338d06ecb" + integrity sha512-7g2uiTmTGfz5QyVb+toeX25frbk1Y6yd03RXGPtqx0+DVh86Gb7MkNYbk7H2X27zdZ3CQv1W/JqlFO0Oo8IxVA== + dependencies: + unist-util-remove "2.0.0" + +remark-mdx-remove-imports@^1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx-remove-imports/-/remark-mdx-remove-imports-1.6.22.tgz#79f711c95359cff437a120d1fbdc1326ec455826" + integrity sha512-lmjAXD8Ltw0TsvBzb45S+Dxx7LTJAtDaMneMAv8LAUIPEyYoKkmGbmVsiF0/pY6mhM1Q16swCmu1TN+ie/vn/A== + dependencies: + unist-util-remove "2.0.0" + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +"require-like@>= 0.1.1": + version "0.1.2" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" + integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-pathname@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" + integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== + +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== + +rtlcss@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@^7.1.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" + integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== + dependencies: + tslib "~2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.11: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@^5.4.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-handler@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" + integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== + dependencies: + bytes "3.0.0" + content-disposition "0.5.2" + fast-url-parser "1.1.3" + mime-types "2.1.18" + minimatch "3.0.4" + path-is-inside "1.0.2" + path-to-regexp "2.2.1" + range-parser "1.2.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + +shelljs@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== + +sirv@^1.0.7: + version "1.0.18" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.18.tgz#105fab52fb656ce8a2bebbf36b11052005952899" + integrity sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA== + dependencies: + "@polka/url" "^1.0.0-next.20" + mime "^2.3.1" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.0.0.tgz#022bef4df8cba42e38e1fe77039f234cab0372b6" + integrity sha512-Ud0jrRQO2k7fEtPAM+cQkBKoMvxQyPKNXKDLn8tRVHxRCsdDQ2JZvw+aZ5IRYYQVAV9iGxEar6boTwZzev+x3g== + dependencies: + "@types/node" "^15.0.1" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sockjs@^0.3.21: + version "0.3.21" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" + integrity sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw== + dependencies: + faye-websocket "^0.11.3" + uuid "^3.4.0" + websocket-driver "^0.7.4" + +sort-css-media-queries@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz#b2badfa519cb4a938acbc6d3aaa913d4949dc908" + integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" + integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== + +source-map-support@~0.5.20: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +std-env@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.3.1.tgz#d42271908819c243f8defc77a140fc1fcee336a1" + integrity sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g== + dependencies: + ci-info "^3.1.1" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +stylehacks@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" + integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== + dependencies: + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz#ad1be7639b1cbe3ea49fab995cbe7224b31747a1" + integrity sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA== + dependencies: + jest-worker "^27.0.6" + p-limit "^3.1.0" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.7.2: + version "5.9.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" + integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + +tiny-warning@^1.0.0, tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-essentials@^2.0.3: + version "2.0.12" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745" + integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w== + +tslib@^2.0.3, tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +ua-parser-js@^0.7.30: + version "0.7.31" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" + integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +unified@^8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" + integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.0.0.tgz#32c2ad5578802f2ca62ab808173d505b2c898488" + integrity sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g== + dependencies: + unist-util-is "^4.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.2, unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-composed-ref@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz#9220e4e94a97b7b02d7d27eaeab0b37034438bbc" + integrity sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg== + dependencies: + ts-essentials "^2.0.3" + +use-isomorphic-layout-effect@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz#7bb6589170cd2987a152042f9084f9effb75c225" + integrity sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ== + +use-latest@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" + integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw== + dependencies: + use-isomorphic-layout-effect "^1.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +value-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" + integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +wait-on@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.0.tgz#7e9bf8e3d7fe2daecbb7a570ac8ca41e9311c7e7" + integrity sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw== + dependencies: + axios "^0.21.1" + joi "^17.4.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.1.0" + +watchpack@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" + integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-namespaces@^1.0.0, web-namespaces@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webpack-bundle-analyzer@^4.4.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-dev-middleware@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz#97c948144349177856a3d2d9c612cc3fee180cf1" + integrity sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ== + dependencies: + colorette "^2.0.10" + memfs "^3.2.2" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^3.1.0" + +webpack-dev-server@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.4.0.tgz#10ec17088f840c9ccb2ebb0b43c49ec293206f7e" + integrity sha512-+S0XRIbsopVjPFjCO8I07FXYBWYqkFmuP56ucGMTs2hA/gV4q2M9xTmNo5Tg4o8ffRR+Nm3AsXnQXxKRyYovrA== + dependencies: + ansi-html-community "^0.0.8" + bonjour "^3.5.0" + chokidar "^3.5.2" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + internal-ip "^6.2.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^3.1.0" + selfsigned "^1.10.11" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + url "^0.11.0" + webpack-dev-middleware "^5.2.1" + ws "^8.1.0" + +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^1.1.0, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.1.tgz#251a7d9720d75ada1469ca07dbb62f3641a05b6d" + integrity sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA== + +webpack@^5.61.0: + version "5.61.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.61.0.tgz#fa827f0ee9bdfd141dd73c3e891e955ebd52fe7f" + integrity sha512-fPdTuaYZ/GMGFm4WrPi2KRCqS1vDp773kj9S0iI5Uc//5cszsFEDgHNaX4Rj1vobUiU1dFIV3mA9k1eHeluFpw== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.4" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.2.0" + webpack-sources "^3.2.0" + +webpackbar@^5.0.0-3: + version "5.0.0-3" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.0-3.tgz#f4f96c8fb13001b2bb1348252db4c980ab93aaac" + integrity sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.1.0" + consola "^2.15.0" + figures "^3.2.0" + pretty-time "^1.1.0" + std-env "^2.2.1" + text-table "^0.2.0" + wrap-ansi "^7.0.0" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.3.1: + version "7.5.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== + +ws@^8.1.0: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + +xtend@^4.0.0, xtend@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==