diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
deleted file mode 100644
index e7d607ed..00000000
--- a/.github/workflows/docker-build.yml
+++ /dev/null
@@ -1,67 +0,0 @@
-name: ci
-
-on:
- push:
- tags:
- - "v*.*.*"
-
-jobs:
- docker:
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- include:
- - context: ./ui
- image: lihebi/codepod-ui
- - context: ./api
- image: lihebi/codepod-api
- - context: ./proxy
- image: lihebi/codepod-proxy
- - context: ./runtime/kernel
- image: lihebi/codepod-kernel-python
- - context: ./runtime
- image: lihebi/codepod-runtime
- - context: ./
- image: lihebi/codepod-dev
- steps:
- - name: Checkout
- uses: actions/checkout@v3
- -
- name: Docker meta
- id: meta
- uses: docker/metadata-action@v4
- with:
- # list of Docker images to use as base name for tags
- images: |
- ${{ matrix.image }}
- # generate Docker tags based on the following events/attributes
- tags: |
- type=schedule
- type=ref,event=branch
- type=ref,event=pr
- type=semver,pattern={{version}}
- type=semver,pattern={{major}}.{{minor}}
- type=semver,pattern={{major}}
- type=sha
- type=raw,value=latest,enable=true
- -
- name: Set up QEMU
- uses: docker/setup-qemu-action@v2
- -
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
- -
- name: Login to Docker Hub
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- - name: Build and push
- uses: docker/build-push-action@v3
- with:
- context: ${{ matrix.context }}
- push: true
- tags: ${{ steps.meta.outputs.tags }}
- labels: ${{ steps.meta.outputs.labels }}
diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
deleted file mode 100644
index 1c752054..00000000
--- a/.github/workflows/node.js.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-# This workflow will do a clean install of node dependencies, cache/restore them, 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:
- workflow_dispatch:
-# push:
-# branches: [ main ]
-# pull_request:
-# branches: [ main ]
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- strategy:
- matrix:
- node-version: [12.x, 14.x, 16.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 }}
- cache: "npm"
- - run: npm run build:all
diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml
new file mode 100644
index 00000000..11fd1491
--- /dev/null
+++ b/.github/workflows/publish.yaml
@@ -0,0 +1,38 @@
+name: Build and Publish
+
+on: workflow_dispatch
+
+jobs:
+ build-and-publish:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: "20.x" # Change this to your desired Node.js version
+ registry-url: "https://registry.npmjs.org"
+
+ - name: Install pnpm
+ run: npm install -g pnpm
+
+ - name: Build UI
+ working-directory: ui
+ run: |
+ pnpm install
+ pnpm build
+
+ - name: Build API
+ working-directory: api
+ run: |
+ pnpm install
+ pnpm build
+
+ - name: Publish to npm
+ working-directory: api
+ run: npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # NPM_TOKEN is a GitHub secret containing your npm token
diff --git a/.gitignore b/.gitignore
index 8217f4fb..18d1e427 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,10 +25,12 @@ npm-debug.log*
yarn-debug.log*
yarn-error.log*
+.pnpm-store
+
src/tailwind.output.css
.eslintcache
*-checkpoint*
-back/
\ No newline at end of file
+back/
diff --git a/BUILD.md b/BUILD.md
new file mode 100644
index 00000000..7bd60a5d
--- /dev/null
+++ b/BUILD.md
@@ -0,0 +1,63 @@
+# Building CodePod
+
+First build the UI:
+
+```
+cd ui
+pnpm bulid
+```
+
+This will generate the frontend html/js files into `api/public` folder. Then build the app in `api/` folder:
+
+```
+cd api
+pnpm build
+```
+
+This will generate `api/build/cli.js`. This is the binary executable. You can
+install and test the app locally:
+
+```
+cd api
+npm install -g .
+```
+
+Now the `codepod` command is available. Test:
+
+```
+> which codepod
+# /opt/homebrew/bin/codepod
+> npm list --global
+# /opt/homebrew/lib
+# ├── codepod@0.0.4 -> ./../../../Users/xxx/git/codepod/api
+> codepod /path/to/repo
+# ... 🚀 Server ready at http://localhost:4001
+```
+
+Remove the globally installed local package:
+
+```
+npm remove -g codepod
+```
+
+Now it's ready to publish. We will first publish to npm registry. First login to
+npm-cli, upgrade the version in `api/package.json` then:
+
+```
+npm publish
+```
+
+Now it is in npm at https://www.npmjs.com/package/codepod. Install it from npm:
+
+```
+# option 1: install
+npm install -g codepod
+codepod /path/to/repo
+
+# option 2: run with npx without install
+npx codepod /path/to/repo
+```
+
+# Publish using GitHub CI
+
+The CI is triggered by v*.*.\* tags. Update the version in `api/package.json`, then push a new tag to trigger the CI.
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 585e054a..00000000
--- a/Dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-FROM node:18
-
-WORKDIR /app
-COPY . .
-
-WORKDIR /app/api
-RUN yarn install --frozen-lockfile
-WORKDIR /app/proxy
-RUN yarn install --frozen-lockfile
-WORKDIR /app/runtime
-RUN yarn install --frozen-lockfile
-WORKDIR /app/ui
-RUN yarn install --frozen-lockfile
-
-WORKDIR /app/
-
-CMD ["tail", "-f", "/dev/null"]
diff --git a/README.md b/README.md
index 67a314dc..e2b5b919 100644
--- a/README.md
+++ b/README.md
@@ -3,109 +3,89 @@
Codepod provides the interactive coding experience popularized by Jupyter, but
with scalability and production-readiness. Users can still incrementally build
up code by trying out a small code snippet each time. But they would not be
-overwhelmed by the great number of code snippets as the projects grow.
-
-
+overwhelmed by the great number of code snippets as the projects grow. Learn
+more on our website at https://codepod.io.

-# Contributing
+# Install
-CodePod is open source under MIT license. Feel free to contribute! We can make
-it better together. You can contribute by opening an issue, discussion, or
-submitting a pull request. Do use [Prettier](https://prettier.io/) (e.g., [its
-VSCode
-plugin](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode))
-to format your code before checking in.
+You can [use CodePod online](https://app.codepod.io) without installing it
+locally. To install it on your computer:
-# Citation
-
-https://arxiv.org/abs/2301.02410
+Step 1: install prerequisite: [nodejs](https://nodejs.org/en/download) runtime
+and python & ipykernel:
```
-@misc{https://doi.org/10.48550/arxiv.2301.02410,
- doi = {10.48550/ARXIV.2301.02410},
- url = {https://arxiv.org/abs/2301.02410},
- author = {Li, Hebi and Bao, Forrest Sheng and Xiao, Qi and Tian, Jin},
- title = {Codepod: A Namespace-Aware, Hierarchical Jupyter for Interactive Development at Scale},
- publisher = {arXiv},
- year = {2023},
- copyright = {Creative Commons Attribution 4.0 International}
-}
+brew install node # example for MacOS
+pip3 install ipykernel
```
-# Developing CodePod using docker-compose
-
-The docker compose files are in `compose/dev` folder. The `dev` stack mounts the
-`src` folder, so that you can edit the files on your local computer, and let the
-node.js process inside the container do the compiling and hot-reloading.
+Step 2: Install codepod CLI app from [npm registry](https://www.npmjs.com/package/codepod):
-To install docker-compose, follow the official [Docker documentation](https://docs.docker.com/compose/install/linux/).
-
-## .env file
-
-First, create a `dev/.env` file with the following content (leave as is or change the value to
-whatever you want).
-
-```properties
-POSTGRES_USER=myusername
-POSTGRES_PASSWORD=mypassword
-POSTGRES_DB=mydbname
-JWT_SECRET=mysupersecretjwttoken
+```
+> npm install -g codepod
+> codepod --version
+# 0.0.7
+```
-GOOGLE_CLIENT_ID=
+Step 3: launch CodePod from terminal:
-EXPORT_AWS_S3_REGION=us-west-1
-EXPORT_AWS_S3_BUCKET=
-EXPORT_AWS_S3_ACCESS_KEY_ID=
-EXPORT_AWS_S3_SECRET_ACCESS_KEY=
+```
+> codepod /path/to/local/repo
+# ... 🚀 Server ready at http://localhost:4001
```
-Optional:
-
-- Leave the `GOOGLE_CLIENT_ID` empty if you do not need the OAuth provided by Google.
-- `EXPORT_AWS_S3_XXX` are used for file export. You could leave it empty if you don't use it.
+Open this URL in your browser to see the app. The files will be saved to the
+directory `/path/to/repo/codepod.bin|json`. The `codepod.bin` is the source of
+truth, and `codepod.json` is for human-readability only.
-## Start the stack
+In the future, you can update the app:
-```bash
-cd dev
-docker compose up -d
+```
+> npm update -g codepod
```
-You need to initialized the database first before starting the stack. See below.
-
-Wait a few minutes for the package installation and compilation. Once the `ui` and
-`api` containers are ready, go to `http://localhost:80` to see the app.
+# Develop
-- `http://localhost:80/graphql`: Apollo GraphQL explorer for the backend APIs
-- `http://prisma.127.0.0.1.sslip.io`: Prisma Studio for viewing and debugging the database.
+Open two terminals. On one:
-## Initialize the database
+```
+cd apps/api
+pnpm dev
+```
-If this is your first time running it, you would need to initialize the database as it's empty. To do that, open a shell into the API container and run:
+On the other:
-```bash
-npx prisma migrate dev
+```
+cd apps/ui
+pnpm dev
```
-This command is also needed after the database schema is changed. The protocol is:
+Now go to `http://localhost:3000` to see the app.
-- One developer changed [the schema](./api/prisma/schema.prisma). He will run
- `npx prisma migrate dev --name add_a_new_field`. This will generate a
- migration, e.g. [this
- migration](./api/prisma/migrations/20221206194247_add_google_login/migration.sql).
- The schema change along with this migration need to be checked in to git.
-- Another developer pulls the change, then running the `npx prisma migrate dev` (in the api container's shell) to apply the schema change.
+# Contributing
-## Auto-completion & Linting
+CodePod is open-source under an MIT license. Feel free to contribute to make
+it better together with us. You can contribute by [creating awesome showcases](#gallery),
+[reporting a bug, suggesting a feature](https://github.com/codepod-io/codepod/issues),
+or submitting a pull request.
+Do use [Prettier](https://prettier.io/) (e.g., [its VSCode
+plugin](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode))
+to format your code before checking in.
-Although we developed this project using docker, we still want features like auto-completion and linting while coding. For that to work, you need to install the all the relevant node packages, i.e.
+# Citation
-```bash
-# api, proxy, runtime, ui
-cd ./api/
+https://arxiv.org/abs/2301.02410
-# Run 'npm install' instead if you are using npm
-yarn
+```
+@misc{https://doi.org/10.48550/arxiv.2301.02410,
+ doi = {10.48550/ARXIV.2301.02410},
+ url = {https://arxiv.org/abs/2301.02410},
+ author = {Li, Hebi and Bao, Forrest Sheng and Xiao, Qi and Tian, Jin},
+ title = {Codepod: A Namespace-Aware, Hierarchical Jupyter for Interactive Development at Scale},
+ publisher = {arXiv},
+ year = {2023},
+ copyright = {Creative Commons Attribution 4.0 International}
+}
```
diff --git a/analysis/README.md b/analysis/README.md
deleted file mode 100644
index 76f1abdf..00000000
--- a/analysis/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# Analyzing open source projects on GitHub
diff --git a/analysis/main.ipynb b/analysis/main.ipynb
deleted file mode 100644
index 63f597f4..00000000
--- a/analysis/main.ipynb
+++ /dev/null
@@ -1,2405 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "a5ee3ddc-6071-4227-9a56-8cba1c2e6479",
- "metadata": {
- "tags": []
- },
- "source": [
- "# the size of the projects"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "id": "8f9ec9f9-a8f5-4c4f-aa2e-5553101092e4",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "572K\tracket/lsh\n",
- "1.2M\tracket/polyglot\n",
- "1.9M\tracket/racket-rash\n",
- "5.1M\tracket/video\n",
- "11M\tracket/pollen\n",
- "14M\tracket/redex\n",
- "14M\tracket/scribble\n",
- "16M\tracket/fructure\n",
- "21M\tracket/typed-racket\n",
- "22M\tracket/drracket\n",
- "22M\tracket/quad\n",
- "81M\tracket/herbie\n"
- ]
- }
- ],
- "source": [
- "!du -sh racket/* | sort -h"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "ce56c095-9875-4a5d-8cbd-8b1732d7e840",
- "metadata": {},
- "source": [
- "## Racket\n",
- "\n",
- "- lsh is a single file repo"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "id": "7a6c5db4-68b8-4150-8dbc-3cb50d9ad708",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "3.5M\tc/the_silver_searcher\n",
- "21M\tc/tmux\n",
- "39M\tc/rufus\n",
- "49M\tc/wrk\n",
- "68M\tc/nginx\n",
- "107M\tc/curl\n",
- "109M\tc/netdata\n",
- "113M\tc/redis\n",
- "229M\tc/git\n",
- "370M\tc/FFmpeg\n",
- "400M\tc/openssl\n",
- "648M\tc/php-src\n",
- "4.7G\tc/linux\n"
- ]
- }
- ],
- "source": [
- "!du -sh c/* | sort -h"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "id": "a713ac87-17cc-494f-807a-d6a103d1d5a5",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "580K\tjulia/ProgressMeter.jl\n",
- "2.1M\tjulia/JuliaDB.jl\n",
- "2.2M\tjulia/IJulia.jl\n",
- "5.0M\tjulia/HTTP.jl\n",
- "13M\tjulia/Flux.jl\n",
- "13M\tjulia/LightGraphs.jl\n",
- "14M\tjulia/Pluto.jl\n",
- "16M\tjulia/Yao.jl\n",
- "30M\tjulia/Pkg.jl\n",
- "41M\tjulia/Documenter.jl\n",
- "77M\tjulia/JuMP.jl\n",
- "88M\tjulia/Turing.jl\n",
- "175M\tjulia/DifferentialEquations.jl\n"
- ]
- }
- ],
- "source": [
- "!du -sh julia/* | sort -h"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "id": "935a80a2-1903-407b-941e-a1fdf92406f7",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2.2M\tjs/gulp\n",
- "3.5M\tjs/request\n",
- "4.0M\tjs/koa\n",
- "4.3M\tjs/json-server\n",
- "4.6M\tjs/axios\n",
- "8.2M\tjs/marked\n",
- "24M\tjs/reveal.js\n",
- "37M\tjs/vue\n",
- "56M\tjs/anime\n",
- "65M\tjs/plyr\n",
- "199M\tjs/react\n",
- "227M\tjs/yarn\n",
- "354M\tjs/atom\n",
- "392M\tjs/phaser\n",
- "731M\tjs/drawio\n"
- ]
- }
- ],
- "source": [
- "!du -sh js/* | sort -h"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "id": "53f39534-5362-463a-951e-d48df7fb418f",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "4.7M\tpython/you-get\n",
- "4.9M\tpython/cookiecutter\n",
- "9.9M\tpython/locust\n",
- "19M\tpython/requests\n",
- "29M\tpython/scrapy\n",
- "36M\tpython/keras\n",
- "74M\tpython/youtube-dl\n",
- "103M\tpython/transformers\n",
- "114M\tpython/dash\n",
- "153M\tpython/scikit-learn\n",
- "254M\tpython/ansible\n",
- "284M\tpython/django\n",
- "386M\tpython/core\n"
- ]
- }
- ],
- "source": [
- "!du -sh python/* | sort -h"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "8114360a-81b3-433b-9346-be5028ff0ccd",
- "metadata": {
- "tags": []
- },
- "source": [
- "# selected projects and src folders"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 51,
- "id": "08005e43-fe25-4031-844a-417b455c2716",
- "metadata": {},
- "outputs": [],
- "source": [
- "racket_srcs = [\"lsh\", \"polyglot/polyglot-lib/polyglot\", \"racket-rash/rash\", \"video/video\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 52,
- "id": "d42e36ae-756a-448c-8e83-0f3f29e6b055",
- "metadata": {},
- "outputs": [],
- "source": [
- "c_srcs = [\"the_silver_searcher/src\", \"tmux\", \"rufus/src\", \"wrk/src\", \"curl/src\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 53,
- "id": "a1cad9c8-42b0-4754-b813-65d95e835a8d",
- "metadata": {},
- "outputs": [],
- "source": [
- "julia_srcs = [\"JuliaDB.jl/src\", \"HTTP.jl/src\", \"Flux.jl/src\", \"LightGraphs.jl/src\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 54,
- "id": "7ebe6ae9-d0af-463c-9793-e71500b272ef",
- "metadata": {},
- "outputs": [],
- "source": [
- "# gulp has no source code\n",
- "# request has index.js and request.js at top level\n",
- "js_srcs = [\"request/lib\", \"koa/lib\", \"json-server/src\", \"axios/lib\", \"marked/src\", \"reveal.js/js\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 55,
- "id": "ba96cd9b-fd86-43a5-897d-1dc55b4f2ecc",
- "metadata": {},
- "outputs": [],
- "source": [
- "py_srcs = [\"you-get/src/you_get\", \"cookiecutter/cookiecutter\", \n",
- " \"locust/locust\", \"requests/requests\", \n",
- "# \"keras/keras\", \n",
- "# \"youtube-dl/youtube_dl\"\n",
- " ]"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "699eaffb-39c3-4106-855f-3e3c0918cebc",
- "metadata": {},
- "source": [
- "# Parsing"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "b701ea7c-1138-4eb1-8fba-544890ad6775",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "False"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from tree_sitter import Language, Parser\n",
- "\n",
- "Language.build_library(\n",
- " # Store the library in the `build` directory\n",
- " 'build/my-languages.so',\n",
- "\n",
- " # Include one or more languages\n",
- " [\n",
- " 'vendor/tree-sitter-python',\n",
- " 'vendor/tree-sitter-julia',\n",
- " 'vendor/tree-sitter-c/',\n",
- " 'vendor/tree-sitter-javascript/'\n",
- " ]\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "4253ca3e-822c-46a9-8cb0-2855814d1957",
- "metadata": {},
- "outputs": [],
- "source": [
- "PY_LANGUAGE = Language('build/my-languages.so', 'python')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "id": "db9bebb1-c9aa-4d65-9403-b50ce876b101",
- "metadata": {},
- "outputs": [],
- "source": [
- "C_LANGUAGE = Language('build/my-languages.so', 'c')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "id": "38980802-59b2-43cb-a190-1f88d1904f9d",
- "metadata": {},
- "outputs": [],
- "source": [
- "JL_LANGUAGE = Language('build/my-languages.so', 'julia')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "id": "c0e93f22-c252-40fb-a8ed-613c658d19da",
- "metadata": {},
- "outputs": [],
- "source": [
- "JS_LANGUAGE = Language('build/my-languages.so', 'javascript')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "id": "e7c54265-9b5c-408a-817c-a74ba408a9d2",
- "metadata": {},
- "outputs": [],
- "source": [
- "parser = Parser()\n",
- "parser.set_language(PY_LANGUAGE)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "id": "6ebfd5ca-88c4-421d-b0b4-813781c08947",
- "metadata": {},
- "outputs": [],
- "source": [
- "parser.set_language(JL_LANGUAGE)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "4eac74b8-a314-491f-b3ea-587a3475574d",
- "metadata": {},
- "source": [
- "# The functions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "21eb6beb-e3a5-473a-9cde-22640234818d",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "id": "dae7fc59-780b-4311-ac29-3c9282678a8f",
- "metadata": {},
- "outputs": [],
- "source": [
- "import matplotlib.pyplot as plt"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "id": "f496c2b9-878a-4403-a5a7-1db1ecff1ae2",
- "metadata": {},
- "outputs": [],
- "source": [
- "from collections import defaultdict"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "id": "dc928cc8-1988-422e-a3df-ea9ecb0c6a8f",
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "id": "08d4bf46-b64b-4a6b-a65c-482b53cdef08",
- "metadata": {},
- "outputs": [],
- "source": [
- "import os"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 56,
- "id": "4af696c5-0d18-4836-b8d7-f661eed441fa",
- "metadata": {},
- "outputs": [],
- "source": [
- "def get_top_functions(tree):\n",
- " root = tree.root_node\n",
- " functions = [node for node in root.children if node.type == \"function_definition\"]\n",
- " return functions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 57,
- "id": "6a00a131-480f-4825-956d-9e616bed7616",
- "metadata": {},
- "outputs": [],
- "source": [
- "def get_top_classes(tree):\n",
- " root = tree.root_node\n",
- " return [node for node in root.children if node.type == \"class_definition\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 58,
- "id": "ddefd14c-81f9-4f3f-887d-067bfa2cc925",
- "metadata": {},
- "outputs": [],
- "source": [
- "def node2str(thebytes, node):\n",
- " return thebytes[node.start_byte:node.end_byte].decode('utf8')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 59,
- "id": "18221ca7-922c-484f-9ab3-7aedb0742d16",
- "metadata": {},
- "outputs": [],
- "source": [
- "call_query_py = PY_LANGUAGE.query(\"\"\"\n",
- "(call\n",
- " function: [\n",
- " (identifier) @function.call\n",
- " (attribute attribute: (identifier) @function.call)\n",
- " ])\n",
- "\"\"\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 60,
- "id": "ef8e3c54-7ceb-41a5-baf2-b10116d60aca",
- "metadata": {},
- "outputs": [],
- "source": [
- "call_query_julia = JL_LANGUAGE.query(\"\"\"\n",
- "(call_expression\n",
- " (identifier) @function.call)\n",
- "\"\"\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "ec8b4e09-2525-414b-a135-56e344eecb97",
- "metadata": {},
- "outputs": [],
- "source": [
- "call_query_julia = JL_LANGUAGE.query(\"\"\"\n",
- "(call_expression\n",
- " (identifier) @function.call)\n",
- "\"\"\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 61,
- "id": "4d507bef-034e-4076-8f15-2e2ef2bddf1c",
- "metadata": {},
- "outputs": [],
- "source": [
- "def get_callnodes(node, query):\n",
- " return [x[0] for x in query.captures(node)]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "id": "e58aa853-7d8a-406a-b08c-efef9031d078",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "call_query2 = PY_LANGUAGE.query(\"\"\"\n",
- "(call\n",
- " function:\n",
- " (attribute attribute: (identifier) @function.call))\n",
- "\"\"\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "id": "352875b1-fcc2-40d2-b568-836d806fef7d",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "def get_callnodes2(node):\n",
- " return [x[0] for x in call_query2.captures(node)]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "id": "71bdb678-5b5d-4c0b-9850-2eaed36f03c0",
- "metadata": {},
- "outputs": [],
- "source": [
- "with open('julia/JuliaDB.jl/src/dcolumns.jl','rb') as fp:\n",
- " thebytes = fp.read()\n",
- " tree = parser.parse(thebytes)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "id": "0041e696-c490-4231-a7fd-d4495d7ba4d3",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[,\n",
- " ,\n",
- " ,\n",
- " ,\n",
- " ,\n",
- " ,\n",
- " ]"
- ]
- },
- "execution_count": 33,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "functions = [node for node in tree.root_node.children if node.type == \"function_definition\"]\n",
- "functions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "f5a6a4d1-5949-4195-90de-ac5cc24fc8c0",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": 69,
- "id": "0972beb4-4e13-49ec-93f0-41177b8dd191",
- "metadata": {},
- "outputs": [],
- "source": [
- "def parse_julia(thebytes):\n",
- " parser.set_language(JL_LANGUAGE)\n",
- " tree = parser.parse(thebytes)\n",
- " dcall = defaultdict(set)\n",
- " dcopy = defaultdict(int)\n",
- " dloc = defaultdict(int)\n",
- " for f in get_top_functions(tree):\n",
- " # print(f.sexp())\n",
- " funcname = node2str(thebytes, f.child_by_field_name('name'))\n",
- " dcopy[funcname] += 1\n",
- " dloc[funcname] += f.end_point[0] - f.start_point[0] + 1\n",
- " # calls inside this function\n",
- " for call in get_callnodes(f, call_query_julia):\n",
- " dcall[funcname].add(node2str(thebytes, call))\n",
- " return dcall, dcopy, dloc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "d8dfe3d3-bba6-41fa-9d99-0159da3aedf8",
- "metadata": {},
- "outputs": [],
- "source": [
- "def parse_js(thebytes):\n",
- " parser.set_language(JL_LANGUAGE)\n",
- " tree = parser.parse(thebytes)\n",
- " dcall = defaultdict(set)\n",
- " dcopy = defaultdict(int)\n",
- " dloc = defaultdict(int)\n",
- " for f in get_top_functions(tree):\n",
- " # print(f.sexp())\n",
- " funcname = node2str(thebytes, f.child_by_field_name('name'))\n",
- " dcopy[funcname] += 1\n",
- " dloc[funcname] += f.end_point[0] - f.start_point[0] + 1\n",
- " # calls inside this function\n",
- " for call in get_callnodes(f, call_query_julia):\n",
- " dcall[funcname].add(node2str(thebytes, call))\n",
- " return dcall, dcopy, dloc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 63,
- "id": "ec229d61-b9c8-456b-82df-c738e5244811",
- "metadata": {},
- "outputs": [],
- "source": [
- "def parse_python(thebytes):\n",
- " parser.set_language(PY_LANGUAGE)\n",
- " tree = parser.parse(thebytes)\n",
- " dcall = defaultdict(set)\n",
- " dcopy = defaultdict(int)\n",
- " dloc = defaultdict(int)\n",
- " for f in get_top_functions(tree):\n",
- " # print(f.sexp())\n",
- " funcname = node2str(thebytes, f.child_by_field_name('name'))\n",
- " dcopy[funcname] += 1\n",
- " dloc[funcname] += f.end_point[0] - f.start_point[0] + 1\n",
- " # calls inside this function\n",
- " for call in get_callnodes(f, call_query_py):\n",
- " dcall[funcname].add(node2str(thebytes, call))\n",
- " # class\n",
- " for c in get_top_classes(tree):\n",
- " clsname = node2str(thebytes, c.child_by_field_name('name'))\n",
- " methods = [node for node in c.child_by_field_name('body').children\n",
- " if node.type == \"function_definition\"]\n",
- " for m in methods:\n",
- " mname = node2str(thebytes, m.child_by_field_name('name'))\n",
- " dcopy[mname] += 1\n",
- " dloc[mname] += m.end_point[0] - m.start_point[0] + 1\n",
- " for call in get_callnodes(m, call_query_py):\n",
- " dcall[mname].add(node2str(thebytes, call))\n",
- " return dcall, dcopy, dloc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 64,
- "id": "724de335-2ca5-4e8d-85eb-580cdfc94e19",
- "metadata": {},
- "outputs": [],
- "source": [
- "def file2cg(fname):\n",
- " with open(fname, 'rb') as fp:\n",
- " if fname.endswith('.py'):\n",
- " return parse_python(fp.read())\n",
- " elif fname.endswith('.jl'):\n",
- " return parse_julia(fp.read())\n",
- " else:\n",
- " raise"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 77,
- "id": "8385d51c-c844-478a-b293-e6ed10d4f546",
- "metadata": {},
- "outputs": [],
- "source": [
- "def dir2cg(dirname, ext):\n",
- " res = {}\n",
- " dcall = defaultdict(set)\n",
- " dcopy = defaultdict(int)\n",
- " dloc = defaultdict(int)\n",
- " dfile2funcct = defaultdict(int)\n",
- " internal = 0\n",
- " for root,dirs,files in os.walk(dirname):\n",
- " for f in files:\n",
- " fname = os.path.join(root, f)\n",
- " if fname.endswith('.'+ext):\n",
- " tmp_dcall,tmp_dcopy, tmp_dloc = file2cg(os.path.join(root, f))\n",
- " # compute number of internal functions,\n",
- " # defined by called by other functions in the same file\n",
- " called = set()\n",
- " for k in tmp_dcall:\n",
- " called.update(tmp_dcall[k])\n",
- "# print('---', fname)\n",
- "# print('internal functions:', len(set(tmp_dcall.keys()).intersection(called)))\n",
- "# print('external functiosn:', len(set(tmp_dcall.keys()).difference(called)))\n",
- "# print('total functions:', len(tmp_dcall))\n",
- " internal += len(set(tmp_dcall.keys()).intersection(called))\n",
- " dfile2funcct[fname] += len(tmp_dcall)\n",
- " for k in tmp_dcall:\n",
- " dcall[k].update(tmp_dcall[k])\n",
- " dcopy[k] += tmp_dcopy[k]\n",
- " dloc[k] += tmp_dloc[k]\n",
- " return dcall, dcopy, dloc, dfile2funcct, internal"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 66,
- "id": "f16d79c0-1109-42ed-af80-d477f4c3b472",
- "metadata": {},
- "outputs": [],
- "source": [
- "def dirstats(dirname, ext):\n",
- " ndirs = 0\n",
- " nfiles = 0\n",
- " loc = 0\n",
- " for root,dirs,files in os.walk(dirname):\n",
- " # FIXME the dir might not contain py files?\n",
- " ndirs += len(dirs)\n",
- " for f in files:\n",
- " fname = os.path.join(root, f)\n",
- " if fname.endswith('.'+ext):\n",
- " nfiles += 1\n",
- " with open(fname,'r') as fp:\n",
- " loc += fp.read().count('\\n')\n",
- " print('ndirs,nfiles,loc:', ndirs,nfiles,loc)\n",
- " return ndirs,nfiles,loc"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "b9b30c02-d480-4ed2-9b40-3601d5f9c5ad",
- "metadata": {},
- "source": [
- "# Draw figures"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 85,
- "id": "4b4a823f-8d31-4e64-9e89-60a5589a4636",
- "metadata": {},
- "outputs": [],
- "source": [
- "def dir2np(dirname, ext):\n",
- " print(dirname)\n",
- " cg_call, cg_copy, cg_loc, dfile2funcct, internal = dir2cg(dirname, ext)\n",
- " cg_out = defaultdict(int)\n",
- " cg_in = defaultdict(int)\n",
- " for f in cg_call:\n",
- " cg_in[f] += 0\n",
- " cg_out[f] += 0\n",
- " for call in cg_call[f]:\n",
- " if call in cg_call:\n",
- " cg_out[f] += 1\n",
- " cg_in[call] += 1\n",
- " cg_loc_avg = {f:cg_loc[f]/cg_copy[f] for f in cg_loc}\n",
- " res = cg_call, cg_copy, cg_loc_avg, cg_in, cg_out, dfile2funcct\n",
- " return [np.array(list(x.values())) for x in res], internal"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 89,
- "id": "3e5fe768-0b1c-404b-9cd4-63fec1992bf2",
- "metadata": {},
- "outputs": [],
- "source": [
- "def draw_project(dirname, ext):\n",
- " (cg_call, cg_copy, cg_loc_avg, cg_in, cg_out, _), _ = dir2np(dirname, ext)\n",
- " # generate table\n",
- " print('number of functions:', len(cg_call))\n",
- " dirstats(dirname, ext)\n",
- " print('copy=1:', np.sum(cg_copy == 1))\n",
- " print('copy=2:', np.sum(cg_copy == 2))\n",
- " print('copy=3:', np.sum(cg_copy == 3))\n",
- " print('33, cg_copy<=5)))\n",
- " print('55, cg_copy<=10)))\n",
- " print('copy>10:', np.sum(cg_copy > 10))\n",
- " # draw\n",
- " fig, axs = plt.subplots(2,2, dpi=100)\n",
- " axs[0,0].hist(cg_in, 30, (0,30))\n",
- " axs[0,0].set_xlabel(\"function indegree\")\n",
- " axs[0,0].set_ylabel(\"count\")\n",
- " axs[0,1].hist(cg_out, 30, (0,30))\n",
- " axs[0,1].set_xlabel(\"functin outdegree\")\n",
- " axs[1,0].hist(cg_loc_avg, 50, (0,100))\n",
- " axs[1,0].set_xlabel(\"avg loc per function\")\n",
- " axs[1,0].set_ylabel(\"count\")\n",
- " axs[1,1].hist(cg_copy, 10, (1,10))\n",
- " axs[1,1].set_xlabel(\"copy of same function\")\n",
- " plt.tight_layout()\n",
- " plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 156,
- "id": "6ba79c5a-4d5e-4de5-bd07-0626f5f63f79",
- "metadata": {},
- "outputs": [],
- "source": [
- "def draw_projects(dirnames, ext):\n",
- " print('parsing projects ..')\n",
- " lsts = [dir2np(name, ext)[0] for name in dirnames]\n",
- " print('plotting ..')\n",
- " fig, axs = plt.subplots(2,2, dpi=100)\n",
- " axs[0,0].hist([lst[3] for lst in lsts], 12, (0,12), label=[name.split('/')[1] for name in dirnames])\n",
- " axs[0,0].set_xlabel(\"function indegree\")\n",
- " axs[0,0].set_ylabel(\"count\")\n",
- " axs[0,0].legend(prop={'size': 6})\n",
- " axs[0,1].hist([lst[4] for lst in lsts], 15, (0,15))\n",
- " axs[0,1].set_xlabel(\"functin outdegree\")\n",
- " axs[1,0].hist([lst[2] for lst in lsts], 50, (0,100))\n",
- " axs[1,0].set_xlabel(\"avg loc per function\")\n",
- " axs[1,0].set_ylabel(\"count\")\n",
- " axs[1,1].hist([lst[5] for lst in lsts], 10, (0,20))\n",
- " axs[1,1].set_xlabel(\"functions per file\")\n",
- " plt.tight_layout()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 97,
- "id": "965c42d4-95f9-4a67-ad42-8649b8a2c6e6",
- "metadata": {},
- "outputs": [],
- "source": [
- "def gen_table(dirname, ext):\n",
- " print('---', dirname)\n",
- " (cg_call, cg_copy, cg_loc_avg, cg_in, cg_out, _), internal = dir2np(dirname, ext)\n",
- " # generate table\n",
- " print('number of functions:', len(cg_call))\n",
- " print('number of internal functions:', internal)\n",
- " dirstats(dirname, ext)\n",
- " print('copy=1:', np.sum(cg_copy == 1))\n",
- " print('copy=2:', np.sum(cg_copy == 2))\n",
- " print('copy=3:', np.sum(cg_copy == 3))\n",
- " print('33, cg_copy<=5)))\n",
- " print('55, cg_copy<=10)))\n",
- " print('copy>10:', np.sum(cg_copy > 10))"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "fa92081a-bb98-4dc7-a810-c0fe1105e71e",
- "metadata": {},
- "source": [
- "# Jupyter Projects"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "22778908-0885-4383-b8c2-0920562f014a",
- "metadata": {},
- "outputs": [],
- "source": [
- "jp_srcs = [\"edward/notebooks\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 111,
- "id": "543b69e4-10f1-4642-b91d-f0b5e735c680",
- "metadata": {},
- "outputs": [],
- "source": [
- "notebook_dir = \"jupyter/edward/notebooks\"\n",
- "src_dir = \"jupyter/edward/edward\""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 112,
- "id": "f0e1a186-0e1d-4baf-94d1-480a1132ec05",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "jupyter/edward/edward\n",
- "number of functions: 102\n",
- "ndirs,nfiles,loc: 5 42 8520\n",
- "copy=1: 82\n",
- "copy=2: 9\n",
- "copy=3: 3\n",
- "310: 3\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# plot src_dir\n",
- "draw_project(src_dir, 'py')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 113,
- "id": "31f7e398-8a67-4bc2-a8a6-abcb5c4e5d68",
- "metadata": {},
- "outputs": [],
- "source": [
- "# notebooks\n",
- "fname = \"jupyter/edward/notebooks/getting_started.ipynb\""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 115,
- "id": "dc180d23-4022-4f90-8381-1ef8655e15da",
- "metadata": {},
- "outputs": [],
- "source": [
- "import json"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 127,
- "id": "bc729b0b-3744-445c-ac0e-e4cc2962078d",
- "metadata": {},
- "outputs": [],
- "source": [
- "def ipynb2str(fname):\n",
- " with open(fname) as fp:\n",
- " j = json.load(fp)\n",
- " return '\\n'.join([''.join(c['source']) for c in j['cells'] if c['cell_type']=='code'])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 142,
- "id": "b21f428e-ebe7-43b2-b933-ae2f3b117b0c",
- "metadata": {},
- "outputs": [],
- "source": [
- "def process_ipynb_dir(notebook_dir):\n",
- " # os.walk through all notebooks, get the code content of the notebook.\n",
- " filect = 0\n",
- " loc = 0\n",
- "# internal = 0\n",
- " funcs = set()\n",
- " calls = set()\n",
- " for root,dirs,files in os.walk(notebook_dir):\n",
- " for f in files:\n",
- " if f.endswith('.ipynb'):\n",
- " filect+=1\n",
- " fname = os.path.join(root, f)\n",
- "# print('----', fname)\n",
- " code = ipynb2str(fname)\n",
- " loc += code.count('\\n')\n",
- " thebytes = bytes(code, 'utf8')\n",
- " parser.set_language(PY_LANGUAGE)\n",
- " tree = parser.parse(thebytes)\n",
- "# funcs = set()\n",
- "# calls = set()\n",
- " for f in get_top_functions(tree):\n",
- " funcname = node2str(thebytes, f.child_by_field_name('name'))\n",
- "# print(funcname)\n",
- " funcs.add(funcname)\n",
- " for call in get_callnodes(tree.root_node, call_query_py):\n",
- " calls.add(node2str(thebytes, call))\n",
- "# internal += len(funcs.intersection(calls))\n",
- " return funcs, calls, filect, loc"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 152,
- "id": "d21cc8ae-cf3c-4b9c-97ae-7ebd8e3b228f",
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_ipynb_project(notebook_dir, src_dir):\n",
- " # 1. parse src_dir\n",
- " cg_call, cg_copy, cg_loc, dfile2funcct, internal = dir2cg(src_dir, 'py')\n",
- " funcs, calls, filect, loc = process_ipynb_dir(notebook_dir)\n",
- "# print('funcs:', funcs)\n",
- "# print('calls:', calls)\n",
- "# print('external?:', funcs.difference(calls))\n",
- " print('internal % in file:', internal / max(len(cg_call),1))\n",
- " # the discriminative_network and rnn_cell are both internally used,\n",
- " # not as a function, but as value passed in to a function\n",
- " # I'm manually examine them, and the percent should be 100%\n",
- " #\n",
- " # FIXME the internal functions in files also have such problem\n",
- " print('internal % in notebook:', len(funcs.intersection(calls)) / max(len(funcs),1))\n",
- " # number of files\n",
- " print('number of notebooks:', filect)\n",
- " print('notebook total loc:', loc)\n",
- " print('number of files:', len(dfile2funcct))\n",
- " print('files total loc:', sum(cg_loc.values()))\n",
- " # number of functions\n",
- " print('number of funcs in notebook:', len(funcs))\n",
- " print('number of funcs in files:', len(cg_call))\n",
- " # calls from each other\n",
- " print('call from notebooks to files:', len(calls.intersection(set(list(cg_call.keys())))))\n",
- " fs_calls = set()\n",
- " for k in cg_call:\n",
- " fs_calls.update(cg_call[k])\n",
- " print('call from files to notebooks:', len(fs_calls.intersection(funcs)))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 146,
- "id": "f32b91d9-1e23-45db-b634-03878e56836d",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "internal % in file: 0.9313725490196079\n",
- "internal % in notebook: 0.8\n",
- "number of notebooks: 14\n",
- "notebook total loc: 1340\n",
- "number of files: 42\n",
- "files total loc: 5449\n",
- "number of funcs in notebook: 10\n",
- "number of funcs in files: 102\n",
- "call from notebooks to files: 11\n",
- "call from files to notebooks: 0\n"
- ]
- }
- ],
- "source": [
- "plot_ipynb_project(notebook_dir, src_dir)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 147,
- "id": "d5ad5cf2-29d6-41dd-b231-bd640cc879c0",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "avatarify-python edward matplotlib\t\t\ttqdm\n",
- "bert\t\t jax\t pytorch-CycleGAN-and-pix2pix\tzipline\n"
- ]
- }
- ],
- "source": [
- "!ls jupyter"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 163,
- "id": "7534ce0b-dc50-4076-94a6-f5b364762217",
- "metadata": {},
- "outputs": [],
- "source": [
- "jp_srcs = [(\"edward/notebooks\", 'edward/edward'), \n",
- " # only 1\n",
- " ('avatarify-python', 'avatarify-python/afy'),\n",
- " # only 1\n",
- " ('tqdm', 'tqdm/tqdm'),\n",
- " # only 1\n",
- " ('bert', 'bert'),\n",
- " # test dir\n",
- " ('jax/tests/notebooks', 'jax/jax'),\n",
- " # only 2 in top dir\n",
- " ('pytorch-CycleGAN-and-pix2pix', 'pytorch-CycleGAN-and-pix2pix'),\n",
- " # only 1 in test folder\n",
- " ('zipline', 'zipline/zipline')\n",
- " ]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 164,
- "id": "7a0f3b0d-7f9c-434e-906c-35dc1bf8ea08",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- edward/edward\n",
- "internal % in file: 0.9313725490196079\n",
- "internal % in notebook: 0.8\n",
- "number of notebooks: 14\n",
- "notebook total loc: 1340\n",
- "number of files: 42\n",
- "files total loc: 5449\n",
- "number of funcs in notebook: 10\n",
- "number of funcs in files: 102\n",
- "call from notebooks to files: 11\n",
- "call from files to notebooks: 0\n",
- "--- avatarify-python/afy\n",
- "internal % in file: 0.4444444444444444\n",
- "internal % in notebook: 1.0\n",
- "number of notebooks: 1\n",
- "notebook total loc: 101\n",
- "number of files: 9\n",
- "files total loc: 691\n",
- "number of funcs in notebook: 2\n",
- "number of funcs in files: 54\n",
- "call from notebooks to files: 1\n",
- "call from files to notebooks: 0\n",
- "--- tqdm/tqdm\n",
- "internal % in file: 0.7951807228915663\n",
- "internal % in notebook: 0.0\n",
- "number of notebooks: 2\n",
- "notebook total loc: 284\n",
- "number of files: 30\n",
- "files total loc: 2257\n",
- "number of funcs in notebook: 0\n",
- "number of funcs in files: 83\n",
- "call from notebooks to files: 9\n",
- "call from files to notebooks: 0\n",
- "--- bert\n",
- "internal % in file: 0.8804347826086957\n",
- "internal % in notebook: 1.0\n",
- "number of notebooks: 1\n",
- "notebook total loc: 322\n",
- "number of files: 13\n",
- "files total loc: 4547\n",
- "number of funcs in notebook: 7\n",
- "number of funcs in files: 92\n",
- "call from notebooks to files: 8\n",
- "call from files to notebooks: 3\n",
- "--- jax/jax\n",
- "internal % in file: 0.3879239040529363\n",
- "internal % in notebook: 0.0\n",
- "number of notebooks: 3\n",
- "notebook total loc: 104\n",
- "number of files: 196\n",
- "files total loc: 42879\n",
- "number of funcs in notebook: 0\n",
- "number of funcs in files: 2418\n",
- "call from notebooks to files: 8\n",
- "call from files to notebooks: 0\n",
- "--- pytorch-CycleGAN-and-pix2pix\n",
- "internal % in file: 0.5876288659793815\n",
- "internal % in notebook: 0.0\n",
- "number of notebooks: 2\n",
- "notebook total loc: 31\n",
- "number of files: 36\n",
- "files total loc: 2322\n",
- "number of funcs in notebook: 0\n",
- "number of funcs in files: 97\n",
- "call from notebooks to files: 0\n",
- "call from files to notebooks: 0\n",
- "--- zipline/zipline\n",
- "internal % in file: 0.6086956521739131\n",
- "internal % in notebook: 0.0\n",
- "number of notebooks: 2\n",
- "notebook total loc: 115\n",
- "number of files: 183\n",
- "files total loc: 30087\n",
- "number of funcs in notebook: 3\n",
- "number of funcs in files: 851\n",
- "call from notebooks to files: 1\n",
- "call from files to notebooks: 3\n"
- ]
- }
- ],
- "source": [
- "# TODO process all the jupyter projects\n",
- "for notebook_dir,src_dir in jp_srcs:\n",
- " print('---', src_dir)\n",
- " plot_ipynb_project('jupyter/'+notebook_dir, 'jupyter/'+src_dir)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "6f067a13-dc47-48cd-b258-8e33b65c2251",
- "metadata": {},
- "source": [
- "# Jula Project"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 67,
- "id": "3fe42c7f-735b-426e-9b52-872dc12743ec",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['JuliaDB.jl/src', 'HTTP.jl/src', 'Flux.jl/src', 'LightGraphs.jl/src']"
- ]
- },
- "execution_count": 67,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "julia_srcs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "95d31143-469a-47f0-8a58-84bc56feeea4",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# file2cg(\"julia/JuliaDB.jl/src/dcolumns.jl\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "31af358c-f44b-4b44-b144-2d60a74f4ac6",
- "metadata": {
- "tags": []
- },
- "outputs": [],
- "source": [
- "# dir2cg(\"julia/JuliaDB.jl/src/\", \"jl\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 100,
- "id": "1ff8308f-160b-45ca-9463-5952bd06be29",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "julia/JuliaDB.jl/src/\n",
- "number of functions: 106\n",
- "ndirs,nfiles,loc: 0 20 3113\n",
- "copy=1: 70\n",
- "copy=2: 25\n",
- "copy=3: 5\n",
- "310: 0\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "draw_project(\"julia/JuliaDB.jl/src/\", 'jl')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 157,
- "id": "33144143-b207-4fce-9fac-2a9043d5f623",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "parsing projects ..\n",
- "julia/JuliaDB.jl/src\n",
- "julia/HTTP.jl/src\n",
- "julia/Flux.jl/src\n",
- "julia/LightGraphs.jl/src\n",
- "plotting ..\n"
- ]
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGGCAYAAABmPbWyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABD8klEQVR4nO3deZwcVb3//9ebEBK2JCAxCwFB1iib7IiQYZN8L6hB4KogENxAQUUvChGEAN7LogJquAqIBvkhiALxsiuGsBnZlE2DghIhJCSYmA2ykXx+f1R1UtPpmenp6e7q7nk/H496zNSpqlOf6p4+8+lTp6oUEZiZmZlZ59bJOwAzMzOzZuCkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwM6+YdQCOQJGA4sCjvWMxsLRsDM6PJ78TrdsasoZXVzjhpSgwHZuQdhJl1aATwWt5B9JDbGbPG1mU746QpsQjg1VdfZcCAAXnHYmaphQsXssUWW0Br9M64nTFrQN1pZ5w0ZQwYMMCNmZnVlNsZs+blpMmsm1auXMmKFSvyDqMl9e3blz59+uQdhplZSU6azLph8eLFzJgxgyYfk9ywJDFixAg22mijvEMxM1uLkyazMq1cuZIZM2awwQYbMHjwYJKLoaxaIoI33niDGTNmsN1227nHycwajpOmGpq248jVv498YVqOkVg1rFixgohg8ODBrL/++nmH05IGDx7M9OnTWbFihZOmGnG7ZFY539zSrJvcw1Q7fm3NrJE5aTJrUNOnT+eYY44puWzixIlMmDABgFNOOaXDOiZOnMh2223HwQcfzAEHHMDVV1+9etl2221HW1sb73//+/nqV79actupU6d2GoeZWW/i03NmFdrq7Lt6XMf0S47ocR3ZRKiUL3/5y5x++um89dZbHHXUUYwYMYIjjjiCgQMHMmXKFAA++MEPMmPGDEaMGLF6u7FjxyYxTp/e4xjNzFqBe5rMGlxbWxuLFy8G4Jhjjlkridlzzz0BuOGGG2hra2P33XfnhhtuWKueDTbYgLPOOotbb721XfmqVatYvnz5WuO0xo8fz5133lnFI8mHpAMl3SFppqSQNKZouSRdKGmWpCWS7pe0XdE6m0q6UdJCSfMlXSfJl/iZ9TJOmsxaxNFHH82UKVN49NFHueKKK0quM3z4cGbNmgXAggULaGtrY6eddmLo0KG84x3vqGe49bQh8AxwWgfLvw58CTgV2Ad4E7hPUv/MOjcC7wUOA44EDgSuqVXAZtaYnDSZNbjs4OjO7g9133330dbWxujRo3nppZdKrjNz5kyGDx8OsPr03F/+8heGDx/OzTffXN3AG0RE3BMR50bE7cXL0ofongF8KyJ+HRHPAieSPCduTLrOSGA08JmIeCwiHgG+CHxc0vA6HYaZNQAnTWYNbpNNNmHGjBm8/fbb/PnPf+5wvW9961vcdddd3HPPPWywwQZrLV+yZAnf/va3OfbYY0vuY86cOVWNu0lsDQwF7i8URMQC4DFgv7RoP2B+RDyZ2e5+YBVJz5SZ9RIeCG7WoCKCPn36cOqpp3Lssceyyy67MGTIkA7X/+hHP8oBBxzA7rvvziabbLK6/Hvf+x633XYbK1as4MQTT2T06NHAmtNzEUH//v35xS9+ASRX43U1uLyFDE1/zi4qn51ZNhRol1FGxNuS5mXWWYukfkC/TNHGPQvVzPLmpMmsQtW48q0zr7zyCsOGDePQQw/lueeea7escGUbwJNPJh0g55xzDuecc85a62XXzXrxxRdLlhcSpmXLlrHBBhuw1VZb8atf/arCo+jVxgHn5x2EmVWPT8+ZNaB7772Xr33ta3zuc5/LZf933HEHf/jDH9h7771z2X8dvZ7+LO7CG5JZ9jrwzuxCSesCm2bWKeViYGBmGtHJumbWBJw0mTWg0aNH8/jjj/Oe97wnl/1/6EMf4oEHHugND859mSTxOaRQIGkAyVilqWnRVGCQpD0y2x1M0n4+1lHFEbEsIhYWJmBRtYM3s/ry6Tkza2np/ZS2zRRtLWk3YF5EvCLpSuBcSS+SJFEXATOBSQARMU3SvcC1kk4F+gITgJsjYmbdDsTMcuekycxa3Z7AA5n5y9Of1wNjgctI7uV0DTAIeAQYHRFLM9scT5Io/Y7kqrlbSe7tZGa9iJMmM2tpETEF6PBJwJHc/Oq8dOponXnAcVUPzsyaisc0mTWo4gfl3nnnnZx//vm0tbWx1VZbsfPOO9PW1rb6wbtDhw5lr732oq2tjcmTJ68u32OPPfjJT36yuh4/iNfMrDLuaTKr1PiBVahjQbdWl8SUKVMYP348e+65J0ceeeTqZWPHjuXMM89kp512Atbc8fvNN9/kve99LyeccAJ9+/b1g3jNzCrkniazFrfhhhsybNgw5s2bB7TOg3jNzOrNPU1mDezBBx+kra0NgLlz53L00Ud3u4433niDOXPmMHjw4CpHZ2bWuzhpMmtgo0aNWn037jvvvHP13b/LUXhMCsCECRNYZx13LJuZ9YSTJrMWVRjTZGZm1eGvnma9xCmnnJJ3CGZmTU3JLUp6t/SxCQsWLFjAgAEDqlbvtB1Hrv595AvTqlav5WPp0qW8/PLLbL311vTv3z/vcCo2btw4DjvsMA4++OC8Q1lL8Wu8cOFCBg4cCDAwfRRJ06pVO9NdbpfM2utOO+OeJrNepBc9iNfMrOqcNJn1Ir3oQbxmZlXnpMnMzMysDE6azMzMzMrgpMnMzMysDE6azBrU9OnTGTx4MG1tbbS1tfGTn/yECRMmVFxf4ZYDY8eO5fnnn69WmGZmvYZvbmlWoZ2v37nHdTx30nOdLs/eEXzixIk92tfVV1/do+3NzHo79zSZNaE999xzrd9POOEEpkyZwpw5czjggANYsmRJh9uYmVn3uafJrIFlH9j74Q9/mPXWW6/Ddb///e9z5JFHstlmm/Hd736X9ddfv05Rmpn1Drn2NEk6UNIdkmZKCkljipZL0oWSZklaIul+SdsVrbOppBslLZQ0X9J1knwTGmsJo0aNYsqUKUyZMoVNN9205DqFu/pvsskmfOADH+DNN9/0zSvNzGog79NzGwLPAKd1sPzrwJeAU4F9gDeB+yRln2FxI/Be4DDgSOBA4JpaBWzWCJYuXcrKlSt55ZVX+Pe//w3A3/72N55++mm23XZb7rnnnpwjNDNrPbmenouIe4B7ACS1W6ak4AzgWxHx67TsRGA2MAa4WdJIYDSwV0Q8ma7zReBuSWdGxMz6HIlZfR1//PHst99+HHjggQwaNIhVq1Zx+umn86Mf/Yh3vvOdjB49mn322Yf/+7//Y4cddmC//fbLO2Qzs6bXMA/slRTAURExKZ1/N/B34H0R8XRmvQeBpyPiy5I+BXw3IjbJLF8XWAocGxG3d7CvfkC/TNHGwAw/sNc608wP7F22bBmHHXYYDz30UN6hdMoP7K09t0tm7bXKA3uHpj9nF5XPziwbCszJLoyIt4F5mXVKGQcsyEwzehqsWSM79thj+eQnP5l3GGZmTa23Xj13MXB5Zn5jnDhZC/u///u/vEMwM2t6jZw0vZ7+HALMypQPAZ7OrPPO7Ebp6blNM9uvJSKWAcsy2/Q8WjMzM2tpjXx67mWSxOeQQkE6JmAfYGpaNBUYJGmPzHYHkxzXY3WK08zMzHqBXHua0vspbZsp2lrSbsC8iHhF0pXAuZJeJEmiLgJmApMAImKapHuBayWdCvQFJgA3+8o5MzMzq6a8e5r2BP6UTpCMM/oTcGE6fxnwA5L7Lj0BbASMjoilmTqOB14AfgfcDTwCfK7mkZvV2PTp0znmmGNWz19yySW8/PLLHa5f6jEpU6ZM4W9/+9vq+UcffZSDDjqItrY2Ro0axa233tqjGNva2li8eHHZ6997773cfvvtHcZrZtbI8r5P0xSgwwFFkdwP4bx06midecBxVQ/OrAvZS7cr1Z1Lvs8+++xu1z9lyhT23HNPtt9+e+bOncsXvvAF7r33XoYNG8aKFSt48skn262/atUq1lmndt+lRo8eXbO6zcxqraLWUdJkSYNKlA+QNLnHUZnZWsaOHcvzzz/P22+/zTHHHMOhhx7KaaedxtixYwFW3+Byn3324dJLL2XJkiVMnDiRcePGceKJJ3L33Xdz1FFHMWzYMAD69u27+qaXbW1tfP3rX+fwww9n9uzZHHTQQRxwwAEcc8wxrFy5kunTp7Pffvvx0Y9+lN13353Jk9d8zM877zwOPPBATj/9dAB+/etfs/fee3PQQQfxwx/+sN0xTJw4kQkTJtTh1TIzq75Kv1K2AaWeHNofOKDiaMysS5MmTWL77bfn/vvvZ9ddd11dPn/+fL72ta/x+9//nhtuuIH111+fsWPHcvHFF/Ozn/2MmTNnrk6YJk+eTFtbGx/+8IdXb3/44Yfz29/+lk022YTf/va3PPzww2y++earE6TXX3+dm266id/85jecc845q7cbM2YMDz30EE899RQLFizgV7/6FRMnTuSBBx7glFNOqdOrYmZWe91KmiTtImmXdPY9hfl0eh/waeC1qkdpZqu99NJL7LFHcsFo4SckD+x917veRZ8+fUresXz48OG89lry8Tz44IOZMmUKM2euuV5ir732AmDu3Lkcc8wxjBo1irvvvnv1OjvttBP9+vVjs8024+2331693fve9z4ANt98c+bPn883v/lNrrzySk444QQef/zxKh+9mVl+utvT9DTJQO0AJqfzhekp4FzWDOI2sxrYdttt+dOfkmsnCj+h9P3G+vbty8qVKwH4j//4D26//fbVSVA28QFWj2X6+c9/zpFHHsmDDz7I6NGjKTxq6c9//jPLly9n3rx5rLvumuGQ2f1GBFtssQXXXHMNl156Kd/4xjeqcchmZg2huwPBtyYZuP0PYG/gjcyy5cCciFhZpdjMer2HH36YQw89FIBHHnmEM888kzFjxnDzzTdzyCGH8O53v5u+fft2uP3BBx/MWWedxeTJk/ne977Hj370I4477jgksc4663DGGWestc0hhxzCCSecwB133MH666+/unzEiBF84hOf4OWXX+ayyy7rcJ8XXHABU6dOZfny5Xzxi18E4JRTTuHqq6+u8FUwM2sMDfPA3jzV6kGafjBma2mkB/auWLGCvn37cs011/Dvf/+bs846q6b7mz59OmeeeSa/+tWvelTP1VdfTd++ffnUpz5Vcrkf2Ft7bpfM2utOO1PxLQckbQccRPIYk3an+SLCp+jMaugjH/kIixcvpl+/fvziF7/IO5yyPPbYY9xwww38/Oc/zzsUM7OKVJQ0Sfos8EPgXySPOsl2VwUe12RWU3fffXdd97fVVlv1uJdpn3324ZFHHqlSRGZm9VdpT9O5wDkRcWk1gzEzMzNrVJUmTZsAv6xmIGbNYuHChUREyavVrHIRwaJFi4DSVwKameWt0qTpl8AHgR9VMRazhtavXz8GDBjA3LlzmTt3bt7htKwBAwaw3nql7p1rZpavSpOml4CLJO0LPAesyC6MiO/3NDCzRiOJzTffnCFDhqx1jyOrjnXXXbfdPaDMzBpJpa3T54DFwKh0ygrASZO1LP9jNzPrnSpq+SNi62oHYmZmZtbIKn1gr5mZmVmvUul9mn7S2fKIKH27XzMzM7Mm1ZNbDmT1BXYCBpE8yNfMzMyspVQ6pumo4jJJ65DcJfzvPQ3KzMzMrNFUbUxTRKwCLge+Uq06zczMzBpFtQeCb0MPHgJsZmZm1qgqHQh+eXERMAw4Ari+p0GZmZmZNZpKe5reVzTtkpb/F3BGz8MyM6sfSeMlRdH0QmZ5f0lXSZorabGkWyUNyTNmM6u/SgeCH1TtQMzMcvZn4NDMfPZZOVeQ9KQfCywAJgC3AfvXLTozy12Pxh9JGgzskM7+NSLe6HlIZma5eDsiXi8ulDQQ+DRwXERMTstOBqZJ2jci/lDnOM0sJxWdnpO0YXqDy1nAQ+k0U9J1kjaoZoBmZnWynaSZkv4h6UZJW6ble5Dci+7+wooR8QLwCrBfR5VJ6idpQGECNq5l8GZWe5X2NF1O8qDeDwGPpmUfIHlQ73eBz/c8NDOzunkMGAv8leSilvOBhyXtBAwFlkfE/KJtZqfLOjIuracmpu04cvXvI1+YVqvd5LY/s0ZUadJ0NHBMREzJlN0taQlwC06aqsqNlVltRcQ9mdlnJT0G/BP4T2BJhdVeTPIFs2BjYEaFdZlZA6j06rkNSL5lFZuTLjMza1ppr9LfgG2B14H1JA0qWm1IuqyjOpZFxMLCBCyqUbhmVieVJk1TgQsk9S8USFqfpCt6ajUCMzPLi6SNSG7WOwt4ClgBHJJZvgOwJW7vzHqVSk/PnQHcC8yQ9ExatiuwDPhgFeIyM6sbSd8B7iA5JTccuABYCdwUEQskXQdcLmkesBD4ATDVV86Z9S6V3qfpOUnbAccDO6bFNwE3RkSl5//NzPIygqQNewfwBvAIsG/mNipfAVYBtwL9gPuAL+QQp5nlqNLHqIwDZkfEtUXln5I0OCIurUp0ZmZ1EBEf72L5UuC0dDKzXqrSMU2nAC+UKP8zcGrl4ZiZmZk1pkqTpqEkAySLvUFyjxMzMzOzllJp0vQqpZ+5tD8ws/Jw2vNDNM3MzKxRVHr13LXAlZL6ApPTskOAy0juCF5NfoimmZmZ5a7SpOnbJFeZ/C+wXlq2FLg0Ii6uRmAZfoimmZmZ5a6i03OROAsYDOxLco+mTSPiwmoGl6rqQzTNzMzMKlFpTxMAEbEYeKJKsZRSi4doIqkfyb1WCvz0cTMzM+tUj5KmWqvRQzShxk8fNzMzs9ZT6dVzuajGQzRTFwMDM9OIqgZqZmZmLaehe5qKZR6ieQPtH6J5a7q8rIdoRsQykufkFeqtUcRmZvnb+fqdV/9+S45xmDW7hk6a/BBNMzMzaxQNnTThh2iamZlZg2jopKmVH6K51dl3tZuffskROUViZmZm5WjopMnMrNcbPzDz+4L84jCz5rp6zszMzCwv7mmqouwVKuCrVMzMzFqJe5rMzMzMyuCkyczMzKwMTprMzMzMyuAxTWZmTcJ39jbLl3uazMzMzMrgpMnMzMysDE6azMzMzMrgpMnMzMysDB4I3oB8k0wzM7PG46TJzKzBZB/oPb1/Zdv6IeBm1efTc2ZmZmZlcE9TT2WfQL71lvnFYWZmZjXlniYzMzOzMrinqVG4x8rMzKyhuafJzMzMrAzuaTIzs/ZX7FXxyrtpO45c/fvIF6ZVrV6zPDhp6qZswwLdvxzYzKxZ+AHBZu359JyZmZlZGdzT1Etku8jB3eRmLc8Xl5hVnZMmMzOrWK3GQpk1Ip+eMzMzMyuDkyYzMzOzMjhpMjMzMyuDkyYzMzOzMngguJmZtVe48i7nq+4KV/36al9rFO5pMjMzMyuDe5qanC/3NbPexG2e5clJk5mZWQ04wWs9TppaSfYOwMDOmfEIfm6UmZlZzzhpMjOzunMvjDUjJ00GNFYDlo0F8o/HzMwMfPWcmZmZWVlaJmmSdJqk6ZKWSnpM0t55x2RmrcXtTBfGD1wzmbWgljg9J+ljwOXAqcBjwBnAfZJ2iIg5ecbWago3myvI3nTOp9WslbmdaR7ZdqoaN8ZspOELlq9W6Wn6KnBtRPw0Iv5C0qi9BXwq37CsI9N2HNluMmsCbmfMermm72mStB6wB3BxoSwiVkm6H9gvt8CsZXT2LXPn63de/ftzJz1Xt5jK0VmvYLV0p3ex2t/+68ntTPcVPhtl3e4kezpv/IIe7a+jfZbTW1Tp32i9t7P8NH3SBGwG9AFmF5XPBnYstYGkfkC/TNHGAAsXLuxyZ6uWvdVufqFi9e8rl6xst2zxyjXzxXXXop5sHcX1ZOvosp5xA9otY9yMsupZ65g6eT2rVU9ndjr/vnbzz19weIfr/nWPPVf/vsNTT7Zb1tlrs/JdI1b//sR227dbVlxPubKxFNfTnWPq6j2vhkrf83JjqUXMFcqtnemobejo9SxsW+l22W0r3S67bXe3I7NOYdsOt8uUdxVrR9tllRVriW2rvZ3VV3dee0VE12s1MEnDgdeA90fE1Ez5ZcCoiNinxDbjgfPrFqSZ9dSIiHgtr527nTHrFbpsZ1qhp+lfwEpgSFH5EOD1Dra5mGRAZ9amwLwO1t8YmAGMABZVFqZ1wa9x7TXra7wxMDPnGOrRzkDzvkf14NemY35tOlbua1NWO9P0SVNELJf0FHAIMAlA0jrp/IQOtlkGLCsq7rB/TlLh10UR4T7UGvBrXHtN/BrnHms92pm0zsKvzfYe1Zxfm475telYN16bsl63pk+aUpcD10t6Enic5FLgDYGf5hmUmbUUtzNmvVxLJE0R8QtJg4ELgaHA08DoiCgetGlmVhG3M2bWEkkTQERMoINu8ipYBlzA2l3tVj1+jWvPr3EP1bidAb9HnfFr0zG/Nh2r6mvT9FfPmZmZmdVDq9wR3MzMzKymnDSZmZmZlcFJk5mZmVkZnDSVQdJpkqZLWirpMUl75x1Tq5A0XlIUTS/kHVczk3SgpDskzUxfzzFFyyXpQkmzJC2RdL+k7XIK11JuZ0pzG7GGP9sdK+O1mVji7+je7u7HSVMXJH2M5P4sFwC7A88A90l6Z66BtZY/A8My0wfyDafpbUjyd3paB8u/DnwJOBXYB3iT5G+6f33Cs2JuZ7rkNiLhz3bHunptAO6l/d/RJ7q7E1891wVJjwFPRMTp6fw6wKvADyLiklyDawHp87nGRMRuOYfSkiQFcFRETErnRfKogO9GxHfSsoEkD54dGxE35xVrb+Z2pmNuI0rzZ7tjxa9NWjYRGBQRY3pSt3uaOiFpPWAP4P5CWUSsSuf3yyuuFrRd2qX6D0k3Stoy74Ba2NYkN2bM/k0vAB7Df9O5cDtTFrcRXfNnu2ttkuZI+qukH0p6R3crcNLUuc2APiSZetZskj9O67nHgLHAaODzJB/8hyVtnGdQLazwd+u/6cbhdqZzbiPK48925+4FTiR5XuRZwCjgHkl9ulNJy9wR3JpTRNyTmX02PU3xT+A/gevyicrMGoXbCKuGotOTz0l6Fvg70Ab8rtx63NPUuX8BK4EhReVDgNfrH07ri4j5wN+AbXMOpVUV/m79N9043M50g9uIDvmz3Q0R8Q+Sz163/o6cNHUiIpYDT5F05wGrB2geAkzNK65WJmkjYBtgVt6xtKiXSRrQ7N/0AJIrbfw3nQO3M93jNqJD/mx3g6QRwDvo5t+RT8917XLgeklPAo8DZ5Bc2vjTPINqFZK+A9xB0t0+nOSS65XATXnG1czSfyrZb09bS9oNmBcRr0i6EjhX0oskDe1FJFfdTKpzqLaG25kOuI1Yw5/tjnX22qTT+cCtJInlNsBlwEvAfd3Zj5OmLkTELyQNBi4kGUz3NDA6IooH21llRpA0fu8A3gAeAfaNiDdyjaq57Qk8kJm/PP15PcmA2stI/iFfAwwiec1HR8TS+oVoWW5nOuU2Yg1/tjvW2WvzeWAX4CSS12Um8BvgmxGxrDs78X2azMzMzMrgMU1mZmZmZXDSZGZmZlYGJ01mZmZmZXDSZGZmZlYGJ01mZmZmZXDSZGZmZlYGJ01mZmZmZXDSZGZmZlYGJ029gBLXSJonKdJby+cVy1b1iEHSREmTqlBPSBrT84jMWldvbGOqSdJYSfPzjsO65seo9A6jSW6x3wYUnuxcc5ImAoMiYkym+FVgWB1i+DKgGu/DzBK9sY3pkqTpwJURcWXOoViVOGnqHbYBZkXE7/MOJCJWkjwwsdb7WVDrfVSLpPXSJ92bNate18Y0I0l9I2JF3nE0M5+ea3HpN7EfAFumXdbT0/Lpks4oWvdpSeMz8yHpM5Jul/SWpBclfbhom/dKulPSQkmLJD0saZu0npOAj6T1hKS2Ul3nkkZJelzSMkmzJF0iad3M8imSvi/psrT7//VsnB0dd/b0XDl1SNpO0kOSlkr6i6TDStS7haRbJM1P6/m1pK0yy9dN9zNf0lxJl0q6vkQsEyRdKelfpE/ZlrSTpHskLZY0W9INkjbLbLeOpHGSXpa0RNIzko7p7HUwq7VGb2PSspB0iKQn0/38XtIOXRzXzpImp5+1uUpOP26UWT5F0pVF20xKXw8kTQHeBVxRiC+z3lhJr6Sx3E7yMOLi/X9E0h/T9ugfks4vahd3lPRIpr06VJnhBJnX4WOSHpS0FDg+XfYZSdPSbV+Q9IWifXfazvVmTppa35eB84AZJF3We3Vz+/OBW0ieEH03cKOkTQEkbQ48BCwDDgb2AH5C0oP5nXS7e9P9DgPW+haa1nE38ASwK8nTqD8NnFu06knAm8A+wNeB80olNV3osA5J6wC3AcvT5acClxbF2pckwVkEHADsDywG7pW0XrraWSQN08np8gHAmA5iWZ6uc6qkQcBk4E8kT+seDQwheQ0LxgEnprG9F7gC+P8kjerm62BWTQ3dxmT8N/BfJJ+vt9N6SpK0Icln/d/p8RwLHApM6MZxfZTkNTkvEx+S9gGuS+vaDXiAovZO0gHAz4DvAe8BTiE5/XlOurwPMAl4i6S9+lx6fKVcktYzErhP0vHAhWldI4FvABdJOimtu5x2rveKCE8tPgFnANOLyqYDZxSVPQ2Mz8wHcFFmfsO0bHQ6/z8k4xf6drDficCkorKt0jp2S+f/G3gBUGadL5B8YNdJ56cADxfV8zhwSSfH3G7fXdUBfBBYAQzPLB+dxjomnf9kiVjXI2m4PpjOvw6cmVneB/hniVj+WBTLucB9RWUj0v1vD/QjSfj2K1rnx8DP8/4b89S7pwZvY9rS+UMy6/xHWta/g3o/C8wDNizaZiUwJJ2fQjJeKbvdJGBiF6/Bz4G7ispuBuZn5u8HxhWt80lgZvr76LS9GppZfmhRe1V4Hb5cVM9LwCeKys4Ffp/ZT6ftXG+ePKbJuvJs4ZeIeFPSQuCdadFuJIlIT86RjwSmRvrJTD0KbESSNLxSHEdqViaOcnVWx0jg1YiYmVk+tWj9XYFtgUVSuzHm/YFtJA0k6R16vLAgIlZKeoq1e3WfKlH3QZIWl4h7G6AvsAHw26J9r0fSO2XWrGrdxqy1H5LPPul+Ximx7kjgmYh4M1P2KMnneAdgdg/iGAncXlQ2lSQRKtgV2F/SOZmyPkB/SRukMbwaEdmxW49T2pOFX9IetG2A6yRdm1lnXaAwDrTTdq6T4+oVnDT1XqtY++qyviXWK26sgjUJwJJqB9WJzuKoVx0bkSQ7x5dY9kY3Y3mzaH4j4A6S03vFZgE7pb8fAbxWtHxZN/dtVg+N1sZk91P4ktaTISrlHl8lNiI5bXlbiWVLu1lXtq0pjMn6LPBY0XorM+tUq51rOU6aeq83SM+xA0gaAGzdzTqeBU5Sx1dkLCf5dtSZacDRkpTpbdqf5PTcjG7G0xPTgC0kDYuIwrfQfYvW+SPwMWBORCwsVYmk2SRjIB5K5/sAu5OclujMH4GjSU5xvF2i3r+QJEdbRsSDZR2RWb4apY2pxDRgrKQNM71N+5MkSn9N54uPrw/Jl5sHuohvGsk4pKxSbc0OEfFSqeAk/ZWkvRoSEYVery7HkkXEbEkzgXdHxI0drNZlO9ebeSB47zUZOEHSAZJ2Bq5nzTeNck0gGeh8s6Q9lVx9dkLmqpTpwC6SdpC0WTrAsNj/AlsAP0ivBvkIcAFweUSsquTAKnQ/8Dfgekm7pgMxiwdW3khy75dfp6/b1umVOd+XNCJd5wfAuPTKlx1IBmBuwppvth25CtgUuEnSXkquDjpc0k8l9YmIRSQDX6+QdFK6fHdJXywM4DRrMI3SxlTiRpIeneuVXNV6EMln+4ZMkjIZOELSEZJ2BH4IDCqqZzpwoKTNteZK2O8DoyWdmR7P6bQ/NQfJQO0T0yvm3itppKSPS/pWuvy3wN/T+HaRtD9QWNZVW3M+SRv1JUnbK7lK8GRJX80ce1ftXK/lpKn3uhh4ELgTuItkAOPfu1NBRMwluaJlo7Sup0i6fQvfCK8l+Vb2JMm3sv1L1PEayQDLvYFngB+RXFnyreJ1aylN0I4C1icZG/Bj0itVMuu8BRxIMgbiNpJvjNeRnOsvfCO7FLiJ5MqXqSRXndxHF13q6Viq/Um+lf4GeA64EphP8u0W4JvARSRX0U0juWroCODlCg7ZrNYaoo2pRPpZP5zki8wTwK+A3wGnZ1b7CUki+LM0tn/QvpcJkivntiI57jfSuv+QHsOXSdq8D1LU3kXEfcCR6bIngD8AXyG5qIRI7kU1huR1eYKkvSp8yeuqrfkx8BmSK3yfS2MfS9qOlNnO9VpqP/7WzKopvZXBNOCWiPhm3vGYWWtKe5seAbaNiG4lp1Y+j2kyqyJJ7yL5dvggyW0CTicZx/HzPOMys9Yi6SiSnuwXSa52+x7wqBOm2nLSZFZdq0i6ur9DcmXN88ChETEtz6DMrOVsTDIcYEuSMUj3k9y802rIp+fMzMzMyuCB4GZmZmZlcNJkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTWZmZmZlcNJkZmZmVoZ18w6gEUgSMBxYlHcsZraWjYGZERF5B9ITbmfMGlpZ7YyTpsRwYEbeQZhZh0YAr9WqckmbA5cC/w/YAHgJODkinkyXC7gA+CwwCHgU+HxEvNiN3bidMWtsXbYzTpoSiwBeffVVBgwYkHcsZpZauHAhW2yxBdSwd0bSJiRJ0AMkSdMbwHbAvzOrfR34EnAS8DJwEXCfpPdExNIyd+V2xqwBdaedcdKUMWDAADdmZr3PWcCrEXFypuzlwi9pL9MZwLci4tdp2YnAbGAMcHN3duZ2xqx5eSC4mfV2HwaelPRLSXMk/UnSZzPLtwaGAvcXCiJiAfAYsF9HlUrqJ2lAYSIZM2FmTcxJk5n1du8GPg+8CBwO/BD4vqST0uVD05+zi7abnVlWyjhgQWbyeCazJuekycx6u3WAP0bENyLiTxFxDXAtcGoP670YGJiZRvSwPjPLWUMnTZI+L+lZSQvTaaqk/5dZ3l/SVZLmSlos6VZJQ/KMuWDn63fOOwQzK88s4C9FZdOALdPfX09/FrctQzLL1hIRyyJiYWGixrcamLbjyHaTmVVfQydNJN3ZZwN7AHsCk4FfS3pvuvwK4EPAscAokkt6b8shTjNrXo8COxSVbQ/8M/39ZZLk6JDCwnSM0j7A1HoEaGaNoaGvnouIO4qKzpH0eWBfSTOATwPHRcRkAEknA9Mk7RsRf6hzuGbWnK4Afi/pG8AtwN7A59KJiAhJVwLnSnqRNbccmAlMyiNgM8tHQydNWZL6kPQobUjy7W4PoC/tr2h5QdIrJFe0OGkysy5FxBOSjiIZg3QeSVJ0RkTcmFntMpK25xqSm1s+Aozuxj2azKwFNHzSJGlnkiSpP7AYOCoi/iJpN2B5RMwv2qSrK1qQ1A/olynypcBmvVhE3Anc2cnyIEmozqtbUGbWcBp9TBPAX4HdSMYP/BC4XtJ7elinLwU2MzOzbmn4pCkilkfESxHxVESMA54BvkwyMHM9SYOKNun0ipaULwU2MzOzbmn4pKmEdUhOrT0FrKD9FS07kFwm3OkVLfW+FNjMzMyaX0OPaZJ0MXAP8ArJuKPjgDbg8IhYIOk64HJJ84CFwA+Aqb5yzszMzKqtoZMm4J3Az4BhJGOPniVJmH6bLv8KsAq4laT36T7gCznEaWZmZi2uoZOmiPh0F8uXAqelk5mZmVnNNOOYJjMzM7O6c9JkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTTU0bceReYdgZmZmVeKkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwMTprMzMzMyuCkyczMzKwMTpp6aKuz76rr/qbtOLKu+zMzM7OEkyYzMzOzMjhpMjMzMyuDkyYzMzOzMjhpMjPLkHS2pJB0Zaasv6SrJM2VtFjSrZKG5BimmeXASZOZWUrSXsApwLNFi64APgQcC4wChgO31Tc6M8ubkyYzM0DSRsCNwGeBf2fKBwKfBr4aEZMj4ingZOD9kvbNJVgzy4WTJjOzxFXAXRFxf1H5HkBfYHV5RLwAvALs11FlkvpJGlCYgI1rELOZ1VFDJ02Sxkl6QtIiSXMkTZK0Q9E6HmtgZj0i6ePA7sC4EouHAssjYn5R+ex0WUfGAQsy04yeR2pmeWropIlk7MBVwL7AYSTf9n4jacPMOh5rYGYVk7QF8D3g+IhYWsWqLwYGZqYRVazbzHKwbq0qljQZ+Gjxt7O0m3pSRBzcVR0RMbpo27HAHJLu8ocyYw2Oi4jJ6TonA9Mk7RsRf6jGsZhZS9sDeCfwR0mFsj7AgZJOBw4H1pM0qKg9GwK83lGlEbEMWFaYz9RtZk2qlj1NbcB6Jcr7AwdUWOfA9Oe89GdFYw3MzDJ+B+wM7JaZniQZFF74fQVwSGGDdJjAlsDUegZqZvmqek+TpF0ys++RlD3n3wcYDbxWQb3rAFcCj0bE82lxRWMNJPUD+mWKPEDTrJeKiEXA89kySW8CcwttjaTrgMslzQMWAj8Apro326x3qcXpuaeBSKfJJZYvAb5YQb1XATsBH6g4sjXGAedXoZ6qm7bjSEa+MC3vMMysva8Aq4BbSb5w3Qd8IdeIzKzuapE0bQ0I+AewN/BGZtlyYE5ErOxOhZImAEcCB0ZE9gqU16lgrAHJAM3LM/Mb4ytbzCwVEW1F80uB09LJzHqpqidNEfHP9Ncej5dSMnLyB8BRQFtEvFy0ylOsGWtwa7pNl2MNPEDTzMzMuqtmV88BSNoOOIjkypR2SVREXFhGFVcBxwEfARZlxkctiIglEbHAYw3MzMysHmp5y4HPAj8E/kVyqiwyiwMoJ2n6fPpzSlH5ycDE9PemGWvg8UpmZmbNq5Y9TecC50TEpZVWEBFdnjfzWAMzMzOrh1rep2kT4Jc1rN/MzMysbmqZNP0S+GAN6zczMzOrm1qennsJuEjSvsBzJFe5rRYR36/hvs3MzMyqqpZJ0+eAxSQP0R1VtCwAJ01mZmbWNGqWNEXE1rWq28zMzKzeajmmyczMzKxl1PI+TT/pbHlEfKpW+zYzMzOrtlqOadqkaL4vyQN3B1H6Qb5mZmZmDauWY5qOKi6TtA7JXcL/Xqv9mpmZmdVCXcc0RcQq4HKSR5+YmZmZNY08BoJvQ40fFNyIdr5+59W/b3X2XVWrd9qOI6tWl5mZmXWslgPBLy8uAoYBRwDX12q/ZmZmZrVQyx6f9xXNrwLeAP4L6PTKOjMzM7NGU8uB4AfVqm4zMzOzeqv5mCZJgyV9IJ0G13p/jagnY5g8ZsnMzKwx1HJM04bAD4ATWZOcrZT0M+CLEfFWrfZtZmbVUfzFbeQL03KKxCx/texpupzkQb0fIrmh5SDgI2nZd2u4XzMzM7Oqq+VA8KOBYyJiSqbsbklLgFuAz9dw32ZmZmZVVcuepg2A2SXK56TLzMzMzJpGLZOmqcAFkvoXCiStD5yfLjMzMzNrGrU8PXcGcC8wQ9IzadmuwDLggzXcr5mZmVnV1fI+Tc9J2g44HtgxLb4JuDEiltRqv2ZmZma1UMtbDowDZkfEtUXln5I0OCIurdW+zczMzKqtlmOaTgFeKFH+Z+DUGu7XzMzMrOpqOaZpKDCrRPkbJA/uNTOzco0fWDS/IJ84zHqxWvY0vQrsX6J8f2BmDfdrZmZmVnW1TJquBa6UdLKkd6XTp4Ar0mVWJ35+nZmZWc/V8vTct4F3AP8LrJeWLQUujYiLa7hfMzMzs6qrWU9TJM4CBgP7ktyjadOIuLBW+zQzq4SkcZKekLRI0hxJkyTtULROf0lXSZorabGkWyUNyStmM6u/Wp6eAyAiFkfEExHxfEQsq/X+zMwqMAq4iuQL3mFAX+A3kjbMrHMFyQPIj03XHw7cVuc4zSxHNU+aekrSgZLukDRTUkgaU7Rcki6UNEvSEkn3pzfVNDMrS0SMjoiJEfHniHgGGAtsCewBIGkg8GngqxExOSKeAk4G3i9p37ziNrP6avikCdgQeAY4rYPlXwe+RHLvp32AN4H7ss+8a1Q7X7/zmpniy4nNLE+FD+S89OceJL1P9xdWiIgXgFeA/eobmpnlpZYDwasiIu4B7gGQ1G6ZkoIzgG9FxK/TshOB2cAY4OY6hmpmLUDSOsCVwKMR8XxaPBRYHhHzi1afnS4rVU8/oF+maOPqRmpm9dYMPU2d2Zqkwcp++1sAPIa//ZlZZa4CdgI+3sN6xgELMtOMHtZnZjlr9qSp8A1vdlF5h9/+IPkGKGlAYcLfAM0MkDQBOBI4KCKySc7rwHqSBhVtMiRdVsrFJKf5CtOI6kZrZvXW7ElTpfwN0MxWSy8omQAcBRwcES8XrfIUsAI4JLPNDiSDxaeWqjMilkXEwsIELKpN9GZWL82eNBW+4RXfK6Wzb3/gb4Bm1t5VwCeB44BFkoam0/qw+rT/dcDlkg6StAfwU2BqRPwht6jNrK6aPWl6mSQ5yn77G0ByFV3Jb3/gb4BmtpbPk3yBmkLyoPHC9LHMOl8B7gRuBR4iaXs+WtcozSxXDX/1nKSNgG0zRVtL2g2YFxGvSLoSOFfSiyRJ1EUkDwSeVOdQzaxJRYTKWGcpya1POrr9iZm1uIZPmoA9gQcy85enP68nuQHdZST3croGGAQ8AoxOG7jGNX4gbL1l3lGYmZlZmRo+aYqIKUCH3wIjIoDz0snMzMysJho+aTIzs7W1e6IAcEtOcZj1Js0+ENzMzMysLpw0mZmZmZXBSZOZmZlZGZw0mZmZmZXBSZOZmZlZGZw01cL4gXlHUHXTdhyZdwhmZma5ctJkZmZmVgYnTWZmZmZlcNJkZmZmVgYnTQ1gq7PvWruwxLio4jsANzuPkzIzs2bipMnMzMysDE6azMzMzMrgB/aamVldFZ+aH/nCtJwiMese9zRVSb3HG5UcB1Wm4garkrFFHo9kZma9jZMmMzMzszI4aTIzMzMrg8c0mZkZUHqYwS05xGHWqNzTVA3pPZXyHOfTkzFOZmZm1jUnTWZmZmZl8Ok5M7PeqvjJA1tvmU8cZk3CPU1mZmZmZXDS1EAKgzAL45OygzK7O2apVB2lnmfXSOpxvyjfX8rMzCrlpMnMzMysDB7TZGZmDae4d336JUfkFInZGu5pMjMzMyuDe5rMzBpMqTGM0/tXv95q1NkoSo1X9IOArdrc09TMigd2dzVfpKzB5eMHrjVAvZSOHgKc9003ezTwu8EHzleDB8abmZXPPU1mZlZTxY9nqejRLEVfYnYuuqdUrR73UvzFol69Vx7T1Zjc02RmZmZWhpbpaZJ0GvA1YCjwDPDFiHg836jMrJW4nSlDqdPavtN4O800/qqZYq2HluhpkvQx4HLgAmB3ksbsPknvzDWwHJR6Snm5tjr7rrLHMHVaR1fKHCtUPC6q3Ye3m+O3OlLq5p9VHedTxXFR03YcmfsYsd7M7YyZtUTSBHwVuDYifhoRfwFOBd4CPpVvWGbWQtzOmPVyTX96TtJ6wB7AxYWyiFgl6X5gv9wCM7OW4XamY810G4O1Yz1urXUqGWDe1aDtWgyET8oWVFJT3ZU6A/LcSc/lEEnPNX3SBGwG9AFmF5XPBnYstYGkfkC/TNHGAAsXLuz2zlcte4uFClYuWcnilSuTOpa1n1+17K215gvbFM8vXrmyZJ0d1VFunYW4WLiw/TbF813Flb5Gq+tMdVpn8etaFEdxHV3VWbKOdL5YV/soHGt36uyWatSRKn4PqlVnNeurtgaKra7tzKplb61VtlDRbn7lkpXt5hevbD9faj/F9XZVZzn1dlVnvWItrjPXWIvWqVWs1WpbOlNOrF0p9XfVQJ/tbsWiiBJvRBORNBx4DXh/REzNlF8GjIqIfUpsMx44v25BmllPjYiI1/LaudsZs16hy3amFXqa/gWsBIYUlQ8BXu9gm4tJBnRmbQrM62JfGwMzgBHAou6F2ZBa7XjAx9QsunNMGwMzax5R5+rRzrTi+wyteVyteEzQu4+rrHam6ZOmiFgu6SngEGASgKR10vkJHWyzDFhWVNxl/5ykwq+LIqJx+hYr1GrHAz6mZtHNY8r9mOvRzrTi+wyteVyteEzQ64+rrONt+qQpdTlwvaQngceBM4ANgZ/mGZSZtRS3M2a9XEskTRHxC0mDgQtJbjr3NDA6IooHbZqZVcTtjJm1RNIEEBET6KCbvIqWkdzYrrjLvVm12vGAj6lZNOUx1bidacrXpAyteFyteEzg4+pS0189Z2ZmZlYPrXJHcDMzM7OactJkZmZmVgYnTWZmZmZlcNJUJkmnSZouaamkxyTtnXdM5ZI0TtITkhZJmiNpkqQditaZIimKph/lFXNXJI0vEe8LmeX9JV0laa6kxZJulVR8Y8KGkf5tFR9PSLoqXd7w74+kAyXdIWlmGt+YouWSdKGkWZKWSLpf0nZF62wq6UZJCyXNl3SdpI3qeiA5aeY2plhXn89mUY2/6UZUxnFNLPH+3ZtTuGUp8/9cj/8vOGkqg6SPkdyj5QJgd+AZ4D5J78w1sPKNAq4C9gUOA/oCv5G0YdF61wLDMtPX6xlkBf5M+3g/kFl2BfAh4FiS4x8O3FbvALthL9ofy2Fp+S8z6zT6+7MhyWfjtA6Wfx34EnAqsA/wJsnnKPuI1xuB95Ic/5HAgcA1tQq4UbRAG1NKZ5/PZlGNv+lG1NVxAdxL+/fvE3WIqyfK+T/X8/8LEeGpiwl4DJiQmV+H5DlUZ+cdW4XHMxgI4MBM2RTgyrxj68YxjAee7mDZQGA5cEymbMf0mPfNO/Yyj+9K4CXWXOHabO9PAGMy8wJmAWcWvU9LgY+n8yPT7fbMrDMaWAUMz/uYavx6tVob0+Hns1mnSv6mm2EqPq60bCIwKe/Yenhc7f7PVev/gnuauiBpPWAP4P5CWUSsSuf3yyuuHhqY/ix+Btbxkv4l6XlJF0vaoN6BddN2affyP9JTOlum5XuQfMvIvmcvAK/QBO9Z+jf3SeAnkX6yU832/mRtTXJDyOx7soAkWSi8J/sB8yPiycx295MkTWs9ELdVtGgbAx1/PltFOX/TzawtPc31V0k/lPSOvAPqpuL/c1X5v9AyN7esoc2APkDxXX9nk2SpTUXJ87KuBB6NiOczi34O/JPkgYW7AJcCOwAfrXeMZXoMGAv8laTr+HzgYUk7kTRkyyNiftE2s9NljW4MMIjk215Bs70/xQqve6nP0dDMOnOyCyPibUnzaI73rVIt1cakOvx8RkSrPAi2nL/pZnUvyWmrl4FtgP8B7pG0X0SszDWyMnTwf64q/xecNPU+VwE7UTS+ICKy40aekzQL+J2kbSLi7/UMsBwRcU9m9llJj5EkFf8JLMknqqr5NHBPRKx+4nazvT/Wu3Xx+bwun6isXBFxc2b2OUnPAn8H2oDf5RJU95T8P1cNPj3XtX8BK4HiEfZDgNfrH07lJE0gGVx7UETM6GL1x9Kf29Y2qupIvz38jSTe14H1JA0qWq3h3zNJ7wIOBX7cxapN9f6w5nXv7HP0OtBu4LOkdYFNafD3rYdapo3pSNHns1WU8zfdEiLiHyR/pw3//nXyf64q/xecNHUhIpYDTwGHFMrSrr9DgKl5xdUd6WWxE4CjgIMj4uUyNtst/TmrZoFVUXpZ+jYk8T4FrKD9e7YDsCWN/56dTHKK6q4u1tst/dkU7w9JN//rtH9PBpCMVSq8J1OBQZL2yGx3MEk79RgtqhXamK4UfT5bRTl/0y1B0gjgHTTw+1fG/7mq/F/w6bnyXA5cL+lJ4HHgDJJLNn+aZ1DdcBVwHPARYJGkwvnbBRGxRNI26fK7gbkkY2auAB6KiGfzCLgrkr4D3EHS5T+c5FLtlcBNEbFA0nXA5el4mIXAD4CpEfGHvGLuSvqP8mTg+oh4O1PeFO9P+o8x+010a0m7AfMi4hVJVwLnSnqR5B/ORSRjtCYBRMS09F4w10o6lWTQ5gTg5uypyhbV7G1MO519PvOMq7t6+jfdqDo7rnQ6H7iVJCncBriM5Gre++obabd0+n+uav8X8r4ssFkm4HSSBmAZybfeffKOqRuxRwfT2HT5FsCDJP+QlwIvknxIBuQdeyfHdDNJ47QMmJHOb5NZ3j/9EM0juXfKbcDQvOPu4pg+mL4v2xeVN8X7QzLeodTf2cR0uYALSRripSRXsRQf66Ykg94XAQuAnwAb5X1sdXr9mraNKXEsnX4+m2Wqxt90I06dHRewPklyNIfkEv3pJPdKG5J33F0cU6f/59J1evx/oXAPGDMzMzPrhMc0mZmZmZXBSZOZmZlZGZw0mZmZmZXBSZOZmZlZGZw0mZmZmZXBSZOZmZlZGZw0mZmZmZXBSZOZmZlZGZw0WcUkTZQ0Ke84qiV9dtE1kuZJivSxAnnFslXeMZhVyp+lfEkaKum3kt6UND8tC0lj0t973WtSLX72nNkao4GxJI8YKDzVu+YkTQQGRcSYTPGrwLB6xWBWZf4s5esrJMe8G8njiEjn/51XQK3CSZP1OpLWi+TJ8sW2AWZFxO/rHVOxiFhJ8jwrs2bkz1IdSOobEStKLNoGeCoiXiwURERLvgb15tNzLUDSaEmPSJovaa6kOyVtk1n+e0mXFm0zWNIKSQem88Mk3SVpiaSXJR0nabqkM7oRRz9J35c0R9LSNKa9itZ5bxrfQkmLJD2cjbVo3ba0C/kISc+mdf5B0k5F630grWeJpFfTGDbMLJ8u6ZuSfiZpIcnDJ4v3NZHkiddbpvucntn2jKJ1n5Y0PjMfkj4j6XZJb0l6UdKHyznutJ6TgI+k9UR63Gt1n0saJelxScskzZJ0iaR1M8unpMd+WXpa5PVsnGb10Bs+S0qMl/RKWsdMSd/v5DUZnx7rKWkb9ZakWyQNLFrvM5KmpW3dC5K+kFlWOI6PSXpQ0lLg+BL7mg4cDZyYrj8x89qO6STGnSTdI2mxpNmSbpC0WUfr91ZOmlrDhsDlwJ7AIcAq4HZJhff3RuDjkpTZ5mMkTyF/OJ3/GTCcpDv9aOBzwDu7Gcdl6bYnAbsDLwH3SdoUQNLmwEMkTz4/GNiD5Cn2XfV4fhv4L2Av4A3gDkl90zq3Ae4FbgV2SY/rA8CEojrOBJ4B3gdcVGIfXwbOI3ki+7B0X91xPnBLGsPdwI1lHvd30u3uTfc7DFjr23lax93AE8CuwOeBTwPnFq16EsnTu/cBvg6cJ+mwbh6LWU/0hs/S0SSnwE4BtgPGAM91cVzbAv8JfIjk9OX7gP/NxHU8cCFwDjAS+AZwkaSTiuq5BPheus59JfazF8lrcAvJa/DlLuJC0iBgMvAnkv8jo4EhaR2WFRGeWmwCNgMC2CmdHwysAA7IrPN74JL09x3T9ffMLN82LTujk/1MBCalv28ILAeOyyzvC7wGfC2d/x+S8Q19yzyOtjSGj2XKNgXeAv4znf8xcHXRdh8AVgL90/npwO1l7O8MYHpR2fTi1wB4GhifmQ/gosz8hmnZ6HKOO/s6Zsq2SuvYLZ3/b+AFQJl1vgAsAtZJ56cADxfV83jhffbkqV5Tq3+WgK8Cf+1GWzYeeBvYPFM2Om2nhqbzLwGfKNruXOD3Rcfx5TL2NwmYWFQWwJgOXpNzgfuK1h+RrrN93n9PjTS5p6kFSNpO0k2S/qHk9NP0dNGWABHxBvAb0q5cSVsD+5H0QAHsQPKB/mOhzoh4ie4NGtyGJEl6NFPHCpKGZmRatBtJQ1TqHHxnpmbqnEfSWBXq3BUYm3YpL5a0mOTb1zrA1pk6nuzmPrvr2UyMbwILWdNTtxuVHXfWSGBqpK1Z6lFgI5LGba04UrPofo+hWZ6a4bP0S2B94B+SrpV0VPb0XgdeiYjXMvNTSdqpHZQMJ9gGuK6oLTs3Lc+qRVu2K3BQ0b5fSJeVHD7RW3kgeGu4A/gn8FmSU27rAM8D62XWuRH4vqQvAscBz0VEV93J1bakBnVuBFwNlBpP8Erm9zcrrH8VoKKyviXWK27EgzWnv2tx3B3pLA6zPLXMZykiXpW0A3AocBjJabavSRpVYUK3Ufrzs8BjRctWFs1X2pZ1tf87gLNKLJtVg/01LTemTU7SO0h6ir4VEb+LiGnAJiVW/TXQn6RL+DjW9DJB0nOzLsk59kK923ZQT0f+TnJ6bv9MHX1Jzq//JS16FjigMB6pG/bN1LkJsD0wLS36I/CeiHipxFTqCrnueoNkXEBh/wNo34NVjq6OeznQp4s6pgH7FY1L25/klMKMbsZjloeW+ixFxJKIuCMivkQylGA/YOdONtlS0vDM/L4kieRfI2I2yRfed5dox14uN6Ye+CPwXpJTqsX7r0WS1rScNDW/fwNzgc9J2lbSwSSDwttJ//AnkQyCHgnclFn2AnA/cI2kvSW9j+QKsyUk3666lNb/Q+DbSq7mew9wLbABcF262gRgAHCzpD3T04onpN/YOnOepEOUXDU3keR+K5PSZZcC75c0QdJuaZ0fkVQ8ELxSk4ETJB0gaWfgetb+5teVro57OrCLpB0kbdbBP4T/BbYAfiBpR0kfAS4ALo+IVZUcmFmdtcxnSdJYSZ9Orzh7N/BJkvbyn51sthS4XtKukg4g6R2/JdbcCuB8YJykL0naXtLOkk6W9NVyYuqhq0jGi94kaS8lVyMeLumnkrpKQnsVJ01NLv2Qf5zkKpLngSuAr3Ww+o0k564fjohXipadCMwmuTLldpKEZxHJB71cZ5NcxXYDyTeXbYHDI+LfaaxzSa542Qh4EHiKpDu6q+7ss0muFnkKGAp8qNCLFBHPAqNIep8eJrn640KSb23VcHEa653AXSTJ2t+7U0EZx30tSW/fkyTfxvcvUcdrwH8Ae5NcBfgjkmT0W908HrO8tNJnaX6630dJer8OJWmX5nayzUvAbSRX7v0m3W71LQUi4sfAZ4CTSa7Ee5DkBqE172mKiJkkr1WfNLbngCtJjtNfyjLUfiycWULSCJI76R4aEb/LKYY24AFgk4iYn0cMZmY9peQeT2MiYrecQ7Ee8kBwAyA9rbcRyTeMYST3XJpO0vNkZmbW6zlpsoK+JPdAeTfJabnfA8f38NJeMzOzluHTc2ZmZmZl8EBwMzMzszI4aTIzMzMrg5MmMzMzszI4aTIzMzMrg5MmMzMzszI4aTIzMzMrg5MmMzMzszI4aTIzMzMrg5MmMzMzszL8/xW8MfaTfzxPAAAAAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "draw_projects([\"julia/\"+name for name in julia_srcs[:]], 'jl')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 162,
- "id": "e6395f28-52d9-4462-829b-16b016a4e9fc",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- julia/JuliaDB.jl/src\n",
- "julia/JuliaDB.jl/src\n",
- "number of functions: 106\n",
- "number of internal functions: 82\n",
- "ndirs,nfiles,loc: 0 20 3113\n",
- "copy=1: 70\n",
- "copy=2: 25\n",
- "copy=3: 5\n",
- "310: 0\n",
- "--- julia/HTTP.jl/src\n",
- "julia/HTTP.jl/src\n",
- "number of functions: 65\n",
- "number of internal functions: 36\n",
- "ndirs,nfiles,loc: 0 38 7513\n",
- "copy=1: 56\n",
- "copy=2: 6\n",
- "copy=3: 1\n",
- "310: 0\n",
- "--- julia/Flux.jl/src\n",
- "julia/Flux.jl/src\n",
- "number of functions: 84\n",
- "number of internal functions: 41\n",
- "ndirs,nfiles,loc: 5 33 6408\n",
- "copy=1: 71\n",
- "copy=2: 9\n",
- "copy=3: 1\n",
- "310: 2\n",
- "--- julia/LightGraphs.jl/src\n",
- "julia/LightGraphs.jl/src\n",
- "number of functions: 242\n",
- "number of internal functions: 101\n",
- "ndirs,nfiles,loc: 27 110 16963\n",
- "copy=1: 190\n",
- "copy=2: 46\n",
- "copy=3: 1\n",
- "310: 0\n"
- ]
- }
- ],
- "source": [
- "for dirname in julia_srcs:\n",
- " gen_table('julia/'+dirname, 'jl')"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "5497beb1-4d7d-4af9-a214-bd6cc5627483",
- "metadata": {
- "tags": []
- },
- "source": [
- "# JS Project"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 109,
- "id": "8e053588-fee5-4dae-bd67-da37b8b8391d",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['request/lib',\n",
- " 'koa/lib',\n",
- " 'json-server/src',\n",
- " 'axios/lib',\n",
- " 'marked/src',\n",
- " 'reveal.js/js']"
- ]
- },
- "execution_count": 109,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "js_srcs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "3e00e769-8536-4fd8-b914-23ccd45fc658",
- "metadata": {},
- "outputs": [],
- "source": [
- "file2cg(\"js/request/lib/auth.js\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "1f101c42-cf0c-4f5a-aa98-283f1c7186ba",
- "metadata": {},
- "outputs": [],
- "source": [
- "draw_projects([\"js/\"+name for name in js_srcs[:3]], 'js')"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "97097630-f563-4b49-8964-b07a9c0877d9",
- "metadata": {},
- "source": [
- "# Racket Project"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "8acf51aa-ffca-4de2-85e8-4ffea011bcd5",
- "metadata": {},
- "source": [
- "# Jupyter Projects"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "67d1d634-15b0-47a2-b9dc-e24ed84ef728",
- "metadata": {},
- "source": [
- "# Python Projects"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 585,
- "id": "6f714a81-b23e-45a7-b889-2b07a69de6e5",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['you-get/src/you_get', 'cookiecutter/cookiecutter', 'locust/locust', 'requests/requests', 'keras/keras', 'youtube-dl/youtube_dl']"
- ]
- },
- "execution_count": 585,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "py_srcs"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 84,
- "id": "35965e8d-a616-4911-bc75-027d65a529fb",
- "metadata": {
- "tags": []
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "ndirs,nfiles,loc: 8 133 14707\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "(8, 133, 14707)"
- ]
- },
- "execution_count": 84,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "dirstats('python/you-get/src/you_get', 'py')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 489,
- "id": "ba239e9e-c466-488e-a856-4c79ddc278fe",
- "metadata": {
- "collapsed": true,
- "jupyter": {
- "outputs_hidden": true
- },
- "tags": []
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- " 122 text files.\n",
- " 122 unique files. \n",
- " 13 files ignored.\n",
- "\n",
- "github.com/AlDanial/cloc v 1.82 T=0.08 s (1460.6 files/s, 177548.5 lines/s)\n",
- "-------------------------------------------------------------------------------\n",
- "Language files blank comment code\n",
- "-------------------------------------------------------------------------------\n",
- "Python 121 2358 1328 11023\n",
- "-------------------------------------------------------------------------------\n",
- "SUM: 121 2358 1328 11023\n",
- "-------------------------------------------------------------------------------\n"
- ]
- }
- ],
- "source": [
- "!cloc 'python/you-get/src/you_get'"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 90,
- "id": "8b0d8ece-3f1c-48ed-ac1a-7630cae6224c",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "python/you-get/src/you_get\n",
- "number of functions: 444\n",
- "ndirs,nfiles,loc: 8 133 14707\n",
- "copy=1: 413\n",
- "copy=2: 18\n",
- "copy=3: 6\n",
- "310: 3\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "draw_project('python/you-get/src/you_get', 'py')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 158,
- "id": "2f2fca82-5130-431f-a294-1fc491562fcd",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "parsing projects ..\n",
- "python/you-get/src/you_get\n",
- "python/cookiecutter/cookiecutter\n",
- "python/locust/locust\n",
- "python/requests/requests\n",
- "plotting ..\n"
- ]
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGGCAYAAABmPbWyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJCUlEQVR4nO3debxd49338c83kaENEdpIaKTcpElKippLRlPuoqKmojV2oBS9b0XuqrGtsakW1YdqpRVUH6SPIlI0qkRMN6JCaQVBIhXJScgk+T1/rLWTdXbOsM85ez7f9+u1X+es6Vq/tfbZ1/nta13rWooIzMzMzKxlXSodgJmZmVktcNJkZmZmVgAnTWZmZmYFcNJkZmZmVgAnTWZmZmYFcNJkZmZmVgAnTWZmZmYFcNJkZmZmVoD1Kh1ANZAkYDNgcaVjMbN1bAC8HTU+Eq/rGbOqVlA946QpsRkwp9JBmFmzBgBvVTqIDnI9Y1bdWq1nnDQlFgO8+eab9O7du9KxmFmqoaGBzTffHOqjdcb1jFkVaks946Qpo3fv3q7MzKykXM+Y1S4nTWZFsmrVKlauXFnpMGpat27d6Nq1a6XDMDNrkpMmsyJYsmQJc+bMocb7KlecJAYMGMD6669f6VDMzNbhpMmsg1atWsWcOXP4+Mc/Tt++fUlukrK2igjmz5/PnDlzGDRokFuczKzqOGkqomEThzWannnszApFYuW0cuVKIoK+ffvysY99rNLh1LS+ffsye/ZsVq5c6aSpiLJ1k+sls/bz4JZmReIWpo7zOTSzauakycxatHDhQm6//fZKh2FmVnG+PGdWZFucc0+Hy5h96f5FiKQ4cknT4YcfXulQzMwqyi1NZjXm9NNP57HHHgNg6tSpjB8/nq9+9auMHDmS/fffn/fff5/Zs2dz6KGHAsmdfaNGjVqnnKlTp7LDDjtw2GGHMWLECGbPns2yZcv46le/ypgxY/jSl75EQ0MD1113HQ8//DCjRo3ixRdfLOehmplVFSdNZjXm2GOP5eabbwZg0qRJ9OrViwEDBvDwww/zla98hauvvrqgcs477zwefPBBbr75Zt58800AfvWrXzFmzBgeeughjj76aK6//npOPvlkRo4cybRp0/jsZz9bsuMyM6t2vjxnVmM+//nP8+KLL7Jo0SLefPNNhg4dys477wzAzjvvzNSpUxt1qM6NHbVgwQK+/OUvA/CHP/yBVatWsfHGGwOw7bbbAvDiiy/y5JNP8tvf/paVK1cyfPjwch6amVlVc9JkVoMOOOAATjrpJA466CA+9alP8cQTT3DIIYfw5JNPMmjQIPr06cNbbyXPnXzuuecA2HjjjZk2bdqaMrp27cr7779Pr169+Pvf/w7AkCFD2H333fna174GJMMpvPvuu6xataq8B2hmVoV8ec6sBh199NHcddddHHnkkYwbN44333yTESNGcOutt3Lqqaey4YYbssMOOzB8+HCmTJnSZBkXXXQRe+21F0ceeST9+/enW7dufPOb3+TPf/4zY8aMYcyYMUydOpVNN92UpUuXcuihh/LKK6+U+UjNzKqHW5rMiqwcd75JYuzYsWyyySYA3HLLLeus84tf/KLFMkaPHs0zzzzD8uXL2Xnnnenfvz9du3blt7/97TrrNpd4mZl1Jm5pMqsxjz76KF/+8pc566yzOlTO5MmTGTVqFLvvvjtnnHGGR+A2M2uFW5rMaswee+yxZsiBjjjssMM47LDDihCRmVnn4JYmMzMzswI4aTIzMzMrgJMmMzMzswI4aTLrJG666SauueaadeZNnz69w2Vff/31a36fPHky7777bofLNDOrNu4IblZsF2xYhDIWdbyMAhx33HFFKef666/nm9/8JpAkTVtvvfWa4RBasnr1arp08Xc3M6sNrq3MakxEcMoppzB8+HBGjx7NI488wp577skee+zBJZdcAsCcOXPYe++9GTFiBKeeemqj7d9//32++MUv8uyzz3LBBRfwpz/9CYAf//jHjBw5khEjRjBz5kwA7r33XnbbbTdGjRrF7373O6ZNm8aZZ54JwAsvvMBxxx3HXXfdxcsvv8yoUaP40Y9+xJQpUzj++OM566yzmnwA8OzZsxkxYgRHHHEEl112WRnPnJlZx7ilyazG3H333XTp0oVHHnkEgAMPPJAbbriBIUOGsN9++3HkkUdy5ZVXcuaZZzJ27FhOPPFE/vrXvwIwf/58jjzySH7yk5+wzTbbMHnyZCBJgF5++WUefvhh3n77bU4++WTuuusuxo8fzyOPPELv3r1ZvXr1mnKyDj74YAYPHrzmES2vvPIKZ555Jttuuy3XXHMNY8aM4YQTTuD3v/89119/PYceeihvvfUWDzzwAN27dy/LOTMzKwYnTWY1ZtasWYwcOXLN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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "draw_projects(['python/' + name for name in py_srcs[:]], 'py')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 159,
- "id": "036e58cb-b716-4db6-9d86-26a6c2046e71",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- python/you-get/src/you_get\n",
- "python/you-get/src/you_get\n",
- "number of functions: 444\n",
- "number of internal functions: 273\n",
- "ndirs,nfiles,loc: 8 133 14707\n",
- "copy=1: 413\n",
- "copy=2: 18\n",
- "copy=3: 6\n",
- "310: 3\n",
- "--- python/cookiecutter/cookiecutter\n",
- "python/cookiecutter/cookiecutter\n",
- "number of functions: 51\n",
- "number of internal functions: 30\n",
- "ndirs,nfiles,loc: 0 18 2139\n",
- "copy=1: 50\n",
- "copy=2: 0\n",
- "copy=3: 0\n",
- "310: 0\n",
- "--- python/locust/locust\n",
- "python/locust/locust\n",
- "number of functions: 529\n",
- "number of internal functions: 144\n",
- "ndirs,nfiles,loc: 10 59 18671\n",
- "copy=1: 445\n",
- "copy=2: 71\n",
- "copy=3: 8\n",
- "310: 3\n",
- "--- python/requests/requests\n",
- "python/requests/requests\n",
- "number of functions: 135\n",
- "number of internal functions: 73\n",
- "ndirs,nfiles,loc: 0 18 5183\n",
- "copy=1: 112\n",
- "copy=2: 13\n",
- "copy=3: 4\n",
- "310: 1\n"
- ]
- }
- ],
- "source": [
- "for dirname in py_srcs:\n",
- " gen_table('python/'+dirname, 'py')"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "456c566a-032c-4785-be92-f1644bb1c827",
- "metadata": {
- "tags": []
- },
- "source": [
- "# Search GitHub API"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 436,
- "id": "bbb4df60-8c6e-43b8-b5e4-c56a118db3cd",
- "metadata": {},
- "outputs": [],
- "source": [
- "from github import Github"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 462,
- "id": "5d88ef6e-4927-4552-bf84-42588e46dc84",
- "metadata": {},
- "outputs": [],
- "source": [
- "g = Github()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 465,
- "id": "c05ba6fc-e5e9-4cc9-827e-c32d5931ce02",
- "metadata": {},
- "outputs": [],
- "source": [
- "repositories = g.search_repositories(query='language:python')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 444,
- "id": "3383a997-7060-4a53-b191-02e77b10d6cc",
- "metadata": {},
- "outputs": [],
- "source": [
- "repo = repositories.get_page(0)[0]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 445,
- "id": "4aee7c04-c5db-44dc-8f9f-26d67b492d4b",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "154199"
- ]
- },
- "execution_count": 445,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "repo.stargazers_count"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 446,
- "id": "ed248175-f841-43e1-8893-7e0e6c38ea53",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'Python'"
- ]
- },
- "execution_count": 446,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "repo.language"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 447,
- "id": "8538df6f-fa65-4178-8431-dd807e9f85e9",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'https://api.github.com/repos/public-apis/public-apis/languages'"
- ]
- },
- "execution_count": 447,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "repo.languages_url"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 448,
- "id": "acccf0ab-eb00-4994-b428-8b1fa1904467",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'Python': 9180, 'Shell': 1318}"
- ]
- },
- "execution_count": 448,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "repo.get_languages()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 454,
- "id": "533c80b7-8eab-4e82-80a0-cefc3e1b4e8f",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'public-apis/public-apis'"
- ]
- },
- "execution_count": 454,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "repo.full_name"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 459,
- "id": "00b273c4-b951-4877-8382-f76f48108e6a",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'https://github.com/public-apis/public-apis'"
- ]
- },
- "execution_count": 459,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "repo.html_url"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 450,
- "id": "9ebc61f2-f0b4-49bb-a034-569c66a965de",
- "metadata": {},
- "outputs": [],
- "source": [
- "page0 = repositories.get_page(0)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 466,
- "id": "378cfb83-b716-43d9-b071-56842a743b26",
- "metadata": {},
- "outputs": [],
- "source": [
- "pages = [repositories.get_page(n) for n in range(5)]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 464,
- "id": "1e289354-d3a0-4088-9519-0d652a1df15c",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "4"
- ]
- },
- "execution_count": 464,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "len(pages)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 452,
- "id": "32517143-4902-4896-aeba-bbb4c92e5e3b",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "30"
- ]
- },
- "execution_count": 452,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "len(page0)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 474,
- "id": "161b9c4d-7e1c-488e-b36f-4645aff1167f",
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "RateLimit(core=Rate(reset=2021-09-02 02:05:23, remaining=4850, limit=5000))"
- ]
- },
- "execution_count": 474,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "g.get_rate_limit()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 478,
- "id": "683d41b8-084b-4ecb-b9b6-3366bcf3f9cc",
- "metadata": {
- "tags": []
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "154199\n",
- "142632\n",
- "115937\n",
- "107653\n",
- "102209\n",
- "99626\n",
- "71100\n",
- "63727\n",
- "59408\n",
- "56477\n",
- "52266\n",
- "51819\n",
- "51190\n",
- "50602\n",
- "49696\n",
- "47027\n",
- "46391\n",
- "45916\n",
- "45371\n",
- "41576\n",
- "41441\n",
- "41256\n",
- "41070\n",
- "40257\n",
- "39900\n",
- "38225\n",
- "36974\n",
- "35444\n",
- "33865\n",
- "33155\n"
- ]
- }
- ],
- "source": [
- "for r in pages[0]:\n",
- " print(r.stargazers_count)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 468,
- "id": "bd12b1bc-0b41-4563-b768-2a4b6b318cac",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- https://github.com/public-apis/public-apis\n",
- "{'Python': 9180, 'Shell': 1318}\n",
- "--- https://github.com/donnemartin/system-design-primer\n",
- "{'Python': 57260, 'Shell': 1189}\n",
- "--- https://github.com/TheAlgorithms/Python\n",
- "{'Python': 1985576}\n",
- "--- https://github.com/jackfrued/Python-100-Days\n",
- "{'Python': 233308, 'HTML': 165120, 'Jupyter Notebook': 160626, 'Java': 4679, 'CSS': 673, 'JavaScript': 410}\n",
- "--- https://github.com/vinta/awesome-python\n",
- "{'Python': 2959, 'Makefile': 237}\n",
- "--- https://github.com/ytdl-org/youtube-dl\n",
- "{'Python': 5746549, 'Shell': 8791, 'Makefile': 6235, 'ActionScript': 4300, 'Batchfile': 633}\n",
- "--- https://github.com/tensorflow/models\n",
- "{'Python': 17403678, 'Jupyter Notebook': 1332902, 'C++': 346501, 'Shell': 94621, 'Starlark': 77138, 'Dockerfile': 10147}\n",
- "--- https://github.com/nvbn/thefuck\n",
- "{'Python': 538514, 'Dockerfile': 536, 'Shell': 134}\n",
- "--- https://github.com/django/django\n",
- "{'Python': 14747963, 'HTML': 225466, 'JavaScript': 143010, 'CSS': 85335, 'Shell': 809, 'Smarty': 392, 'Makefile': 125}\n",
- "--- https://github.com/pallets/flask\n",
- "{'Python': 516134, 'HTML': 405, 'Shell': 61, 'CSS': 18}\n",
- "--- https://github.com/keras-team/keras\n",
- "{'Python': 8876894, 'Starlark': 209095, 'Shell': 10760, 'Dockerfile': 407}\n",
- "--- https://github.com/httpie/httpie\n",
- "{'Python': 305054, 'Shell': 5757, 'Makefile': 5066, 'Ruby': 3675}\n",
- "--- https://github.com/josephmisiti/awesome-machine-learning\n",
- "{'Python': 1150}\n",
- "--- https://github.com/huggingface/transformers\n",
- "{'Python': 17875067, 'Shell': 31024, 'Dockerfile': 7040, 'Makefile': 3155, 'Jsonnet': 937}\n",
- "--- https://github.com/ansible/ansible\n",
- "{'Python': 9532267, 'PowerShell': 797320, 'Shell': 226130, 'C#': 207122, 'Jinja': 39223, 'Makefile': 14041, 'Tcl': 2459, 'Go': 2010, 'Roff': 371, 'Dockerfile': 329, 'Batchfile': 144}\n",
- "--- https://github.com/scikit-learn/scikit-learn\n",
- "{'Python': 9575910, 'Cython': 643974, 'C++': 146835, 'Shell': 47294, 'C': 41206, 'Makefile': 1711}\n",
- "--- https://github.com/521xueweihan/HelloGitHub\n",
- "{'Python': 9431}\n",
- "--- https://github.com/psf/requests\n",
- "{'Python': 330471, 'Makefile': 818}\n",
- "--- https://github.com/home-assistant/core\n",
- "{'Python': 36742907, 'Shell': 4910, 'Dockerfile': 1795}\n",
- "--- https://github.com/soimort/you-get\n",
- "{'Python': 560070, 'Shell': 2649, 'Makefile': 805}\n",
- "--- https://github.com/scrapy/scrapy\n",
- "{'Python': 1877301, 'HTML': 2790, 'Roff': 2010, 'Shell': 259}\n",
- "--- https://github.com/ageitgey/face_recognition\n",
- "{'Python': 34987, 'Dockerfile': 6838, 'Makefile': 2286}\n",
- "--- https://github.com/minimaxir/big-list-of-naughty-strings\n",
- "{'Python': 1808, 'Go': 1378, 'Shell': 271, 'Makefile': 161}\n",
- "--- https://github.com/apache/superset\n",
- "{'Python': 5070983, 'TypeScript': 2966209, 'JavaScript': 1867705, 'HTML': 139971, 'Less': 120229, 'Shell': 116308, 'Dockerfile': 6948, 'Jinja': 5616, 'Smarty': 3403, 'Makefile': 3304, 'Pug': 2969, 'Mako': 1197, 'CSS': 1082}\n",
- "--- https://github.com/python/cpython\n",
- "{'Python': 31748006, 'C': 17888061, 'C++': 367517, 'HTML': 188400, 'M4': 177928, 'Batchfile': 73746, 'Shell': 56282, 'Assembly': 49121, 'Roff': 39480, 'Makefile': 32308, 'Objective-C': 26873, 'Common Lisp': 24579, 'PLSQL': 22886, 'PowerShell': 20248, 'Rich Text Format': 7579, 'DTrace': 2196, 'XSLT': 153, 'CSS': 96, 'VBScript': 70}\n",
- "--- https://github.com/deepfakes/faceswap\n",
- "{'Python': 2566988, 'NSIS': 15409, 'Shell': 14204}\n",
- "--- https://github.com/3b1b/manim\n",
- "{'Python': 655057, 'GLSL': 35504, 'TeX': 998}\n",
- "--- https://github.com/tiangolo/fastapi\n",
- "{'Python': 1445257, 'Shell': 1703, 'Dockerfile': 506, 'HTML': 187, 'CSS': 25}\n",
- "--- https://github.com/localstack/localstack\n",
- "{'Python': 2338156, 'Java': 12420, 'Makefile': 10460, 'HCL': 4973, 'Dockerfile': 4326, 'Shell': 2971, 'JavaScript': 2203, 'C#': 1338, 'Ruby': 39, 'Batchfile': 27}\n",
- "--- https://github.com/fighting41love/funNLP\n",
- "{'Python': 365}\n"
- ]
- }
- ],
- "source": [
- "for r in pages[0]:\n",
- " print('---', r.html_url)\n",
- " print(r.get_languages())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 470,
- "id": "7ab16dbc-861d-4d59-8e30-972cf078664d",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- https://github.com/shadowsocks/shadowsocks\n",
- "{'Python': 157279, 'Shell': 16430}\n",
- "--- https://github.com/0voice/interview_internal_reference\n",
- "{'Python': 1228}\n",
- "--- https://github.com/isocpp/CppCoreGuidelines\n",
- "{'Python': 9035, 'C++': 7842, 'Makefile': 5692}\n",
- "--- https://github.com/apachecn/AiLearning\n",
- "{'Python': 894998, 'JavaScript': 23728, 'CSS': 22379, 'Jupyter Notebook': 13938, 'HTML': 2539, 'Shell': 469, 'Dockerfile': 49}\n",
- "--- https://github.com/pandas-dev/pandas\n",
- "{'Python': 17246911, 'Cython': 1082605, 'HTML': 456275, 'C': 358927, 'Shell': 10511, 'Smarty': 7638, 'Dockerfile': 1690, 'CSS': 1438, 'XSLT': 1196, 'Makefile': 507, 'Batchfile': 127}\n",
- "--- https://github.com/XX-net/XX-Net\n",
- "{'Python': 21968984, 'HTML': 251940, 'CSS': 95047, 'C': 83222, 'JavaScript': 22405, 'PowerShell': 17719, 'Shell': 14686, 'VBScript': 6489, 'Batchfile': 5510}\n",
- "--- https://github.com/floodsung/Deep-Learning-Papers-Reading-Roadmap\n",
- "{'Python': 4592}\n",
- "--- https://github.com/testerSunshine/12306\n",
- "{'Python': 190210, 'Shell': 961, 'Dockerfile': 778}\n",
- "--- https://github.com/swisskyrepo/PayloadsAllTheThings\n",
- "{'Python': 203302, 'Ruby': 15242, 'ASP.NET': 9206, 'Classic ASP': 3372, 'PHP': 3285, 'Jupyter Notebook': 611, 'Shell': 264, 'HTML': 253, 'XSLT': 136, 'JavaScript': 16}\n",
- "--- https://github.com/CorentinJ/Real-Time-Voice-Cloning\n",
- "{'Python': 258028}\n",
- "--- https://github.com/faif/python-patterns\n",
- "{'Python': 119697, 'Makefile': 1865, 'Shell': 432}\n",
- "--- https://github.com/google-research/bert\n",
- "{'Python': 214335, 'Jupyter Notebook': 66488}\n",
- "--- https://github.com/getsentry/sentry\n",
- "{'Python': 16043214, 'TypeScript': 8069216, 'JavaScript': 2522961, 'HTML': 213187, 'Less': 155231, 'Lua': 65885, 'Shell': 25783, 'PEG.js': 11737, 'Dockerfile': 6487, 'Makefile': 4793, 'EJS': 2944, 'Ruby': 648}\n",
- "--- https://github.com/willmcgugan/rich\n",
- "{'Python': 1098780, 'Batchfile': 799, 'Makefile': 267}\n",
- "--- https://github.com/iperov/DeepFaceLab\n",
- "{'Python': 905244}\n",
- "--- https://github.com/certbot/certbot\n",
- "{'Python': 2937478, 'Shell': 119761, 'Batchfile': 26046, 'Makefile': 23145, 'NSIS': 9851, 'Augeas': 7528, 'Dockerfile': 2223, 'PowerShell': 1450, 'DIGITAL Command Language': 557, 'Smarty': 342, 'Standard ML': 256}\n",
- "--- https://github.com/satwikkansal/wtfpython\n",
- "{'Python': 20994}\n",
- "--- https://github.com/fxsjy/jieba\n",
- "{'Python': 7349705, 'OpenEdge ABL': 6770809}\n",
- "--- https://github.com/chubin/cheat.sh\n",
- "{'Python': 176289, 'Shell': 80113, 'HTML': 3323, 'Dockerfile': 746, 'CSS': 625, 'Vim script': 237}\n",
- "--- https://github.com/sherlock-project/sherlock\n",
- "{'Python': 68047, 'Dockerfile': 685}\n",
- "--- https://github.com/d2l-ai/d2l-zh\n",
- "{'Python': 345387, 'HTML': 60631, 'TeX': 60314, 'Shell': 1115}\n",
- "--- https://github.com/openai/gym\n",
- "{'Python': 627401, 'Dockerfile': 706, 'Shell': 484}\n",
- "--- https://github.com/gto76/python-cheatsheet\n",
- "{'Python': 624125, 'HTML': 331258, 'JavaScript': 277668, 'CSS': 3062}\n",
- "--- https://github.com/facebookresearch/Detectron\n",
- "{'Python': 674867, 'CMake': 34081, 'Cython': 9364, 'C++': 2781, 'MATLAB': 1821, 'Cuda': 1685, 'Dockerfile': 742, 'Makefile': 487}\n",
- "--- https://github.com/mitmproxy/mitmproxy\n",
- "{'Python': 1934754, 'TypeScript': 255918, 'JavaScript': 120510, 'Less': 20380, 'HTML': 10379, 'CSS': 3618, 'Shell': 2462, 'Kaitai Struct': 1912, 'Dockerfile': 612, 'PowerShell': 258}\n",
- "--- https://github.com/geekcomputers/Python\n",
- "{'Python': 893564, 'Jupyter Notebook': 281286, 'Tcl': 11987, 'Java': 1607}\n",
- "--- https://github.com/hankcs/HanLP\n",
- "{'Python': 1982539, 'Cython': 18426, 'Java': 14414}\n",
- "--- https://github.com/donnemartin/interactive-coding-challenges\n",
- "{'Python': 1449488, 'C++': 654}\n",
- "--- https://github.com/0xAX/linux-insides\n",
- "{'Python': 1786, 'Shell': 792, 'Dockerfile': 60}\n",
- "--- https://github.com/docker/compose\n",
- "{'Python': 1107882, 'Shell': 34381, 'Groovy': 12229, 'PowerShell': 7139, 'Dockerfile': 2920, 'Makefile': 1573}\n"
- ]
- }
- ],
- "source": [
- "for r in pages[1]:\n",
- " print('---', r.html_url)\n",
- " print(r.get_languages())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 471,
- "id": "4010c7ea-1c56-4a75-927d-0cd89f733a98",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- https://github.com/ycm-core/YouCompleteMe\n",
- "{'Python': 487139, 'Vim script': 185231, 'Shell': 3185, 'Dockerfile': 2552, 'Makefile': 184}\n",
- "--- https://github.com/apache/airflow\n",
- "{'Python': 17191925, 'Shell': 695518, 'TypeScript': 173946, 'HTML': 148765, 'JavaScript': 133896, 'Dockerfile': 38684, 'Jinja': 30966, 'CSS': 26649, 'HCL': 3786, 'Jupyter Notebook': 2933, 'Mako': 1339}\n",
- "--- https://github.com/pypa/pipenv\n",
- "{'Python': 6423523, 'Roff': 161596, 'Makefile': 6942, 'PowerShell': 2265, 'Shell': 1652, 'HTML': 1343, 'Dockerfile': 887, 'Batchfile': 503}\n",
- "--- https://github.com/psf/black\n",
- "{'Python': 4799700, 'Vim script': 6540, 'Jupyter Notebook': 2848, 'Dockerfile': 688}\n",
- "--- https://github.com/encode/django-rest-framework\n",
- "{'Python': 1441804, 'HTML': 85944, 'CSS': 40078, 'JavaScript': 18061}\n",
- "--- https://github.com/littlecodersh/ItChat\n",
- "{'Python': 122052}\n",
- "--- https://github.com/yunjey/pytorch-tutorial\n",
- "{'Python': 72066, 'Shell': 449}\n",
- "--- https://github.com/donnemartin/data-science-ipython-notebooks\n",
- "{'Python': 19488744, 'CSS': 1612, 'Makefile': 684, 'Dockerfile': 191}\n",
- "--- https://github.com/trailofbits/algo\n",
- "{'Python': 68021, 'Jinja': 62306, 'Shell': 17755, 'Dockerfile': 1289, 'Makefile': 777}\n",
- "--- https://github.com/explosion/spaCy\n",
- "{'Python': 3219491, 'Cython': 716529, 'JavaScript': 233024, 'Sass': 56639, 'HTML': 26303, 'Jinja': 10297, 'Makefile': 1576, 'Shell': 984}\n",
- "--- https://github.com/sqlmapproject/sqlmap\n",
- "{'Python': 2021166, 'C': 13823, 'Shell': 12504, 'HTML': 5762, 'Perl': 2136, 'C++': 1641, 'PLpgSQL': 536, 'TSQL': 466}\n",
- "--- https://github.com/matterport/Mask_RCNN\n",
- "{'Python': 199107}\n",
- "--- https://github.com/eriklindernoren/ML-From-Scratch\n",
- "{'Python': 251183}\n",
- "--- https://github.com/tornadoweb/tornado\n",
- "{'Python': 1547041, 'Shell': 4070, 'C': 1524, 'Cython': 780, 'HTML': 25}\n",
- "--- https://github.com/google/python-fire\n",
- "{'Python': 375704, 'Shell': 1445}\n",
- "--- https://github.com/beurtschipper/Depix\n",
- "{'Python': 16953}\n",
- "--- https://github.com/keon/algorithms\n",
- "{'Python': 665724}\n",
- "--- https://github.com/wangzheng0822/algo\n",
- "{'Python': 148296, 'C': 144551, 'C++': 131943, 'Java': 101378, 'Scala': 97442, 'Rust': 77415, 'Go': 73304, 'PHP': 69589, 'JavaScript': 62356, 'C#': 41255, 'TypeScript': 38704, 'Objective-C': 27661, 'Swift': 23431, 'Kotlin': 14585, 'HTML': 1582, 'Shell': 35}\n",
- "--- https://github.com/getredash/redash\n",
- "{'Python': 1183687, 'JavaScript': 989782, 'TypeScript': 521669, 'Less': 196599, 'HTML': 32910, 'Shell': 4613, 'Dockerfile': 3283, 'CSS': 2382, 'Makefile': 1291, 'Mako': 494}\n",
- "--- https://github.com/tqdm/tqdm\n",
- "{'Python': 281154, 'Jupyter Notebook': 41153, 'Roff': 7997, 'Makefile': 5166, 'Shell': 946}\n",
- "--- https://github.com/nicolargo/glances\n",
- "{'Python': 834410, 'JavaScript': 62045, 'HTML': 40035, 'SCSS': 4243, 'Dockerfile': 3708, 'Batchfile': 3366, 'PowerShell': 2786, 'Makefile': 2303, 'Shell': 1190, 'Smarty': 459, 'Less': 63}\n",
- "--- https://github.com/sebastianruder/NLP-progress\n",
- "{'Python': 13681, 'HTML': 1298, 'Ruby': 72}\n",
- "--- https://github.com/StevenBlack/hosts\n",
- "{'Python': 128391, 'Batchfile': 3156, 'Dockerfile': 283}\n",
- "--- https://github.com/drduh/macOS-Security-and-Privacy-Guide\n",
- "{'Python': 2806}\n",
- "--- https://github.com/OWASP/CheatSheetSeries\n",
- "{'Python': 13144, 'Shell': 8089, 'HTML': 4341, 'Java': 1988, 'Makefile': 520}\n",
- "--- https://github.com/numpy/numpy\n",
- "{'Python': 9783386, 'C': 5474611, 'Cython': 147831, 'C++': 95833, 'JavaScript': 16928, 'Shell': 13540, 'Fortran': 11108, 'sed': 5741, 'Dockerfile': 5129, 'Makefile': 4271, 'Smarty': 4071, 'TeX': 896, 'D': 19}\n",
- "--- https://github.com/celery/celery\n",
- "{'Python': 2464754, 'Shell': 28731, 'Dockerfile': 4296, 'Batchfile': 4227, 'Makefile': 4110, 'PowerShell': 2787}\n",
- "--- https://github.com/facebookresearch/detectron2\n",
- "{'Python': 2941680, 'Cuda': 112955, 'C++': 81431, 'Shell': 13407, 'Dockerfile': 3525, 'JavaScript': 1980, 'CMake': 910}\n",
- "--- https://github.com/microsoft/cascadia-code\n",
- "{'Python': 21439}\n",
- "--- https://github.com/deezer/spleeter\n",
- "{'Python': 138717, 'Dockerfile': 7944, 'TeX': 5650, 'Jupyter Notebook': 3967, 'Shell': 386}\n"
- ]
- }
- ],
- "source": [
- "for r in pages[2]:\n",
- " print('---', r.html_url)\n",
- " print(r.get_languages())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 472,
- "id": "61a2cf86-d2ab-4fda-b23a-0aa87bc19ccc",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- https://github.com/pytorch/examples\n",
- "{'Python': 244484, 'C++': 54958, 'Shell': 5849, 'CMake': 5737}\n",
- "--- https://github.com/jumpserver/jumpserver\n",
- "{'Python': 3766903, 'CSS': 392599, 'Less': 20864, 'Shell': 6733, 'Dockerfile': 1680}\n",
- "--- https://github.com/PaddlePaddle/Paddle\n",
- "{'Python': 21619650, 'C++': 19193518, 'Cuda': 2754405, 'CMake': 583864, 'Shell': 469201, 'C': 88824, 'Batchfile': 58905, 'Go': 43724, 'Dockerfile': 4361, 'R': 1332}\n",
- "--- https://github.com/luong-komorebi/Awesome-Linux-Software\n",
- "{'Python': 9874}\n",
- "--- https://github.com/python-telegram-bot/python-telegram-bot\n",
- "{'Python': 2950273, 'Makefile': 591, 'Shell': 86}\n",
- "--- https://github.com/open-mmlab/mmdetection\n",
- "{'Python': 3804745, 'Shell': 45713, 'Dockerfile': 2148, 'Batchfile': 760, 'Makefile': 634}\n",
- "--- https://github.com/python-poetry/poetry\n",
- "{'Python': 1330954, 'HTML': 234349, 'Makefile': 1852, 'Shell': 658}\n",
- "--- https://github.com/reddit-archive/reddit\n",
- "{'Python': 3814709, 'JavaScript': 1878352, 'HTML': 785352, 'CSS': 402042, 'Shell': 66047, 'C': 23485, 'PigLatin': 16564, 'Makefile': 7780, 'Java': 5817, 'Thrift': 2050, 'Ruby': 870}\n",
- "--- https://github.com/toml-lang/toml\n",
- "{'Python': 8808}\n",
- "--- https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix\n",
- "{'Python': 165798, 'Jupyter Notebook': 15927, 'Shell': 4676, 'MATLAB': 2063, 'TeX': 1963}\n",
- "--- https://github.com/bokeh/bokeh\n",
- "{'Python': 4440089, 'TypeScript': 3033914, 'HTML': 61430, 'GLSL': 40928, 'Less': 31294, 'JavaScript': 20647, 'CSS': 8924, 'Shell': 2578, 'Batchfile': 1344, 'Makefile': 773}\n",
- "--- https://github.com/chubin/wttr.in\n",
- "{'Python': 243004, 'Go': 43610, 'Shell': 19326, 'SaltStack': 2629, 'HTML': 2307, 'Dockerfile': 1533, 'CSS': 548}\n",
- "--- https://github.com/ultralytics/yolov5\n",
- "{'Python': 340625, 'Shell': 3992, 'Dockerfile': 2601}\n",
- "--- https://github.com/tzutalin/labelImg\n",
- "{'Python': 155904, 'Shell': 4891, 'Makefile': 520}\n",
- "--- https://github.com/cookiecutter/cookiecutter\n",
- "{'Python': 255234, 'Makefile': 2376, 'Shell': 289, 'Batchfile': 116}\n",
- "--- https://github.com/PyTorchLightning/pytorch-lightning\n",
- "{'Python': 3093680, 'Dockerfile': 27596, 'Shell': 8166, 'Jsonnet': 1591, 'Makefile': 983}\n",
- "--- https://github.com/nginx-proxy/nginx-proxy\n",
- "{'Python': 62195, 'Shell': 10515, 'Dockerfile': 2478, 'Makefile': 472}\n",
- "--- https://github.com/binux/pyspider\n",
- "{'Python': 594223, 'JavaScript': 56310, 'HTML': 25020, 'CSS': 11931, 'Lua': 6394, 'Dockerfile': 1398}\n",
- "--- https://github.com/plotly/dash\n",
- "{'Python': 1131976, 'TypeScript': 808823, 'JavaScript': 573665, 'Less': 21801, 'CSS': 16844, 'HTML': 1733, 'Shell': 217}\n",
- "--- https://github.com/mingrammer/diagrams\n",
- "{'Python': 203877, 'JavaScript': 8191, 'Shell': 1806, 'Dockerfile': 824, 'CSS': 519}\n",
- "--- https://github.com/spotify/luigi\n",
- "{'Python': 2103807, 'JavaScript': 174458, 'HTML': 43446, 'CSS': 5575, 'Shell': 2973}\n",
- "--- https://github.com/openai/gpt-2\n",
- "{'Python': 21268}\n",
- "--- https://github.com/PaddlePaddle/PaddleOCR\n",
- "{'Python': 1946637, 'C++': 448075, 'Java': 65626, 'CMake': 12427, 'Makefile': 4499, 'Dockerfile': 3350, 'Shell': 1326}\n",
- "--- https://github.com/chriskiehl/Gooey\n",
- "{'Python': 316503}\n",
- "--- https://github.com/shimohq/chinese-programmer-wrong-pronunciation\n",
- "{'Python': 1787}\n",
- "--- https://github.com/quantopian/zipline\n",
- "{'Python': 4086027, 'Jupyter Notebook': 162383, 'Shell': 8632, 'Batchfile': 5070, 'PowerShell': 3280, 'Dockerfile': 2495, 'Emacs Lisp': 138}\n",
- "--- https://github.com/matplotlib/matplotlib\n",
- "{'Python': 6834871, 'C++': 597123, 'Jupyter Notebook': 95488, 'Objective-C': 73753, 'JavaScript': 33743, 'C': 12327, 'CSS': 7337, 'HTML': 4170, 'Shell': 2291, 'PostScript': 1782, 'TeX': 855, 'Lua': 137}\n",
- "--- https://github.com/zulip/zulip\n",
- "{'Python': 8936976, 'JavaScript': 3606834, 'HTML': 712660, 'CSS': 471786, 'Handlebars': 327640, 'TypeScript': 249647, 'Shell': 132688, 'Puppet': 95976, 'Perl': 9884, 'Dockerfile': 4898, 'Ruby': 3875, 'Emacs Lisp': 157}\n",
- "--- https://github.com/google/jax\n",
- "{'Python': 4858061, 'C++': 175472, 'Jupyter Notebook': 98803, 'Cython': 61670, 'Starlark': 21780, 'Shell': 5930, 'C': 5305, 'Dockerfile': 1553}\n",
- "--- https://github.com/wangshub/wechat_jump_game\n",
- "{'Python': 83784, 'Makefile': 104}\n"
- ]
- }
- ],
- "source": [
- "for r in pages[3]:\n",
- " print('---', r.html_url)\n",
- " print(r.get_languages())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 473,
- "id": "11a1f775-01a1-4b94-8dbc-9fe58cae6805",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "--- https://github.com/chriskiehl/Gooey\n",
- "{'Python': 316503}\n",
- "--- https://github.com/cool-RR/PySnooper\n",
- "{'Python': 191117, 'Shell': 113}\n",
- "--- https://github.com/shimohq/chinese-programmer-wrong-pronunciation\n",
- "{'Python': 1787}\n",
- "--- https://github.com/quantopian/zipline\n",
- "{'Python': 4086027, 'Jupyter Notebook': 162383, 'Shell': 8632, 'Batchfile': 5070, 'PowerShell': 3280, 'Dockerfile': 2495, 'Emacs Lisp': 138}\n",
- "--- https://github.com/matplotlib/matplotlib\n",
- "{'Python': 6834871, 'C++': 597123, 'Jupyter Notebook': 95488, 'Objective-C': 73753, 'JavaScript': 33743, 'C': 12327, 'CSS': 7337, 'HTML': 4170, 'Shell': 2291, 'PostScript': 1782, 'TeX': 855, 'Lua': 137}\n",
- "--- https://github.com/zulip/zulip\n",
- "{'Python': 8936976, 'JavaScript': 3606834, 'HTML': 712660, 'CSS': 471786, 'Handlebars': 327640, 'TypeScript': 249647, 'Shell': 132688, 'Puppet': 95976, 'Perl': 9884, 'Dockerfile': 4898, 'Ruby': 3875, 'Emacs Lisp': 157}\n",
- "--- https://github.com/google/jax\n",
- "{'Python': 4858061, 'C++': 175472, 'Jupyter Notebook': 98803, 'Cython': 61670, 'Starlark': 21780, 'Shell': 5930, 'C': 5305, 'Dockerfile': 1553}\n",
- "--- https://github.com/mirumee/saleor\n",
- "{'Python': 8129091, 'HTML': 239399, 'Dockerfile': 2169, 'Shell': 439}\n",
- "--- https://github.com/wangshub/wechat_jump_game\n",
- "{'Python': 83784, 'Makefile': 104}\n",
- "--- https://github.com/alievk/avatarify-python\n",
- "{'Python': 49602, 'Jupyter Notebook': 18682, 'Shell': 8083, 'Dockerfile': 1882, 'Batchfile': 1155}\n",
- "--- https://github.com/bregman-arie/devops-exercises\n",
- "{'Python': 14507, 'HTML': 1980, 'Groovy': 577, 'Shell': 349}\n",
- "--- https://github.com/Kr1s77/awesome-python-login-model\n",
- "{'Python': 284629}\n",
- "--- https://github.com/pytorch/fairseq\n",
- "{'Python': 3126869, 'Cuda': 38166, 'C++': 21106, 'Cython': 13294, 'Lua': 4210, 'Shell': 2182}\n",
- "--- https://github.com/Jack-Cherish/python-spider\n",
- "{'Python': 254891, 'JavaScript': 8801, 'HTML': 5688}\n",
- "--- https://github.com/magic-wormhole/magic-wormhole\n",
- "{'Python': 871920, 'JavaScript': 38865, 'CSS': 1229, 'Batchfile': 838, 'Shell': 713, 'HTML': 478}\n",
- "--- https://github.com/kivy/kivy\n",
- "{'Python': 3234925, 'Cython': 1100000, 'C': 328380, 'Shell': 25168, 'Objective-C': 22091, 'Emacs Lisp': 9839, 'Makefile': 5494, 'PowerShell': 4846, 'Vim script': 2120, 'GLSL': 323}\n",
- "--- https://github.com/miloyip/game-programmer\n",
- "{'Python': 8701, 'Makefile': 542, 'Shell': 83}\n",
- "--- https://github.com/facebook/prophet\n",
- "{'Python': 259597, 'R': 151630, 'Stan': 11173, 'Dockerfile': 252, 'Makefile': 117, 'C++': 48}\n",
- "--- https://github.com/timgrossmann/InstaPy\n",
- "{'Python': 644473, 'JavaScript': 6147, 'CSS': 1453}\n",
- "--- https://github.com/jhao104/proxy_pool\n",
- "{'Python': 69369, 'Dockerfile': 569, 'Shell': 77}\n",
- "--- https://github.com/fabric/fabric\n",
- "{'Python': 294520}\n",
- "--- https://github.com/rsms/inter\n",
- "{'Python': 334601, 'C': 171920, 'Shell': 34123, 'Makefile': 22739, 'Objective-C++': 8598, 'JavaScript': 2945, 'Dockerfile': 906}\n",
- "--- https://github.com/joke2k/faker\n",
- "{'Python': 4486891, 'Shell': 853, 'Makefile': 165}\n",
- "--- https://github.com/youfou/wxpy\n",
- "{'Python': 135314}\n",
- "--- https://github.com/wting/autojump\n",
- "{'Python': 135478, 'Shell': 9764, 'Makefile': 1615, 'Batchfile': 1264, 'Lua': 861}\n",
- "--- https://github.com/mnielsen/neural-networks-and-deep-learning\n",
- "{'Python': 99389}\n",
- "--- https://github.com/powerline/powerline\n",
- "{'Python': 878555, 'Shell': 68588, 'Vim script': 17923, 'C': 3795, 'Lua': 436}\n",
- "--- https://github.com/mkdocs/mkdocs\n",
- "{'Python': 463285, 'JavaScript': 116324, 'HTML': 30293, 'CSS': 11175}\n",
- "--- https://github.com/jupyter/jupyter\n",
- "{'Python': 1711}\n",
- "--- https://github.com/Eloston/ungoogled-chromium\n",
- "{'Python': 143738, 'Shell': 3115}\n"
- ]
- }
- ],
- "source": [
- "for r in pages[4]:\n",
- " print('---', r.html_url)\n",
- " print(r.get_languages())"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "bae1a0ac-0110-4815-a5f9-69f8d7a24986",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.10"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/api/.gitignore b/api/.gitignore
index 7e052379..6818fb0e 100644
--- a/api/.gitignore
+++ b/api/.gitignore
@@ -1,3 +1,5 @@
dist/
conns/conn-*.json
-prisma/dev.db
\ No newline at end of file
+prisma/dev.db
+example-repo/
+public/
\ No newline at end of file
diff --git a/compose/README.md b/api/.npmignore
similarity index 100%
rename from compose/README.md
rename to api/.npmignore
diff --git a/api/Dockerfile b/api/Dockerfile
deleted file mode 100644
index 774000e4..00000000
--- a/api/Dockerfile
+++ /dev/null
@@ -1,18 +0,0 @@
-FROM node:18 AS builder
-WORKDIR /app
-COPY package.json .
-COPY yarn.lock .
-RUN yarn install --frozen-lockfile
-COPY . .
-RUN yarn build
-
-FROM node:18 AS server
-WORKDIR /app
-COPY package.json .
-COPY yarn.lock .
-RUN yarn install --production
-COPY prisma ./prisma
-RUN yarn run prisma generate
-COPY --from=builder ./app/build ./build
-EXPOSE 4000
-CMD ["yarn", "start"]
\ No newline at end of file
diff --git a/api/README.md b/api/README.md
deleted file mode 100644
index a42cb372..00000000
--- a/api/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# CP Kernel
-
-This is a package designed for code sharing between the codepod API and the electron server.
-
-To use the kernel:
-If you use `yarn`, you can run `yarn add link:/path/to/cpkernel`. However, this will not work with npm. For `npm`, you need to run `npm link` in cpkernel folder to register the package globally, and run `npm link cpkernel` to link. This won't reflect in package.json.
-
-Thus the ideal setup should be to add cpkernel to package.json, but not to install it. Instead, run `npm link cpkernel` during development.
-
-# CodePod Repo Server
-
-# Using Prisma and PostgreSQL
-
-## Spin up the container
-
-```bash
-docker-compose up -d
-```
-
-This will create postgreSQL, listening on [http://localhost:5432](http://localhost:5432). The username and password is stored in the `.env` file. The template is copied here:
-
-```properties
-NEO4J_URI=bolt://localhost:7687
-NEO4J_USER=neo4j
-NEO4J_PASSWORD=codepod123
-
-GRAPHQL_SERVER_PORT=4000
-GRAPHQL_SERVER_PATH=/graphql
-GRAPHQL_SERVER_HOST=0.0.0.0
-
-JWT_SECRET=
-
-POSTGRES_USER=
-POSTGRES_PASSWORD=
-POSTGRES_DB=
-DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?schema=public
-```
-
-## Prisma
-
-Need to run migrate for the first time if the DB is not initialized on a new server.
-
-migrate DB:
-
-```bash
-npx prisma migrate dev --name init
-```
-
-create another migration with just a different name:
-
-```bash
-prisma migrate dev --name added_job_title
-```
-
-generate client (the migrate will run this, so no need anymore. But do not
-forget to do this after changing the schema, otherwise you'll end up with debugging
-strange errors):
-
-```bash
-npx prisma generate
-```
-
-The studio can be viewed at
-
-```bash
-npx prisma studio
-```
-
-When I mess up with the database and want to start from scratch:
-
-```bash
-npx prisma db push --preview-feature
-```
-
-## Building node-pty
-
-Install nvm and node, yarn as usual. Though running `yarn` may fail (to build
-node-pty) due to missing development packages. On Ubuntu, fixing it by running:
-
-```bash
-sudo apt install -y make python build-essential
-```
diff --git a/api/fixup b/api/fixup
deleted file mode 100755
index 73070169..00000000
--- a/api/fixup
+++ /dev/null
@@ -1,11 +0,0 @@
-cat >dist/cjs/package.json <dist/mjs/package.json <=8",
- "npm": ">=6"
- }
- },
- "node_modules/@apollographql/graphql-playground-html": {
- "version": "1.6.26",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz",
- "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==",
- "dependencies": {
- "xss": "^1.0.6"
- }
- },
- "node_modules/@apollographql/graphql-upload-8-fork": {
- "version": "8.1.3",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz",
- "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==",
- "dependencies": {
- "@types/express": "*",
- "@types/fs-capacitor": "*",
- "@types/koa": "*",
- "busboy": "^0.3.1",
- "fs-capacitor": "^2.0.4",
- "http-errors": "^1.7.3",
- "object-path": "^0.11.4"
- },
- "engines": {
- "node": ">=8.5"
- },
- "peerDependencies": {
- "graphql": "0.13.1 - 15"
- }
- },
- "node_modules/@josephg/resolvable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz",
- "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg=="
- },
- "node_modules/@prisma/client": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.5.0.tgz",
- "integrity": "sha512-LuaaisknLe9CCfJ1Rtqe9b9knvPgEEcC77OMmWdo3fSanxl5oTDxcH3IIhpULQQlJfZvDcaEXuXNU4dsNF+q1w==",
- "hasInstallScript": true,
- "dependencies": {
- "@prisma/engines-version": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e"
- },
- "engines": {
- "node": ">=12.6"
- },
- "peerDependencies": {
- "prisma": "*"
- },
- "peerDependenciesMeta": {
- "prisma": {
- "optional": true
- }
- }
- },
- "node_modules/@prisma/engines": {
- "version": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e",
- "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e.tgz",
- "integrity": "sha512-MqZUrxuLlIbjB3wu8LrRJOKcvR4k3dunKoI4Q2bPfAwLQY0XlpsLZ3TRVW1c32ooVk939p6iGNkaCUo63Et36g==",
- "hasInstallScript": true
- },
- "node_modules/@prisma/engines-version": {
- "version": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e",
- "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e.tgz",
- "integrity": "sha512-X16YmBmj7Omso4ZbkNBe6gPYlNcnwZMUPtXsguCkn+KoMqm3DJD9M4X31gx0Gf13Q44dY3SKPJZUk44/XUj/WA=="
- },
- "node_modules/@protobufjs/aspromise": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
- },
- "node_modules/@protobufjs/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
- },
- "node_modules/@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
- },
- "node_modules/@protobufjs/eventemitter": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
- "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
- },
- "node_modules/@protobufjs/fetch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
- "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
- "dependencies": {
- "@protobufjs/aspromise": "^1.1.1",
- "@protobufjs/inquire": "^1.1.0"
- }
- },
- "node_modules/@protobufjs/float": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
- },
- "node_modules/@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
- },
- "node_modules/@protobufjs/path": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
- },
- "node_modules/@protobufjs/pool": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
- },
- "node_modules/@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
- },
- "node_modules/@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "dev": true,
- "dependencies": {
- "defer-to-connect": "^1.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@types/accepts": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
- "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
- },
- "node_modules/@types/cookies": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
- "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
- "dependencies": {
- "@types/connect": "*",
- "@types/express": "*",
- "@types/keygrip": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/cors": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.8.tgz",
- "integrity": "sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w==",
- "dependencies": {
- "@types/express": "*"
- }
- },
- "node_modules/@types/express": {
- "version": "4.17.7",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz",
- "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==",
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "*",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.17",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz",
- "integrity": "sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ==",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "node_modules/@types/fs-capacitor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz",
- "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/http-assert": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
- "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
- },
- "node_modules/@types/http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q=="
- },
- "node_modules/@types/keygrip": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
- "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
- },
- "node_modules/@types/koa": {
- "version": "2.13.4",
- "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
- "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
- "dependencies": {
- "@types/accepts": "*",
- "@types/content-disposition": "*",
- "@types/cookies": "*",
- "@types/http-assert": "*",
- "@types/http-errors": "*",
- "@types/keygrip": "*",
- "@types/koa-compose": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/koa-compose": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
- "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
- "dependencies": {
- "@types/koa": "*"
- }
- },
- "node_modules/@types/long": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
- "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
- },
- "node_modules/@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
- },
- "node_modules/@types/node": {
- "version": "16.11.10",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz",
- "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA=="
- },
- "node_modules/@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
- },
- "node_modules/@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "node_modules/@types/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
- "dev": true
- },
- "node_modules/@types/strip-json-comments": {
- "version": "0.0.30",
- "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
- "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
- "dev": true
- },
- "node_modules/@types/ws": {
- "version": "7.4.7",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz",
- "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@wry/equality": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz",
- "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==",
- "dependencies": {
- "tslib": "^1.9.3"
- }
- },
- "node_modules/@wry/equality/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
- "node_modules/accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "dependencies": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.1.0"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/apollo-cache-control": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz",
- "integrity": "sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w==",
- "deprecated": "The functionality provided by the `apollo-cache-control` package is built in to `apollo-server-core` starting with Apollo Server 3. See https://www.apollographql.com/docs/apollo-server/migration/#cachecontrol for details.",
- "dependencies": {
- "apollo-server-env": "^3.1.0",
- "apollo-server-plugin-base": "^0.13.0"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-datasource": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.9.0.tgz",
- "integrity": "sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA==",
- "dependencies": {
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/apollo-graphql": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.9.5.tgz",
- "integrity": "sha512-RGt5k2JeBqrmnwRM0VOgWFiGKlGJMfmiif/4JvdaEqhMJ+xqe/9cfDYzXfn33ke2eWixsAbjEbRfy8XbaN9nTw==",
- "dependencies": {
- "core-js-pure": "^3.10.2",
- "lodash.sortby": "^4.7.0",
- "sha.js": "^2.4.11"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^14.2.1 || ^15.0.0"
- }
- },
- "node_modules/apollo-link": {
- "version": "1.2.14",
- "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz",
- "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==",
- "dependencies": {
- "apollo-utilities": "^1.3.0",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.9.3",
- "zen-observable-ts": "^0.8.21"
- },
- "peerDependencies": {
- "graphql": "^0.11.3 || ^0.12.3 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-link/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/apollo-reporting-protobuf": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz",
- "integrity": "sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg==",
- "dependencies": {
- "@apollo/protobufjs": "1.2.2"
- }
- },
- "node_modules/apollo-server": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-3.5.0.tgz",
- "integrity": "sha512-7NkCgK9wjyx/jAbdytId/EPwp+dU4Bn+nktZERh3PGU4sv3TO9Twlsg62eAw5FRRTYQglbGDlCIcx9o1bvg0Ww==",
- "dependencies": {
- "apollo-server-core": "^3.5.0",
- "apollo-server-express": "^3.5.0",
- "express": "^4.17.1"
- },
- "peerDependencies": {
- "graphql": "^15.3.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server-caching": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz",
- "integrity": "sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/apollo-server-core": {
- "version": "2.25.3",
- "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.25.3.tgz",
- "integrity": "sha512-Midow3uZoJ9TjFNeCNSiWElTVZlvmB7G7tG6PPoxIR9Px90/v16Q6EzunDIO0rTJHRC3+yCwZkwtf8w2AcP0sA==",
- "dependencies": {
- "@apollographql/apollo-tools": "^0.5.0",
- "@apollographql/graphql-playground-html": "1.6.27",
- "@apollographql/graphql-upload-8-fork": "^8.1.3",
- "@josephg/resolvable": "^1.0.0",
- "@types/ws": "^7.0.0",
- "apollo-cache-control": "^0.14.0",
- "apollo-datasource": "^0.9.0",
- "apollo-graphql": "^0.9.0",
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0",
- "apollo-server-errors": "^2.5.0",
- "apollo-server-plugin-base": "^0.13.0",
- "apollo-server-types": "^0.9.0",
- "apollo-tracing": "^0.15.0",
- "async-retry": "^1.2.1",
- "fast-json-stable-stringify": "^2.0.0",
- "graphql-extensions": "^0.15.0",
- "graphql-tag": "^2.11.0",
- "graphql-tools": "^4.0.8",
- "loglevel": "^1.6.7",
- "lru-cache": "^6.0.0",
- "sha.js": "^2.4.11",
- "subscriptions-transport-ws": "^0.9.19",
- "uuid": "^8.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-server-core/node_modules/@apollographql/graphql-playground-html": {
- "version": "1.6.27",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz",
- "integrity": "sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==",
- "dependencies": {
- "xss": "^1.0.8"
- }
- },
- "node_modules/apollo-server-core/node_modules/apollo-server-types": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz",
- "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==",
- "dependencies": {
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-server-env": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.1.0.tgz",
- "integrity": "sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ==",
- "dependencies": {
- "node-fetch": "^2.6.1",
- "util.promisify": "^1.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/apollo-server-errors": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz",
- "integrity": "sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==",
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-server-express": {
- "version": "2.19.2",
- "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.19.2.tgz",
- "integrity": "sha512-1v2H6BgDkS4QzRbJ9djn2o0yv5m/filbpiupxAsCG9f+sAoSlY3eYSj84Sbex2r5+4itAvT9y84WI7d9RBYs/Q==",
- "dependencies": {
- "@apollographql/graphql-playground-html": "1.6.26",
- "@types/accepts": "^1.3.5",
- "@types/body-parser": "1.19.0",
- "@types/cors": "2.8.8",
- "@types/express": "4.17.7",
- "@types/express-serve-static-core": "4.17.17",
- "accepts": "^1.3.5",
- "apollo-server-core": "^2.19.2",
- "apollo-server-types": "^0.6.3",
- "body-parser": "^1.18.3",
- "cors": "^2.8.4",
- "express": "^4.17.1",
- "graphql-subscriptions": "^1.0.0",
- "graphql-tools": "^4.0.0",
- "parseurl": "^1.3.2",
- "subscriptions-transport-ws": "^0.9.16",
- "type-is": "^1.6.16"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-server-plugin-base": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz",
- "integrity": "sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg==",
- "dependencies": {
- "apollo-server-types": "^0.9.0"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-server-plugin-base/node_modules/apollo-server-types": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz",
- "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==",
- "dependencies": {
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-server-types": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.3.tgz",
- "integrity": "sha512-aVR7SlSGGY41E1f11YYz5bvwA89uGmkVUtzMiklDhZ7IgRJhysT5Dflt5IuwDxp+NdQkIhVCErUXakopocFLAg==",
- "dependencies": {
- "apollo-reporting-protobuf": "^0.6.2",
- "apollo-server-caching": "^0.5.3",
- "apollo-server-env": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-server-types/node_modules/apollo-reporting-protobuf": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.2.tgz",
- "integrity": "sha512-WJTJxLM+MRHNUxt1RTl4zD0HrLdH44F2mDzMweBj1yHL0kSt8I1WwoiF/wiGVSpnG48LZrBegCaOJeuVbJTbtw==",
- "dependencies": {
- "@apollo/protobufjs": "^1.0.3"
- }
- },
- "node_modules/apollo-server-types/node_modules/apollo-server-caching": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.3.tgz",
- "integrity": "sha512-iMi3087iphDAI0U2iSBE9qtx9kQoMMEWr6w+LwXruBD95ek9DWyj7OeC2U/ngLjRsXM43DoBDXlu7R+uMjahrQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/apollo-server/node_modules/@apollographql/graphql-playground-html": {
- "version": "1.6.29",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz",
- "integrity": "sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==",
- "dependencies": {
- "xss": "^1.0.8"
- }
- },
- "node_modules/apollo-server/node_modules/@types/body-parser": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
- "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==",
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/apollo-server/node_modules/@types/cors": {
- "version": "2.8.12",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
- "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
- },
- "node_modules/apollo-server/node_modules/@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/apollo-server/node_modules/@types/express-serve-static-core": {
- "version": "4.17.24",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz",
- "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-datasource": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.0.tgz",
- "integrity": "sha512-It8POTZTOCAnedRj2izEVeySN06LIfojigZjWaOY7voLe0DIgtvhql91xr27fuIWsR/Ew9twO3dLBjjvy34J4Q==",
- "dependencies": {
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0"
- },
- "engines": {
- "node": ">=12.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-reporting-protobuf": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.2.0.tgz",
- "integrity": "sha512-2v/5IRJeTGakCJo8kS2LeKUcLsgqxO/HpEyu1EaW79F0CsvrIk10tOIGxouoOgtVl5e1wfGePJ849CUWWczx2A==",
- "dependencies": {
- "@apollo/protobufjs": "1.2.2"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-caching": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-3.3.0.tgz",
- "integrity": "sha512-Wgcb0ArjZ5DjQ7ID+tvxUcZ7Yxdbk5l1MxZL8D8gkyjooOkhPNzjRVQ7ubPoXqO54PrOMOTm1ejVhsF+AfIirQ==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=12.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.5.0.tgz",
- "integrity": "sha512-c3wEnPSnzvWvYvRJq1B+yIpa+vBvm0kq0tvD4j/IOw/F1s3sadu43Xr4FiLw++UfeLyh3aS5Wk68hjvrW1ceiQ==",
- "dependencies": {
- "@apollographql/apollo-tools": "^0.5.1",
- "@apollographql/graphql-playground-html": "1.6.29",
- "@graphql-tools/mock": "^8.1.2",
- "@graphql-tools/schema": "^8.0.0",
- "@graphql-tools/utils": "^8.0.0",
- "@josephg/resolvable": "^1.0.0",
- "apollo-datasource": "^3.3.0",
- "apollo-graphql": "^0.9.0",
- "apollo-reporting-protobuf": "^3.2.0",
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0",
- "apollo-server-errors": "^3.3.0",
- "apollo-server-plugin-base": "^3.4.0",
- "apollo-server-types": "^3.4.0",
- "async-retry": "^1.2.1",
- "fast-json-stable-stringify": "^2.1.0",
- "graphql-tag": "^2.11.0",
- "loglevel": "^1.6.8",
- "lru-cache": "^6.0.0",
- "sha.js": "^2.4.11",
- "uuid": "^8.0.0"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "graphql": "^15.3.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core/node_modules/@graphql-tools/mock": {
- "version": "8.4.3",
- "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.4.3.tgz",
- "integrity": "sha512-jj7obzDz4FAfmIGSh1Mo6cUs9d8MSaN6TH/iju3Qyuz6CZ6NLuJrWOg50ysEUgkT4Y/Aey8SlWOf/U15Z7qWYw==",
- "dependencies": {
- "@graphql-tools/schema": "^8.3.1",
- "@graphql-tools/utils": "^8.5.1",
- "fast-json-stable-stringify": "^2.1.0",
- "tslib": "~2.3.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core/node_modules/@graphql-tools/schema": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.1.tgz",
- "integrity": "sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==",
- "dependencies": {
- "@graphql-tools/merge": "^8.2.1",
- "@graphql-tools/utils": "^8.5.1",
- "tslib": "~2.3.0",
- "value-or-promise": "1.0.11"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core/node_modules/@graphql-tools/schema/node_modules/@graphql-tools/merge": {
- "version": "8.2.1",
- "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.1.tgz",
- "integrity": "sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==",
- "dependencies": {
- "@graphql-tools/utils": "^8.5.1",
- "tslib": "~2.3.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core/node_modules/@graphql-tools/utils": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz",
- "integrity": "sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==",
- "dependencies": {
- "tslib": "~2.3.0"
- },
- "peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core/node_modules/apollo-server-errors": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.0.tgz",
- "integrity": "sha512-9/MNlPZBbEjcCdJcUSbKbVEBT9xZS8GSpX7T/TyzcxHSbsXJszSDSipQNGC+PRKTKAUnv61IONScVyLKEZ5XEQ==",
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "graphql": "^15.3.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core/node_modules/apollo-server-plugin-base": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.4.0.tgz",
- "integrity": "sha512-Z9musk7Z/1v+Db6aOoxcHfmsgej2yEBzBz5kVGOc81/XAtdv6bjasKSLC3RiySAUzWSLBJRUeEGIEVhhk/j2Zg==",
- "dependencies": {
- "apollo-server-types": "^3.4.0"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "graphql": "^15.3.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-core/node_modules/apollo-server-types": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.4.0.tgz",
- "integrity": "sha512-iFNRENtxDoFWoY+KxpGP+TYyRnqUPqUTubMJVgiXPDvOPFL8dzqGGmqq1g/VCeWFHRJTPBLWhOfQU7ktwDEjnQ==",
- "dependencies": {
- "apollo-reporting-protobuf": "^3.2.0",
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "graphql": "^15.3.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-env": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-4.2.0.tgz",
- "integrity": "sha512-4xJ+PCoWsFLj4rU6iXrIhqD7nI42goi4Iqrhsof9680ljSzkzd+PCwZsja3mHOFXKUQQUvJ7StVSgwaiRu45+A==",
- "dependencies": {
- "node-fetch": "^2.6.1"
- },
- "engines": {
- "node": ">=12.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-express": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.5.0.tgz",
- "integrity": "sha512-eFyBC4ate/g5GrvxM+HrtiElxCEbvG+CiJ0/R1i62L+wzXDhgD6MU0SW17ceS1mpBJgDxURu/VS5hUSNyWMa3Q==",
- "dependencies": {
- "@types/accepts": "^1.3.5",
- "@types/body-parser": "1.19.1",
- "@types/cors": "2.8.12",
- "@types/express": "4.17.13",
- "@types/express-serve-static-core": "4.17.24",
- "accepts": "^1.3.5",
- "apollo-server-core": "^3.5.0",
- "apollo-server-types": "^3.4.0",
- "body-parser": "^1.19.0",
- "cors": "^2.8.5",
- "parseurl": "^1.3.3"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "express": "^4.17.1",
- "graphql": "^15.3.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-server/node_modules/apollo-server-express/node_modules/apollo-server-types": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.4.0.tgz",
- "integrity": "sha512-iFNRENtxDoFWoY+KxpGP+TYyRnqUPqUTubMJVgiXPDvOPFL8dzqGGmqq1g/VCeWFHRJTPBLWhOfQU7ktwDEjnQ==",
- "dependencies": {
- "apollo-reporting-protobuf": "^3.2.0",
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "graphql": "^15.3.0 || ^16.0.0"
- }
- },
- "node_modules/apollo-tracing": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.15.0.tgz",
- "integrity": "sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA==",
- "deprecated": "The `apollo-tracing` package is no longer part of Apollo Server 3. See https://www.apollographql.com/docs/apollo-server/migration/#tracing for details",
- "dependencies": {
- "apollo-server-env": "^3.1.0",
- "apollo-server-plugin-base": "^0.13.0"
- },
- "engines": {
- "node": ">=4.0"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-utilities": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz",
- "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==",
- "dependencies": {
- "@wry/equality": "^0.1.2",
- "fast-json-stable-stringify": "^2.0.0",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.10.0"
- },
- "peerDependencies": {
- "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/apollo-utilities/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/async-retry": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
- "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
- "dependencies": {
- "retry": "0.13.1"
- }
- },
- "node_modules/backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "node_modules/body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/body-parser/node_modules/http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/body-parser/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "node_modules/body-parser/node_modules/toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/boxen": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
- "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "node_modules/bufferutil": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz",
- "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==",
- "hasInstallScript": true,
- "optional": true,
- "dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
- }
- },
- "node_modules/busboy": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
- "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
- "dependencies": {
- "dicer": "0.3.0"
- },
- "engines": {
- "node": ">=4.5.0"
- }
- },
- "node_modules/bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cacheable-request/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cacheable-request/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/camelcase": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
- "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chalk/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "node_modules/ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "node_modules/cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "dev": true,
- "dependencies": {
- "mimic-response": "^1.0.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "node_modules/configstore": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
- "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
- "dependencies": {
- "safe-buffer": "5.1.2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "node_modules/copyfiles": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz",
- "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==",
- "dev": true,
- "dependencies": {
- "glob": "^7.0.5",
- "minimatch": "^3.0.3",
- "mkdirp": "^1.0.4",
- "noms": "0.0.0",
- "through2": "^2.0.1",
- "untildify": "^4.0.0",
- "yargs": "^16.1.0"
- },
- "bin": {
- "copyfiles": "copyfiles",
- "copyup": "copyfiles"
- }
- },
- "node_modules/core-js-pure": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz",
- "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==",
- "hasInstallScript": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "dependencies": {
- "object-assign": "^4",
- "vary": "^1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/cpu-features": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz",
- "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==",
- "hasInstallScript": true,
- "optional": true,
- "dependencies": {
- "nan": "^2.14.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
- },
- "node_modules/crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cssfilter": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
- "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4="
- },
- "node_modules/d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "optional": true,
- "dependencies": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "dev": true,
- "dependencies": {
- "mimic-response": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
- "dev": true
- },
- "node_modules/define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dependencies": {
- "object-keys": "^1.0.12"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/deprecated-decorator": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz",
- "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc="
- },
- "node_modules/destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "node_modules/dicer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
- "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
- "dependencies": {
- "streamsearch": "0.1.2"
- },
- "engines": {
- "node": ">=4.5.0"
- }
- },
- "node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/docker-modem": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.3.tgz",
- "integrity": "sha512-Tgkn2a+yiNP9FoZgMa/D9Wk+D2Db///0KOyKSYZRJa8w4+DzKyzQMkczKSdR/adQ0x46BOpeNkoyEOKjPhCzjw==",
- "dependencies": {
- "debug": "^4.1.1",
- "readable-stream": "^3.5.0",
- "split-ca": "^1.0.1",
- "ssh2": "^1.4.0"
- },
- "engines": {
- "node": ">= 8.0"
- }
- },
- "node_modules/docker-modem/node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/docker-modem/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/dockerode": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.1.tgz",
- "integrity": "sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ==",
- "dependencies": {
- "docker-modem": "^3.0.0",
- "tar-fs": "~2.0.1"
- },
- "engines": {
- "node": ">= 8.0"
- }
- },
- "node_modules/dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
- "dev": true
- },
- "node_modules/dynamic-dedupe": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz",
- "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=",
- "dev": true,
- "dependencies": {
- "xtend": "^4.0.0"
- }
- },
- "node_modules/ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es5-ext": {
- "version": "0.10.53",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
- "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
- "optional": true,
- "dependencies": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
- }
- },
- "node_modules/es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "optional": true,
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "optional": true,
- "dependencies": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-goat": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
- "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/eventemitter3": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
- "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
- },
- "node_modules/exec-sh": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz",
- "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==",
- "dev": true,
- "dependencies": {
- "merge": "^1.2.0"
- }
- },
- "node_modules/express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/ext": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
- "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
- "optional": true,
- "dependencies": {
- "type": "^2.5.0"
- }
- },
- "node_modules/ext/node_modules/type": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
- "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==",
- "optional": true
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-capacitor": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz",
- "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==",
- "engines": {
- "node": ">=8.5"
- }
- },
- "node_modules/fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/global-dirs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
- "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
- "dev": true,
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
- "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
- "dev": true
- },
- "node_modules/graphql": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.7.2.tgz",
- "integrity": "sha512-AnnKk7hFQFmU/2I9YSQf3xw44ctnSFCfp3zE0N6W174gqe9fWG/2rKaKxROK7CcI3XtERpjEKFqts8o319Kf7A==",
- "engines": {
- "node": ">= 10.x"
- }
- },
- "node_modules/graphql-extensions": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.15.0.tgz",
- "integrity": "sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA==",
- "deprecated": "The `graphql-extensions` API has been removed from Apollo Server 3. Use the plugin API instead: https://www.apollographql.com/docs/apollo-server/integrations/plugins/",
- "dependencies": {
- "@apollographql/apollo-tools": "^0.5.0",
- "apollo-server-env": "^3.1.0",
- "apollo-server-types": "^0.9.0"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/graphql-extensions/node_modules/apollo-server-types": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz",
- "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==",
- "dependencies": {
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "peerDependencies": {
- "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/graphql-subscriptions": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz",
- "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==",
- "dependencies": {
- "iterall": "^1.3.0"
- },
- "peerDependencies": {
- "graphql": "^0.10.5 || ^0.11.3 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/graphql-tag": {
- "version": "2.12.6",
- "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz",
- "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==",
- "dependencies": {
- "tslib": "^2.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
- }
- },
- "node_modules/graphql-tools": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz",
- "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==",
- "deprecated": "This package has been deprecated and now it only exports makeExecutableSchema.\\nAnd it will no longer receive updates.\\nWe recommend you to migrate to scoped packages such as @graphql-tools/schema, @graphql-tools/utils and etc.\\nCheck out https://www.graphql-tools.com to learn what package you should use instead",
- "dependencies": {
- "apollo-link": "^1.2.14",
- "apollo-utilities": "^1.0.1",
- "deprecated-decorator": "^0.1.6",
- "iterall": "^1.1.3",
- "uuid": "^3.1.0"
- },
- "peerDependencies": {
- "graphql": "^0.13.0 || ^14.0.0 || ^15.0.0"
- }
- },
- "node_modules/graphql-tools/node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
- "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-yarn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
- "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
- "node_modules/http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/http-errors/node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/ignore-by-default": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
- "dev": true
- },
- "node_modules/import-lazy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
- "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/internal-slot": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
- "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
- "dependencies": {
- "get-intrinsic": "^1.1.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
- "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
- "dependencies": {
- "ci-info": "^2.0.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
- "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-npm": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
- "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
- "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
- "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "devOptional": true
- },
- "node_modules/is-weakref": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
- "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
- "dependencies": {
- "call-bind": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-yarn-global": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
- "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
- "dev": true
- },
- "node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "node_modules/iterall": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz",
- "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="
- },
- "node_modules/json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
- "dev": true
- },
- "node_modules/jsonwebtoken": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
- "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
- "dependencies": {
- "jws": "^3.2.2",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^5.6.0"
- },
- "engines": {
- "node": ">=4",
- "npm": ">=1.4.28"
- }
- },
- "node_modules/jsonwebtoken/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/jwa": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
- "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
- "dependencies": {
- "buffer-equal-constant-time": "1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/jws": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
- "dependencies": {
- "jwa": "^1.4.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "dev": true,
- "dependencies": {
- "json-buffer": "3.0.0"
- }
- },
- "node_modules/latest-version": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
- "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
- "dev": true,
- "dependencies": {
- "package-json": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
- },
- "node_modules/lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
- },
- "node_modules/lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
- },
- "node_modules/lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
- },
- "node_modules/lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
- },
- "node_modules/lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
- },
- "node_modules/lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
- },
- "node_modules/loglevel": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz",
- "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==",
- "engines": {
- "node": ">= 0.6.0"
- },
- "funding": {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/loglevel"
- }
- },
- "node_modules/long": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
- "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
- },
- "node_modules/lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/make-dir/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/merge": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
- "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
- "dev": true
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "dependencies": {
- "mime-db": "1.51.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/nan": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
- "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
- "optional": true
- },
- "node_modules/negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
- "optional": true
- },
- "node_modules/node-fetch": {
- "version": "2.6.6",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
- "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- }
- },
- "node_modules/node-gyp-build": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz",
- "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==",
- "bin": {
- "node-gyp-build": "bin.js",
- "node-gyp-build-optional": "optional.js",
- "node-gyp-build-test": "build-test.js"
- }
- },
- "node_modules/nodemon": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz",
- "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "chokidar": "^3.5.2",
- "debug": "^3.2.7",
- "ignore-by-default": "^1.0.1",
- "minimatch": "^3.0.4",
- "pstree.remy": "^1.1.8",
- "semver": "^5.7.1",
- "supports-color": "^5.5.0",
- "touch": "^3.1.0",
- "undefsafe": "^2.0.5",
- "update-notifier": "^5.1.0"
- },
- "bin": {
- "nodemon": "bin/nodemon.js"
- },
- "engines": {
- "node": ">=8.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/nodemon"
- }
- },
- "node_modules/nodemon/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/nodemon/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/noms": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
- "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "readable-stream": "~1.0.31"
- }
- },
- "node_modules/noms/node_modules/readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/noms/node_modules/string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "node_modules/nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
- "dev": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-url": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
- "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
- "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object-path": {
- "version": "0.11.8",
- "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz",
- "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==",
- "engines": {
- "node": ">= 10.12.0"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.getownpropertydescriptors": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
- "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- },
- "engines": {
- "node": ">= 0.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/package-json": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
- "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
- "dev": true,
- "dependencies": {
- "got": "^9.6.0",
- "registry-auth-token": "^4.0.0",
- "registry-url": "^5.0.0",
- "semver": "^6.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/package-json/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "node_modules/picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/prisma": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.5.0.tgz",
- "integrity": "sha512-WEYQ+H98O0yigG+lI0gfh4iyBChvnM6QTXPDtY9eFraLXAmyb6tf/T2mUdrUAU1AEvHLVzQA5A+RpONZlQozBg==",
- "hasInstallScript": true,
- "dependencies": {
- "@prisma/engines": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e"
- },
- "bin": {
- "prisma": "build/index.js",
- "prisma2": "build/index.js"
- },
- "engines": {
- "node": ">=12.6"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/pstree.remy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/pupa": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
- "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
- "dev": true,
- "dependencies": {
- "escape-goat": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/raw-body/node_modules/http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "node_modules/raw-body/node_modules/toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dev": true,
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/rc/node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- },
- "node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/registry-auth-token": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
- "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
- "dev": true,
- "dependencies": {
- "rc": "^1.2.8"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/registry-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
- "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
- "dev": true,
- "dependencies": {
- "rc": "^1.2.8"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "dev": true,
- "dependencies": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/semver-diff": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
- "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
- "dev": true,
- "dependencies": {
- "semver": "^6.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/semver-diff/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/http-errors": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
- },
- "node_modules/send/node_modules/toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
- },
- "node_modules/sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- },
- "bin": {
- "sha.js": "bin.js"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
- "dev": true
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/split-ca": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz",
- "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY="
- },
- "node_modules/ssh2": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.5.0.tgz",
- "integrity": "sha512-iUmRkhH9KGeszQwDW7YyyqjsMTf4z+0o48Cp4xOwlY5LjtbIAvyd3fwnsoUZW/hXmTCRA3yt7S/Jb9uVjErVlA==",
- "hasInstallScript": true,
- "dependencies": {
- "asn1": "^0.2.4",
- "bcrypt-pbkdf": "^1.0.2"
- },
- "engines": {
- "node": ">=10.16.0"
- },
- "optionalDependencies": {
- "cpu-features": "0.0.2",
- "nan": "^2.15.0"
- }
- },
- "node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/stompjs": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/stompjs/-/stompjs-2.3.3.tgz",
- "integrity": "sha1-NBeKx7uO4pTMXVVK2LUPf1RZ/Y4=",
- "optionalDependencies": {
- "websocket": "latest"
- }
- },
- "node_modules/streamsearch": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
- "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string_decoder/node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
- "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
- "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/subscriptions-transport-ws": {
- "version": "0.9.19",
- "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz",
- "integrity": "sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==",
- "dependencies": {
- "backo2": "^1.0.2",
- "eventemitter3": "^3.1.0",
- "iterall": "^1.2.1",
- "symbol-observable": "^1.0.4",
- "ws": "^5.2.0 || ^6.0.0 || ^7.0.0"
- },
- "peerDependencies": {
- "graphql": ">=0.10.0"
- }
- },
- "node_modules/subscriptions-transport-ws/node_modules/ws": {
- "version": "7.5.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
- "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/symbol-observable": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
- "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/tar-fs": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz",
- "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==",
- "dependencies": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^2.0.0"
- }
- },
- "node_modules/tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
- "dependencies": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "node_modules/through2/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "node_modules/through2/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/through2/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
- "dev": true,
- "dependencies": {
- "nopt": "~1.0.10"
- },
- "bin": {
- "nodetouch": "bin/nodetouch.js"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "node_modules/tree-kill": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
- "dev": true,
- "bin": {
- "tree-kill": "cli.js"
- }
- },
- "node_modules/ts-invariant": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz",
- "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==",
- "dependencies": {
- "tslib": "^1.9.3"
- }
- },
- "node_modules/ts-invariant/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/ts-node": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
- "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
- "dev": true,
- "dependencies": {
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- },
- "bin": {
- "ts-node": "dist/bin.js",
- "ts-node-script": "dist/bin-script.js",
- "ts-node-transpile-only": "dist/bin-transpile.js",
- "ts-script": "dist/bin-script-deprecated.js"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "typescript": ">=2.7"
- }
- },
- "node_modules/ts-node-dev": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz",
- "integrity": "sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg==",
- "dev": true,
- "dependencies": {
- "chokidar": "^3.5.1",
- "dynamic-dedupe": "^0.3.0",
- "minimist": "^1.2.5",
- "mkdirp": "^1.0.4",
- "resolve": "^1.0.0",
- "rimraf": "^2.6.1",
- "source-map-support": "^0.5.12",
- "tree-kill": "^1.2.2",
- "ts-node": "^9.0.0",
- "tsconfig": "^7.0.0"
- },
- "bin": {
- "ts-node-dev": "lib/bin.js",
- "tsnd": "lib/bin.js"
- },
- "engines": {
- "node": ">=0.8.0"
- },
- "peerDependencies": {
- "node-notifier": "*",
- "typescript": "*"
- },
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
- }
- },
- "node_modules/tsconfig": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
- "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
- "dev": true,
- "dependencies": {
- "@types/strip-bom": "^3.0.0",
- "@types/strip-json-comments": "0.0.30",
- "strip-bom": "^3.0.0",
- "strip-json-comments": "^2.0.0"
- }
- },
- "node_modules/tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "node_modules/type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
- "optional": true
- },
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "devOptional": true,
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
- },
- "node_modules/typescript": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
- "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
- "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"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/undefsafe": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
- "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true
- },
- "node_modules/unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "dev": true,
- "dependencies": {
- "crypto-random-string": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/update-notifier": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
- "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
- "dev": true,
- "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"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/yeoman/update-notifier?sponsor=1"
- }
- },
- "node_modules/update-notifier/node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "dev": true,
- "dependencies": {
- "prepend-http": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/utf-8-validate": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz",
- "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==",
- "hasInstallScript": true,
- "optional": true,
- "dependencies": {
- "node-gyp-build": "^4.3.0"
- },
- "engines": {
- "node": ">=6.14.2"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "node_modules/util.promisify": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz",
- "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "for-each": "^0.3.3",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/value-or-promise": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz",
- "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/watch": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz",
- "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=",
- "dev": true,
- "dependencies": {
- "exec-sh": "^0.2.0",
- "minimist": "^1.2.0"
- },
- "bin": {
- "watch": "cli.js"
- },
- "engines": {
- "node": ">=0.1.95"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "node_modules/websocket": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
- "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
- "optional": true,
- "dependencies": {
- "bufferutil": "^4.0.1",
- "debug": "^2.2.0",
- "es5-ext": "^0.10.50",
- "typedarray-to-buffer": "^3.1.5",
- "utf-8-validate": "^5.0.2",
- "yaeti": "^0.0.6"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "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"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "node_modules/ws": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
- "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xdg-basedir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
- "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/xss": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.10.tgz",
- "integrity": "sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw==",
- "dependencies": {
- "commander": "^2.20.3",
- "cssfilter": "0.0.10"
- },
- "bin": {
- "xss": "bin/xss"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yaeti": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
- "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=",
- "optional": true,
- "engines": {
- "node": ">=0.10.32"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/zen-observable": {
- "version": "0.8.15",
- "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
- "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
- },
- "node_modules/zen-observable-ts": {
- "version": "0.8.21",
- "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz",
- "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==",
- "dependencies": {
- "tslib": "^1.9.3",
- "zen-observable": "^0.8.0"
- }
- },
- "node_modules/zen-observable-ts/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- },
- "node_modules/zeromq": {
- "version": "6.0.0-beta.6",
- "resolved": "https://registry.npmjs.org/zeromq/-/zeromq-6.0.0-beta.6.tgz",
- "integrity": "sha512-wLf6M7pBHijl+BRltUL2VoDpgbQcOZetiX8UzycHL8CcYFxYnRrpoG5fi3UX3+Umavz1lk4/dGaQez8qiDgr/Q==",
- "hasInstallScript": true,
- "dependencies": {
- "node-gyp-build": "^4.1.0"
- },
- "engines": {
- "node": ">= 10.2"
- }
- }
- },
- "dependencies": {
- "@apollo/protobufjs": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.2.tgz",
- "integrity": "sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ==",
- "requires": {
- "@protobufjs/aspromise": "^1.1.2",
- "@protobufjs/base64": "^1.1.2",
- "@protobufjs/codegen": "^2.0.4",
- "@protobufjs/eventemitter": "^1.1.0",
- "@protobufjs/fetch": "^1.1.0",
- "@protobufjs/float": "^1.0.2",
- "@protobufjs/inquire": "^1.1.0",
- "@protobufjs/path": "^1.1.2",
- "@protobufjs/pool": "^1.1.0",
- "@protobufjs/utf8": "^1.1.0",
- "@types/long": "^4.0.0",
- "@types/node": "^10.1.0",
- "long": "^4.0.0"
- },
- "dependencies": {
- "@types/node": {
- "version": "10.17.60",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
- "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
- }
- }
- },
- "@apollographql/apollo-tools": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.2.tgz",
- "integrity": "sha512-KxZiw0Us3k1d0YkJDhOpVH5rJ+mBfjXcgoRoCcslbgirjgLotKMzOcx4PZ7YTEvvEROmvG7X3Aon41GvMmyGsw=="
- },
- "@apollographql/graphql-playground-html": {
- "version": "1.6.26",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz",
- "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==",
- "requires": {
- "xss": "^1.0.6"
- }
- },
- "@apollographql/graphql-upload-8-fork": {
- "version": "8.1.3",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz",
- "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==",
- "requires": {
- "@types/express": "*",
- "@types/fs-capacitor": "*",
- "@types/koa": "*",
- "busboy": "^0.3.1",
- "fs-capacitor": "^2.0.4",
- "http-errors": "^1.7.3",
- "object-path": "^0.11.4"
- }
- },
- "@josephg/resolvable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz",
- "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg=="
- },
- "@prisma/client": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.5.0.tgz",
- "integrity": "sha512-LuaaisknLe9CCfJ1Rtqe9b9knvPgEEcC77OMmWdo3fSanxl5oTDxcH3IIhpULQQlJfZvDcaEXuXNU4dsNF+q1w==",
- "requires": {
- "@prisma/engines-version": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e"
- }
- },
- "@prisma/engines": {
- "version": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e",
- "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e.tgz",
- "integrity": "sha512-MqZUrxuLlIbjB3wu8LrRJOKcvR4k3dunKoI4Q2bPfAwLQY0XlpsLZ3TRVW1c32ooVk939p6iGNkaCUo63Et36g=="
- },
- "@prisma/engines-version": {
- "version": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e",
- "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e.tgz",
- "integrity": "sha512-X16YmBmj7Omso4ZbkNBe6gPYlNcnwZMUPtXsguCkn+KoMqm3DJD9M4X31gx0Gf13Q44dY3SKPJZUk44/XUj/WA=="
- },
- "@protobufjs/aspromise": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
- "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
- },
- "@protobufjs/base64": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
- "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
- },
- "@protobufjs/codegen": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
- "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
- },
- "@protobufjs/eventemitter": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
- "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
- },
- "@protobufjs/fetch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
- "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
- "requires": {
- "@protobufjs/aspromise": "^1.1.1",
- "@protobufjs/inquire": "^1.1.0"
- }
- },
- "@protobufjs/float": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
- "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
- },
- "@protobufjs/inquire": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
- "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
- },
- "@protobufjs/path": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
- "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
- },
- "@protobufjs/pool": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
- "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
- },
- "@protobufjs/utf8": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
- "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
- },
- "@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "dev": true
- },
- "@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "dev": true,
- "requires": {
- "defer-to-connect": "^1.0.1"
- }
- },
- "@types/accepts": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
- "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
- "requires": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "@types/connect": {
- "version": "3.4.35",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
- "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
- },
- "@types/cookies": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz",
- "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==",
- "requires": {
- "@types/connect": "*",
- "@types/express": "*",
- "@types/keygrip": "*",
- "@types/node": "*"
- }
- },
- "@types/cors": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.8.tgz",
- "integrity": "sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w==",
- "requires": {
- "@types/express": "*"
- }
- },
- "@types/express": {
- "version": "4.17.7",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz",
- "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==",
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "*",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "@types/express-serve-static-core": {
- "version": "4.17.17",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz",
- "integrity": "sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ==",
- "requires": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "@types/fs-capacitor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz",
- "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/http-assert": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz",
- "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
- },
- "@types/http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q=="
- },
- "@types/keygrip": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
- "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
- },
- "@types/koa": {
- "version": "2.13.4",
- "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
- "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
- "requires": {
- "@types/accepts": "*",
- "@types/content-disposition": "*",
- "@types/cookies": "*",
- "@types/http-assert": "*",
- "@types/http-errors": "*",
- "@types/keygrip": "*",
- "@types/koa-compose": "*",
- "@types/node": "*"
- }
- },
- "@types/koa-compose": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
- "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
- "requires": {
- "@types/koa": "*"
- }
- },
- "@types/long": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
- "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
- },
- "@types/mime": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
- "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
- },
- "@types/node": {
- "version": "16.11.10",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz",
- "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA=="
- },
- "@types/qs": {
- "version": "6.9.7",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
- "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
- },
- "@types/range-parser": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
- "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
- },
- "@types/serve-static": {
- "version": "1.13.10",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz",
- "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==",
- "requires": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "@types/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
- "dev": true
- },
- "@types/strip-json-comments": {
- "version": "0.0.30",
- "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
- "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
- "dev": true
- },
- "@types/ws": {
- "version": "7.4.7",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz",
- "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@wry/equality": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz",
- "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==",
- "requires": {
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dev": true,
- "requires": {
- "string-width": "^4.1.0"
- }
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "apollo-cache-control": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz",
- "integrity": "sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w==",
- "requires": {
- "apollo-server-env": "^3.1.0",
- "apollo-server-plugin-base": "^0.13.0"
- }
- },
- "apollo-datasource": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.9.0.tgz",
- "integrity": "sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA==",
- "requires": {
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- }
- },
- "apollo-graphql": {
- "version": "0.9.5",
- "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.9.5.tgz",
- "integrity": "sha512-RGt5k2JeBqrmnwRM0VOgWFiGKlGJMfmiif/4JvdaEqhMJ+xqe/9cfDYzXfn33ke2eWixsAbjEbRfy8XbaN9nTw==",
- "requires": {
- "core-js-pure": "^3.10.2",
- "lodash.sortby": "^4.7.0",
- "sha.js": "^2.4.11"
- }
- },
- "apollo-link": {
- "version": "1.2.14",
- "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz",
- "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==",
- "requires": {
- "apollo-utilities": "^1.3.0",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.9.3",
- "zen-observable-ts": "^0.8.21"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "apollo-reporting-protobuf": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz",
- "integrity": "sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg==",
- "requires": {
- "@apollo/protobufjs": "1.2.2"
- }
- },
- "apollo-server": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server/-/apollo-server-3.5.0.tgz",
- "integrity": "sha512-7NkCgK9wjyx/jAbdytId/EPwp+dU4Bn+nktZERh3PGU4sv3TO9Twlsg62eAw5FRRTYQglbGDlCIcx9o1bvg0Ww==",
- "requires": {
- "apollo-server-core": "^3.5.0",
- "apollo-server-express": "^3.5.0",
- "express": "^4.17.1"
- },
- "dependencies": {
- "@apollographql/graphql-playground-html": {
- "version": "1.6.29",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz",
- "integrity": "sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA==",
- "requires": {
- "xss": "^1.0.8"
- }
- },
- "@types/body-parser": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
- "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==",
- "requires": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "@types/cors": {
- "version": "2.8.12",
- "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
- "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
- },
- "@types/express": {
- "version": "4.17.13",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
- "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==",
- "requires": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.18",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "@types/express-serve-static-core": {
- "version": "4.17.24",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz",
- "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==",
- "requires": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*"
- }
- },
- "apollo-datasource": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-3.3.0.tgz",
- "integrity": "sha512-It8POTZTOCAnedRj2izEVeySN06LIfojigZjWaOY7voLe0DIgtvhql91xr27fuIWsR/Ew9twO3dLBjjvy34J4Q==",
- "requires": {
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0"
- }
- },
- "apollo-reporting-protobuf": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.2.0.tgz",
- "integrity": "sha512-2v/5IRJeTGakCJo8kS2LeKUcLsgqxO/HpEyu1EaW79F0CsvrIk10tOIGxouoOgtVl5e1wfGePJ849CUWWczx2A==",
- "requires": {
- "@apollo/protobufjs": "1.2.2"
- }
- },
- "apollo-server-caching": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-3.3.0.tgz",
- "integrity": "sha512-Wgcb0ArjZ5DjQ7ID+tvxUcZ7Yxdbk5l1MxZL8D8gkyjooOkhPNzjRVQ7ubPoXqO54PrOMOTm1ejVhsF+AfIirQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "apollo-server-core": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-3.5.0.tgz",
- "integrity": "sha512-c3wEnPSnzvWvYvRJq1B+yIpa+vBvm0kq0tvD4j/IOw/F1s3sadu43Xr4FiLw++UfeLyh3aS5Wk68hjvrW1ceiQ==",
- "requires": {
- "@apollographql/apollo-tools": "^0.5.1",
- "@apollographql/graphql-playground-html": "1.6.29",
- "@graphql-tools/mock": "^8.1.2",
- "@graphql-tools/schema": "^8.0.0",
- "@graphql-tools/utils": "^8.0.0",
- "@josephg/resolvable": "^1.0.0",
- "apollo-datasource": "^3.3.0",
- "apollo-graphql": "^0.9.0",
- "apollo-reporting-protobuf": "^3.2.0",
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0",
- "apollo-server-errors": "^3.3.0",
- "apollo-server-plugin-base": "^3.4.0",
- "apollo-server-types": "^3.4.0",
- "async-retry": "^1.2.1",
- "fast-json-stable-stringify": "^2.1.0",
- "graphql-tag": "^2.11.0",
- "loglevel": "^1.6.8",
- "lru-cache": "^6.0.0",
- "sha.js": "^2.4.11",
- "uuid": "^8.0.0"
- },
- "dependencies": {
- "@graphql-tools/mock": {
- "version": "8.4.3",
- "resolved": "https://registry.npmjs.org/@graphql-tools/mock/-/mock-8.4.3.tgz",
- "integrity": "sha512-jj7obzDz4FAfmIGSh1Mo6cUs9d8MSaN6TH/iju3Qyuz6CZ6NLuJrWOg50ysEUgkT4Y/Aey8SlWOf/U15Z7qWYw==",
- "requires": {
- "@graphql-tools/schema": "^8.3.1",
- "@graphql-tools/utils": "^8.5.1",
- "fast-json-stable-stringify": "^2.1.0",
- "tslib": "~2.3.0"
- }
- },
- "@graphql-tools/schema": {
- "version": "8.3.1",
- "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-8.3.1.tgz",
- "integrity": "sha512-3R0AJFe715p4GwF067G5i0KCr/XIdvSfDLvTLEiTDQ8V/hwbOHEKHKWlEBHGRQwkG5lwFQlW1aOn7VnlPERnWQ==",
- "requires": {
- "@graphql-tools/merge": "^8.2.1",
- "@graphql-tools/utils": "^8.5.1",
- "tslib": "~2.3.0",
- "value-or-promise": "1.0.11"
- },
- "dependencies": {
- "@graphql-tools/merge": {
- "version": "8.2.1",
- "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.2.1.tgz",
- "integrity": "sha512-Q240kcUszhXiAYudjuJgNuLgy9CryDP3wp83NOZQezfA6h3ByYKU7xI6DiKrdjyVaGpYN3ppUmdj0uf5GaXzMA==",
- "requires": {
- "@graphql-tools/utils": "^8.5.1",
- "tslib": "~2.3.0"
- }
- }
- }
- },
- "@graphql-tools/utils": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz",
- "integrity": "sha512-HDNGWFVa8QQkoQB0H1lftvaO1X5xUaUDk1zr1qDe0xN1NL0E/CrQdJ5UKLqOvH4hkqVUPxQsyOoAZFkaH6rLHg==",
- "requires": {
- "tslib": "~2.3.0"
- }
- },
- "apollo-server-errors": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-3.3.0.tgz",
- "integrity": "sha512-9/MNlPZBbEjcCdJcUSbKbVEBT9xZS8GSpX7T/TyzcxHSbsXJszSDSipQNGC+PRKTKAUnv61IONScVyLKEZ5XEQ==",
- "requires": {}
- },
- "apollo-server-plugin-base": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-3.4.0.tgz",
- "integrity": "sha512-Z9musk7Z/1v+Db6aOoxcHfmsgej2yEBzBz5kVGOc81/XAtdv6bjasKSLC3RiySAUzWSLBJRUeEGIEVhhk/j2Zg==",
- "requires": {
- "apollo-server-types": "^3.4.0"
- }
- },
- "apollo-server-types": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.4.0.tgz",
- "integrity": "sha512-iFNRENtxDoFWoY+KxpGP+TYyRnqUPqUTubMJVgiXPDvOPFL8dzqGGmqq1g/VCeWFHRJTPBLWhOfQU7ktwDEjnQ==",
- "requires": {
- "apollo-reporting-protobuf": "^3.2.0",
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0"
- }
- }
- }
- },
- "apollo-server-env": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-4.2.0.tgz",
- "integrity": "sha512-4xJ+PCoWsFLj4rU6iXrIhqD7nI42goi4Iqrhsof9680ljSzkzd+PCwZsja3mHOFXKUQQUvJ7StVSgwaiRu45+A==",
- "requires": {
- "node-fetch": "^2.6.1"
- }
- },
- "apollo-server-express": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-3.5.0.tgz",
- "integrity": "sha512-eFyBC4ate/g5GrvxM+HrtiElxCEbvG+CiJ0/R1i62L+wzXDhgD6MU0SW17ceS1mpBJgDxURu/VS5hUSNyWMa3Q==",
- "requires": {
- "@types/accepts": "^1.3.5",
- "@types/body-parser": "1.19.1",
- "@types/cors": "2.8.12",
- "@types/express": "4.17.13",
- "@types/express-serve-static-core": "4.17.24",
- "accepts": "^1.3.5",
- "apollo-server-core": "^3.5.0",
- "apollo-server-types": "^3.4.0",
- "body-parser": "^1.19.0",
- "cors": "^2.8.5",
- "parseurl": "^1.3.3"
- },
- "dependencies": {
- "apollo-server-types": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-3.4.0.tgz",
- "integrity": "sha512-iFNRENtxDoFWoY+KxpGP+TYyRnqUPqUTubMJVgiXPDvOPFL8dzqGGmqq1g/VCeWFHRJTPBLWhOfQU7ktwDEjnQ==",
- "requires": {
- "apollo-reporting-protobuf": "^3.2.0",
- "apollo-server-caching": "^3.3.0",
- "apollo-server-env": "^4.2.0"
- }
- }
- }
- }
- }
- },
- "apollo-server-caching": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz",
- "integrity": "sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "apollo-server-core": {
- "version": "2.25.3",
- "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.25.3.tgz",
- "integrity": "sha512-Midow3uZoJ9TjFNeCNSiWElTVZlvmB7G7tG6PPoxIR9Px90/v16Q6EzunDIO0rTJHRC3+yCwZkwtf8w2AcP0sA==",
- "requires": {
- "@apollographql/apollo-tools": "^0.5.0",
- "@apollographql/graphql-playground-html": "1.6.27",
- "@apollographql/graphql-upload-8-fork": "^8.1.3",
- "@josephg/resolvable": "^1.0.0",
- "@types/ws": "^7.0.0",
- "apollo-cache-control": "^0.14.0",
- "apollo-datasource": "^0.9.0",
- "apollo-graphql": "^0.9.0",
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0",
- "apollo-server-errors": "^2.5.0",
- "apollo-server-plugin-base": "^0.13.0",
- "apollo-server-types": "^0.9.0",
- "apollo-tracing": "^0.15.0",
- "async-retry": "^1.2.1",
- "fast-json-stable-stringify": "^2.0.0",
- "graphql-extensions": "^0.15.0",
- "graphql-tag": "^2.11.0",
- "graphql-tools": "^4.0.8",
- "loglevel": "^1.6.7",
- "lru-cache": "^6.0.0",
- "sha.js": "^2.4.11",
- "subscriptions-transport-ws": "^0.9.19",
- "uuid": "^8.0.0"
- },
- "dependencies": {
- "@apollographql/graphql-playground-html": {
- "version": "1.6.27",
- "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz",
- "integrity": "sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==",
- "requires": {
- "xss": "^1.0.8"
- }
- },
- "apollo-server-types": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz",
- "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==",
- "requires": {
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- }
- }
- }
- },
- "apollo-server-env": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.1.0.tgz",
- "integrity": "sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ==",
- "requires": {
- "node-fetch": "^2.6.1",
- "util.promisify": "^1.0.0"
- }
- },
- "apollo-server-errors": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz",
- "integrity": "sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==",
- "requires": {}
- },
- "apollo-server-express": {
- "version": "2.19.2",
- "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.19.2.tgz",
- "integrity": "sha512-1v2H6BgDkS4QzRbJ9djn2o0yv5m/filbpiupxAsCG9f+sAoSlY3eYSj84Sbex2r5+4itAvT9y84WI7d9RBYs/Q==",
- "requires": {
- "@apollographql/graphql-playground-html": "1.6.26",
- "@types/accepts": "^1.3.5",
- "@types/body-parser": "1.19.0",
- "@types/cors": "2.8.8",
- "@types/express": "4.17.7",
- "@types/express-serve-static-core": "4.17.17",
- "accepts": "^1.3.5",
- "apollo-server-core": "^2.19.2",
- "apollo-server-types": "^0.6.3",
- "body-parser": "^1.18.3",
- "cors": "^2.8.4",
- "express": "^4.17.1",
- "graphql-subscriptions": "^1.0.0",
- "graphql-tools": "^4.0.0",
- "parseurl": "^1.3.2",
- "subscriptions-transport-ws": "^0.9.16",
- "type-is": "^1.6.16"
- }
- },
- "apollo-server-plugin-base": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz",
- "integrity": "sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg==",
- "requires": {
- "apollo-server-types": "^0.9.0"
- },
- "dependencies": {
- "apollo-server-types": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz",
- "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==",
- "requires": {
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- }
- }
- }
- },
- "apollo-server-types": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.6.3.tgz",
- "integrity": "sha512-aVR7SlSGGY41E1f11YYz5bvwA89uGmkVUtzMiklDhZ7IgRJhysT5Dflt5IuwDxp+NdQkIhVCErUXakopocFLAg==",
- "requires": {
- "apollo-reporting-protobuf": "^0.6.2",
- "apollo-server-caching": "^0.5.3",
- "apollo-server-env": "^3.0.0"
- },
- "dependencies": {
- "apollo-reporting-protobuf": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.6.2.tgz",
- "integrity": "sha512-WJTJxLM+MRHNUxt1RTl4zD0HrLdH44F2mDzMweBj1yHL0kSt8I1WwoiF/wiGVSpnG48LZrBegCaOJeuVbJTbtw==",
- "requires": {
- "@apollo/protobufjs": "^1.0.3"
- }
- },
- "apollo-server-caching": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.3.tgz",
- "integrity": "sha512-iMi3087iphDAI0U2iSBE9qtx9kQoMMEWr6w+LwXruBD95ek9DWyj7OeC2U/ngLjRsXM43DoBDXlu7R+uMjahrQ==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "apollo-tracing": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.15.0.tgz",
- "integrity": "sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA==",
- "requires": {
- "apollo-server-env": "^3.1.0",
- "apollo-server-plugin-base": "^0.13.0"
- }
- },
- "apollo-utilities": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz",
- "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==",
- "requires": {
- "@wry/equality": "^0.1.2",
- "fast-json-stable-stringify": "^2.0.0",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "async-retry": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
- "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
- "requires": {
- "retry": "0.13.1"
- }
- },
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
- },
- "balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "bcryptjs": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
- "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
- },
- "binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true
- },
- "bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "requires": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
- "requires": {
- "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"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
- }
- }
- },
- "boxen": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz",
- "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==",
- "dev": true,
- "requires": {
- "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": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "buffer-equal-constant-time": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
- },
- "buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true
- },
- "bufferutil": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz",
- "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==",
- "optional": true,
- "requires": {
- "node-gyp-build": "^4.3.0"
- }
- },
- "busboy": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
- "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
- "requires": {
- "dicer": "0.3.0"
- }
- },
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- },
- "cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "dev": true
- }
- }
- },
- "call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- }
- },
- "camelcase": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz",
- "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==",
- "dev": true
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "dependencies": {
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "fsevents": "~2.3.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"
- }
- },
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "dev": true
- },
- "cli-boxes": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
- "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
- "dev": true
- },
- "cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "dev": true,
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "configstore": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
- "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
- },
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "copyfiles": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz",
- "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==",
- "dev": true,
- "requires": {
- "glob": "^7.0.5",
- "minimatch": "^3.0.3",
- "mkdirp": "^1.0.4",
- "noms": "0.0.0",
- "through2": "^2.0.1",
- "untildify": "^4.0.0",
- "yargs": "^16.1.0"
- }
- },
- "core-js-pure": {
- "version": "3.19.1",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz",
- "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ=="
- },
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
- "cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "requires": {
- "object-assign": "^4",
- "vary": "^1"
- }
- },
- "cpu-features": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz",
- "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==",
- "optional": true,
- "requires": {
- "nan": "^2.14.1"
- }
- },
- "create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
- },
- "crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "dev": true
- },
- "cssfilter": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
- "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4="
- },
- "d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "optional": true,
- "requires": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "dev": true,
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true
- },
- "defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "deprecated-decorator": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz",
- "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc="
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "dicer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
- "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
- "requires": {
- "streamsearch": "0.1.2"
- }
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "docker-modem": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.3.tgz",
- "integrity": "sha512-Tgkn2a+yiNP9FoZgMa/D9Wk+D2Db///0KOyKSYZRJa8w4+DzKyzQMkczKSdR/adQ0x46BOpeNkoyEOKjPhCzjw==",
- "requires": {
- "debug": "^4.1.1",
- "readable-stream": "^3.5.0",
- "split-ca": "^1.0.1",
- "ssh2": "^1.4.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- }
- }
- },
- "dockerode": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.1.tgz",
- "integrity": "sha512-AS2mr8Lp122aa5n6d99HkuTNdRV1wkkhHwBdcnY6V0+28D3DSYwhxAk85/mM9XwD3RMliTxyr63iuvn5ZblFYQ==",
- "requires": {
- "docker-modem": "^3.0.0",
- "tar-fs": "~2.0.1"
- }
- },
- "dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "requires": {
- "is-obj": "^2.0.0"
- }
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
- "dev": true
- },
- "dynamic-dedupe": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz",
- "integrity": "sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE=",
- "dev": true,
- "requires": {
- "xtend": "^4.0.0"
- }
- },
- "ecdsa-sig-formatter": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
- "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "requires": {
- "once": "^1.4.0"
- }
- },
- "es-abstract": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
- "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
- "requires": {
- "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-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "es5-ext": {
- "version": "0.10.53",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
- "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
- "optional": true,
- "requires": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "optional": true,
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "optional": true,
- "requires": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
- },
- "escape-goat": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
- "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
- "dev": true
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "eventemitter3": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
- "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
- },
- "exec-sh": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz",
- "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==",
- "dev": true,
- "requires": {
- "merge": "^1.2.0"
- }
- },
- "express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
- "requires": {
- "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"
- }
- },
- "ext": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz",
- "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
- "optional": true,
- "requires": {
- "type": "^2.5.0"
- },
- "dependencies": {
- "type": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
- "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==",
- "optional": true
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "requires": {
- "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"
- }
- },
- "for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "requires": {
- "is-callable": "^1.1.3"
- }
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "fs-capacitor": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz",
- "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA=="
- },
- "fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true
- },
- "get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- }
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- }
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "requires": {
- "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"
- }
- },
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "global-dirs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz",
- "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
- "dev": true,
- "requires": {
- "ini": "2.0.0"
- }
- },
- "got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "dev": true,
- "requires": {
- "@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": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
- "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
- "dev": true
- },
- "graphql": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.7.2.tgz",
- "integrity": "sha512-AnnKk7hFQFmU/2I9YSQf3xw44ctnSFCfp3zE0N6W174gqe9fWG/2rKaKxROK7CcI3XtERpjEKFqts8o319Kf7A=="
- },
- "graphql-extensions": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.15.0.tgz",
- "integrity": "sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA==",
- "requires": {
- "@apollographql/apollo-tools": "^0.5.0",
- "apollo-server-env": "^3.1.0",
- "apollo-server-types": "^0.9.0"
- },
- "dependencies": {
- "apollo-server-types": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz",
- "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==",
- "requires": {
- "apollo-reporting-protobuf": "^0.8.0",
- "apollo-server-caching": "^0.7.0",
- "apollo-server-env": "^3.1.0"
- }
- }
- }
- },
- "graphql-subscriptions": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz",
- "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==",
- "requires": {
- "iterall": "^1.3.0"
- }
- },
- "graphql-tag": {
- "version": "2.12.6",
- "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz",
- "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==",
- "requires": {
- "tslib": "^2.1.0"
- }
- },
- "graphql-tools": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz",
- "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==",
- "requires": {
- "apollo-link": "^1.2.14",
- "apollo-utilities": "^1.0.1",
- "deprecated-decorator": "^0.1.6",
- "iterall": "^1.1.3",
- "uuid": "^3.1.0"
- },
- "dependencies": {
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
- }
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-bigints": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
- "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "has-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
- },
- "has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "has-yarn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
- "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
- "dev": true
- },
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
- "http-errors": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
- "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.1"
- },
- "dependencies": {
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- }
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
- },
- "ignore-by-default": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
- "dev": true
- },
- "import-lazy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
- "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
- "dev": true
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true
- },
- "internal-slot": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz",
- "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==",
- "requires": {
- "get-intrinsic": "^1.1.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- }
- },
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- },
- "is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "requires": {
- "has-bigints": "^1.0.1"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-callable": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
- "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
- },
- "is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "dev": true,
- "requires": {
- "ci-info": "^2.0.0"
- }
- },
- "is-core-module": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
- "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
- "dev": true,
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dev": true,
- "requires": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- }
- },
- "is-negative-zero": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
- "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
- },
- "is-npm": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
- "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-number-object": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
- "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true
- },
- "is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true
- },
- "is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-shared-array-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
- "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
- },
- "is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "devOptional": true
- },
- "is-weakref": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
- "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
- "requires": {
- "call-bind": "^1.0.0"
- }
- },
- "is-yarn-global": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
- "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
- "dev": true
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "iterall": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz",
- "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="
- },
- "json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
- "dev": true
- },
- "jsonwebtoken": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
- "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
- "requires": {
- "jws": "^3.2.2",
- "lodash.includes": "^4.3.0",
- "lodash.isboolean": "^3.0.3",
- "lodash.isinteger": "^4.0.4",
- "lodash.isnumber": "^3.0.3",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.once": "^4.0.0",
- "ms": "^2.1.1",
- "semver": "^5.6.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- }
- }
- },
- "jwa": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
- "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
- "requires": {
- "buffer-equal-constant-time": "1.0.1",
- "ecdsa-sig-formatter": "1.0.11",
- "safe-buffer": "^5.0.1"
- }
- },
- "jws": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
- "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
- "requires": {
- "jwa": "^1.4.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "dev": true,
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "latest-version": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
- "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
- "dev": true,
- "requires": {
- "package-json": "^6.3.0"
- }
- },
- "lodash.includes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
- "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
- },
- "lodash.isboolean": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
- "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
- },
- "lodash.isinteger": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
- "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
- },
- "lodash.isnumber": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
- "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
- },
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
- },
- "lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
- },
- "lodash.once": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
- "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
- },
- "lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
- },
- "loglevel": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz",
- "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA=="
- },
- "long": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
- "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
- "dev": true
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "requires": {
- "semver": "^6.0.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
- },
- "merge": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
- "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
- "dev": true
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
- },
- "mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "requires": {
- "mime-db": "1.51.0"
- }
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "dev": true
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true
- },
- "mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "nan": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
- "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
- "optional": true
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
- },
- "next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
- "optional": true
- },
- "node-fetch": {
- "version": "2.6.6",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
- "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
- "requires": {
- "whatwg-url": "^5.0.0"
- }
- },
- "node-gyp-build": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz",
- "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q=="
- },
- "nodemon": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz",
- "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==",
- "dev": true,
- "requires": {
- "chokidar": "^3.5.2",
- "debug": "^3.2.7",
- "ignore-by-default": "^1.0.1",
- "minimatch": "^3.0.4",
- "pstree.remy": "^1.1.8",
- "semver": "^5.7.1",
- "supports-color": "^5.5.0",
- "touch": "^3.1.0",
- "undefsafe": "^2.0.5",
- "update-notifier": "^5.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- }
- }
- },
- "noms": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
- "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "~1.0.31"
- },
- "dependencies": {
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
- }
- },
- "nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
- "dev": true,
- "requires": {
- "abbrev": "1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "normalize-url": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
- "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-inspect": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
- "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "object-path": {
- "version": "0.11.8",
- "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz",
- "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA=="
- },
- "object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
- "requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
- "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.1"
- }
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "dev": true
- },
- "package-json": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
- "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
- "dev": true,
- "requires": {
- "got": "^9.6.0",
- "registry-auth-token": "^4.0.0",
- "registry-url": "^5.0.0",
- "semver": "^6.2.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "picomatch": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
- "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
- "dev": true
- },
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
- "dev": true
- },
- "prisma": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.5.0.tgz",
- "integrity": "sha512-WEYQ+H98O0yigG+lI0gfh4iyBChvnM6QTXPDtY9eFraLXAmyb6tf/T2mUdrUAU1AEvHLVzQA5A+RpONZlQozBg==",
- "requires": {
- "@prisma/engines": "3.5.0-38.78a5df6def6943431f4c022e1428dbc3e833cf8e"
- }
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- }
- },
- "pstree.remy": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "pupa": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz",
- "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
- "dev": true,
- "requires": {
- "escape-goat": "^2.0.0"
- }
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
- }
- }
- },
- "rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dev": true,
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true
- }
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "registry-auth-token": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
- "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
- "dev": true,
- "requires": {
- "rc": "^1.2.8"
- }
- },
- "registry-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
- "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
- "dev": true,
- "requires": {
- "rc": "^1.2.8"
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
- "dev": true
- },
- "resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "requires": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- }
- },
- "responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "dev": true,
- "requires": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- },
- "semver-diff": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
- "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
- "dev": true,
- "requires": {
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
- }
- },
- "send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
- "requires": {
- "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"
- },
- "dependencies": {
- "http-errors": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
- "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- }
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
- }
- }
- },
- "serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- }
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
- },
- "sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- }
- },
- "signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "split-ca": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz",
- "integrity": "sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY="
- },
- "ssh2": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.5.0.tgz",
- "integrity": "sha512-iUmRkhH9KGeszQwDW7YyyqjsMTf4z+0o48Cp4xOwlY5LjtbIAvyd3fwnsoUZW/hXmTCRA3yt7S/Jb9uVjErVlA==",
- "requires": {
- "asn1": "^0.2.4",
- "bcrypt-pbkdf": "^1.0.2",
- "cpu-features": "0.0.2",
- "nan": "^2.15.0"
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
- },
- "stompjs": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/stompjs/-/stompjs-2.3.3.tgz",
- "integrity": "sha1-NBeKx7uO4pTMXVVK2LUPf1RZ/Y4=",
- "requires": {
- "websocket": "latest"
- }
- },
- "streamsearch": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
- "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
- },
- "string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "requires": {
- "safe-buffer": "~5.2.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- }
- }
- },
- "string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- }
- },
- "string.prototype.trimend": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
- "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "string.prototype.trimstart": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
- "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
- "dev": true
- },
- "subscriptions-transport-ws": {
- "version": "0.9.19",
- "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz",
- "integrity": "sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==",
- "requires": {
- "backo2": "^1.0.2",
- "eventemitter3": "^3.1.0",
- "iterall": "^1.2.1",
- "symbol-observable": "^1.0.4",
- "ws": "^5.2.0 || ^6.0.0 || ^7.0.0"
- },
- "dependencies": {
- "ws": {
- "version": "7.5.6",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz",
- "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==",
- "requires": {}
- }
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "symbol-observable": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
- "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
- },
- "tar-fs": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz",
- "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==",
- "requires": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^2.0.0"
- }
- },
- "tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
- "requires": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- }
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- }
- }
- },
- "to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
- "dev": true
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
- },
- "touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
- "dev": true,
- "requires": {
- "nopt": "~1.0.10"
- }
- },
- "tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "tree-kill": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
- "dev": true
- },
- "ts-invariant": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz",
- "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==",
- "requires": {
- "tslib": "^1.9.3"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "ts-node": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
- "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
- "dev": true,
- "requires": {
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- }
- },
- "ts-node-dev": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-1.1.8.tgz",
- "integrity": "sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg==",
- "dev": true,
- "requires": {
- "chokidar": "^3.5.1",
- "dynamic-dedupe": "^0.3.0",
- "minimist": "^1.2.5",
- "mkdirp": "^1.0.4",
- "resolve": "^1.0.0",
- "rimraf": "^2.6.1",
- "source-map-support": "^0.5.12",
- "tree-kill": "^1.2.2",
- "ts-node": "^9.0.0",
- "tsconfig": "^7.0.0"
- }
- },
- "tsconfig": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
- "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
- "dev": true,
- "requires": {
- "@types/strip-bom": "^3.0.0",
- "@types/strip-json-comments": "0.0.30",
- "strip-bom": "^3.0.0",
- "strip-json-comments": "^2.0.0"
- }
- },
- "tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
- "optional": true
- },
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "devOptional": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "typescript": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
- "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==",
- "dev": true
- },
- "unbox-primitive": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
- "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
- "requires": {
- "function-bind": "^1.1.1",
- "has-bigints": "^1.0.1",
- "has-symbols": "^1.0.2",
- "which-boxed-primitive": "^1.0.2"
- }
- },
- "undefsafe": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
- "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true
- },
- "unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "dev": true,
- "requires": {
- "crypto-random-string": "^2.0.0"
- }
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "untildify": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
- "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
- "dev": true
- },
- "update-notifier": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz",
- "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
- "dev": true,
- "requires": {
- "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"
- },
- "dependencies": {
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "dev": true,
- "requires": {
- "prepend-http": "^2.0.0"
- }
- },
- "utf-8-validate": {
- "version": "5.0.7",
- "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz",
- "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==",
- "optional": true,
- "requires": {
- "node-gyp-build": "^4.3.0"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz",
- "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==",
- "requires": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "for-each": "^0.3.3",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.1"
- }
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
- "value-or-promise": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.11.tgz",
- "integrity": "sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg=="
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "watch": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz",
- "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=",
- "dev": true,
- "requires": {
- "exec-sh": "^0.2.0",
- "minimist": "^1.2.0"
- }
- },
- "webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "websocket": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
- "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
- "optional": true,
- "requires": {
- "bufferutil": "^4.0.1",
- "debug": "^2.2.0",
- "es5-ext": "^0.10.50",
- "typedarray-to-buffer": "^3.1.5",
- "utf-8-validate": "^5.0.2",
- "yaeti": "^0.0.6"
- }
- },
- "whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "requires": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "requires": {
- "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"
- }
- },
- "widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "dev": true,
- "requires": {
- "string-width": "^4.0.0"
- }
- },
- "wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "ws": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz",
- "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==",
- "requires": {}
- },
- "xdg-basedir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
- "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
- "dev": true
- },
- "xss": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.10.tgz",
- "integrity": "sha512-qmoqrRksmzqSKvgqzN0055UFWY7OKx1/9JWeRswwEVX9fCG5jcYRxa/A2DHcmZX6VJvjzHRQ2STeeVcQkrmLSw==",
- "requires": {
- "commander": "^2.20.3",
- "cssfilter": "0.0.10"
- }
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true
- },
- "y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true
- },
- "yaeti": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
- "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=",
- "optional": true
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- },
- "yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true
- },
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true
- },
- "zen-observable": {
- "version": "0.8.15",
- "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
- "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
- },
- "zen-observable-ts": {
- "version": "0.8.21",
- "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz",
- "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==",
- "requires": {
- "tslib": "^1.9.3",
- "zen-observable": "^0.8.0"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
- }
- }
- },
- "zeromq": {
- "version": "6.0.0-beta.6",
- "resolved": "https://registry.npmjs.org/zeromq/-/zeromq-6.0.0-beta.6.tgz",
- "integrity": "sha512-wLf6M7pBHijl+BRltUL2VoDpgbQcOZetiX8UzycHL8CcYFxYnRrpoG5fi3UX3+Umavz1lk4/dGaQez8qiDgr/Q==",
- "requires": {
- "node-gyp-build": "^4.1.0"
- }
- }
- }
-}
diff --git a/api/package.json b/api/package.json
index 1a713da7..8ef535c4 100644
--- a/api/package.json
+++ b/api/package.json
@@ -1,49 +1,37 @@
{
- "name": "api",
- "version": "1.0.0",
+ "name": "codepod",
+ "version": "0.0.8",
"license": "MIT",
"scripts": {
"build": "tsc",
- "start": "node build/server.js",
- "dev": "ts-node-dev src/server.ts",
+ "start": "node build/run.js",
+ "dev": "ts-node-dev src/run.ts",
"test": "jest --config jest.config.js"
},
+ "bin": {
+ "codepod": "./build/cli.js"
+ },
"dependencies": {
- "@apollo/client": "^3.7.1",
- "@kubernetes/client-node": "^0.17.1",
- "@prisma/client": "4.3.1",
- "apollo-server": "^3.5.0",
- "apollo-server-express": "3.10.2",
- "aws-sdk": "^2.1320.0",
- "bcryptjs": "^2.4.3",
- "dockerode": "^3.3.1",
- "google-auth-library": "^8.7.0",
- "graphql": "16.6.0",
+ "@trpc/server": "^10.43.0",
+ "commander": "^11.0.0",
+ "cors": "^2.8.5",
+ "express": "^4.18.2",
"jest": "^29.0.3",
- "jsonwebtoken": "^8.5.1",
- "nanoid": "^3.0.0",
- "nanoid-dictionary": "^4.3.0",
- "prisma": "4.3.1",
- "stompjs": "^2.3.3",
+ "lib0": "^0.2.83",
+ "lodash": "^4.17.21",
"uuid": "^9.0.0",
"ws": "^8.2.3",
- "zeromq": "^6.0.0-beta.6"
+ "y-protocols": "^1.0.5",
+ "yjs": "^13.6.7",
+ "zeromq": "6.0.0-beta.6",
+ "zod": "^3.22.4"
},
"devDependencies": {
- "@types/bcryptjs": "^2.4.2",
- "@types/dockerode": "^3.3.11",
"@types/express": "^4.17.14",
- "@types/jest": "^29.0.2",
- "@types/jsonwebtoken": "^8.5.9",
"@types/node": "^18.11.2",
- "@types/stompjs": "^2.3.5",
- "@types/uuid": "^8.3.4",
"@types/ws": "^8.5.3",
- "copyfiles": "^2.4.1",
- "nodemon": "^2.0.15",
"ts-jest": "^29.0.1",
"ts-node-dev": "^2.0.0",
- "typescript": "^4.4.4",
- "watch": "^1.0.2"
+ "typescript": "^4.4.4"
}
}
diff --git a/api/prisma/migrations/20221123231053_init/migration.sql b/api/prisma/migrations/20221123231053_init/migration.sql
deleted file mode 100644
index 52ade085..00000000
--- a/api/prisma/migrations/20221123231053_init/migration.sql
+++ /dev/null
@@ -1,118 +0,0 @@
--- CreateEnum
-CREATE TYPE "PodType" AS ENUM ('CODE', 'SCOPE', 'DECK', 'WYSIWYG', 'MD', 'REPL');
-
--- CreateTable
-CREATE TABLE "Post" (
- "id" TEXT NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "title" VARCHAR(255) NOT NULL,
- "content" TEXT,
- "published" BOOLEAN NOT NULL DEFAULT false,
- "authorId" TEXT NOT NULL,
-
- CONSTRAINT "Post_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "Profile" (
- "id" TEXT NOT NULL,
- "bio" TEXT,
- "userId" TEXT NOT NULL,
-
- CONSTRAINT "Profile_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "User" (
- "id" TEXT NOT NULL,
- "email" TEXT NOT NULL,
- "username" TEXT,
- "firstname" TEXT NOT NULL,
- "lastname" TEXT NOT NULL,
- "hashedPassword" TEXT NOT NULL,
-
- CONSTRAINT "User_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "Repo" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- "podsId" TEXT[],
-
- CONSTRAINT "Repo_pkey" PRIMARY KEY ("id")
-);
-
--- CreateTable
-CREATE TABLE "Edge" (
- "fromId" TEXT NOT NULL,
- "toId" TEXT NOT NULL,
-
- CONSTRAINT "Edge_pkey" PRIMARY KEY ("fromId","toId")
-);
-
--- CreateTable
-CREATE TABLE "Pod" (
- "id" TEXT NOT NULL,
- "parentId" TEXT,
- "x" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "y" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "width" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "height" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "index" INTEGER NOT NULL,
- "content" TEXT,
- "githead" TEXT,
- "staged" TEXT,
- "column" INTEGER NOT NULL DEFAULT 1,
- "fold" BOOLEAN NOT NULL DEFAULT false,
- "thundar" BOOLEAN NOT NULL DEFAULT false,
- "utility" BOOLEAN NOT NULL DEFAULT false,
- "name" TEXT,
- "lang" TEXT,
- "type" "PodType" NOT NULL,
- "result" TEXT,
- "stdout" TEXT,
- "error" TEXT,
- "imports" TEXT,
- "exports" TEXT,
- "midports" TEXT,
- "reexports" TEXT,
- "repoId" TEXT NOT NULL,
-
- CONSTRAINT "Pod_pkey" PRIMARY KEY ("id")
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "Profile_userId_key" ON "Profile"("userId");
-
--- CreateIndex
-CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
-
--- CreateIndex
-CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
-
--- CreateIndex
-CREATE UNIQUE INDEX "Repo_name_userId_key" ON "Repo"("name", "userId");
-
--- AddForeignKey
-ALTER TABLE "Post" ADD CONSTRAINT "Post_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Profile" ADD CONSTRAINT "Profile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Repo" ADD CONSTRAINT "Repo_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Edge" ADD CONSTRAINT "Edge_fromId_fkey" FOREIGN KEY ("fromId") REFERENCES "Pod"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Edge" ADD CONSTRAINT "Edge_toId_fkey" FOREIGN KEY ("toId") REFERENCES "Pod"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Pod" ADD CONSTRAINT "Pod_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Pod"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Pod" ADD CONSTRAINT "Pod_repoId_fkey" FOREIGN KEY ("repoId") REFERENCES "Repo"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/api/prisma/migrations/20221123231635_add_sharing/migration.sql b/api/prisma/migrations/20221123231635_add_sharing/migration.sql
deleted file mode 100644
index 73acb13c..00000000
--- a/api/prisma/migrations/20221123231635_add_sharing/migration.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- AlterTable
-ALTER TABLE "Repo" ADD COLUMN "collaboratorIds" TEXT[],
-ADD COLUMN "public" BOOLEAN NOT NULL DEFAULT false;
diff --git a/api/prisma/migrations/20221206194247_add_google_login/migration.sql b/api/prisma/migrations/20221206194247_add_google_login/migration.sql
deleted file mode 100644
index 4fbed4c1..00000000
--- a/api/prisma/migrations/20221206194247_add_google_login/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "User" ALTER COLUMN "hashedPassword" DROP NOT NULL;
diff --git a/api/prisma/migrations/20221213072727_backend_userid_repoid/migration.sql b/api/prisma/migrations/20221213072727_backend_userid_repoid/migration.sql
deleted file mode 100644
index df43d4a4..00000000
--- a/api/prisma/migrations/20221213072727_backend_userid_repoid/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Repo" ALTER COLUMN "name" DROP NOT NULL;
diff --git a/api/prisma/migrations/20221213213322_use_relation_for_collaborators/migration.sql b/api/prisma/migrations/20221213213322_use_relation_for_collaborators/migration.sql
deleted file mode 100644
index 0745b2f1..00000000
--- a/api/prisma/migrations/20221213213322_use_relation_for_collaborators/migration.sql
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- Warnings:
-
- - You are about to drop the column `collaboratorIds` on the `Repo` table. All the data in the column will be lost.
-
-*/
--- DropIndex
-DROP INDEX "Repo_name_userId_key";
-
--- AlterTable
-ALTER TABLE "Repo" DROP COLUMN "collaboratorIds";
-
--- CreateTable
-CREATE TABLE "_COLLABORATOR" (
- "A" TEXT NOT NULL,
- "B" TEXT NOT NULL
-);
-
--- CreateIndex
-CREATE UNIQUE INDEX "_COLLABORATOR_AB_unique" ON "_COLLABORATOR"("A", "B");
-
--- CreateIndex
-CREATE INDEX "_COLLABORATOR_B_index" ON "_COLLABORATOR"("B");
-
--- AddForeignKey
-ALTER TABLE "_COLLABORATOR" ADD CONSTRAINT "_COLLABORATOR_A_fkey" FOREIGN KEY ("A") REFERENCES "Repo"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "_COLLABORATOR" ADD CONSTRAINT "_COLLABORATOR_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/api/prisma/migrations/20230223102734_add_updated_at/migration.sql b/api/prisma/migrations/20230223102734_add_updated_at/migration.sql
deleted file mode 100644
index 2ae89e35..00000000
--- a/api/prisma/migrations/20230223102734_add_updated_at/migration.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- AlterTable
-ALTER TABLE "Repo" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
-ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
diff --git a/api/prisma/migrations/20230225041523_add_dummy_count_for_repo/migration.sql b/api/prisma/migrations/20230225041523_add_dummy_count_for_repo/migration.sql
deleted file mode 100644
index d1bb2f65..00000000
--- a/api/prisma/migrations/20230225041523_add_dummy_count_for_repo/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "Repo" ADD COLUMN "dummyCount" INTEGER NOT NULL DEFAULT 0;
diff --git a/api/prisma/migrations/20230226060849_remove_repo_dummycount/migration.sql b/api/prisma/migrations/20230226060849_remove_repo_dummycount/migration.sql
deleted file mode 100644
index 57f7c146..00000000
--- a/api/prisma/migrations/20230226060849_remove_repo_dummycount/migration.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- Warnings:
-
- - You are about to drop the column `dummyCount` on the `Repo` table. All the data in the column will be lost.
-
-*/
--- AlterTable
-ALTER TABLE "Repo" DROP COLUMN "dummyCount";
diff --git a/api/prisma/migrations/20230226065945_add_access_time/migration.sql b/api/prisma/migrations/20230226065945_add_access_time/migration.sql
deleted file mode 100644
index ae1c4d93..00000000
--- a/api/prisma/migrations/20230226065945_add_access_time/migration.sql
+++ /dev/null
@@ -1,16 +0,0 @@
--- CreateTable
-CREATE TABLE "AccessTime" (
- "id" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- "repoId" TEXT NOT NULL,
- "accessedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "dummyCount" INTEGER NOT NULL DEFAULT 0,
-
- CONSTRAINT "AccessTime_pkey" PRIMARY KEY ("id")
-);
-
--- AddForeignKey
-ALTER TABLE "AccessTime" ADD CONSTRAINT "AccessTime_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "AccessTime" ADD CONSTRAINT "AccessTime_repoId_fkey" FOREIGN KEY ("repoId") REFERENCES "Repo"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/api/prisma/migrations/20230226074748_add_user_repo_data/migration.sql b/api/prisma/migrations/20230226074748_add_user_repo_data/migration.sql
deleted file mode 100644
index 2c2735ef..00000000
--- a/api/prisma/migrations/20230226074748_add_user_repo_data/migration.sql
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- Warnings:
-
- - You are about to drop the `AccessTime` table. If the table is not empty, all the data it contains will be lost.
-
-*/
--- DropForeignKey
-ALTER TABLE "AccessTime" DROP CONSTRAINT "AccessTime_repoId_fkey";
-
--- DropForeignKey
-ALTER TABLE "AccessTime" DROP CONSTRAINT "AccessTime_userId_fkey";
-
--- DropTable
-DROP TABLE "AccessTime";
-
--- CreateTable
-CREATE TABLE "UserRepoData" (
- "id" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- "repoId" TEXT NOT NULL,
- "accessedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "dummyCount" INTEGER NOT NULL DEFAULT 0,
-
- CONSTRAINT "UserRepoData_pkey" PRIMARY KEY ("id")
-);
-
--- AddForeignKey
-ALTER TABLE "UserRepoData" ADD CONSTRAINT "UserRepoData_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "UserRepoData" ADD CONSTRAINT "UserRepoData_repoId_fkey" FOREIGN KEY ("repoId") REFERENCES "Repo"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
diff --git a/api/prisma/migrations/20230226082129_add_created_at_for_user/migration.sql b/api/prisma/migrations/20230226082129_add_created_at_for_user/migration.sql
deleted file mode 100644
index 5f8138c1..00000000
--- a/api/prisma/migrations/20230226082129_add_created_at_for_user/migration.sql
+++ /dev/null
@@ -1,3 +0,0 @@
--- AlterTable
-ALTER TABLE "User" ADD COLUMN "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
-ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP;
diff --git a/api/prisma/migrations/20230227022751_refine_edge/migration.sql b/api/prisma/migrations/20230227022751_refine_edge/migration.sql
deleted file mode 100644
index e3b70d80..00000000
--- a/api/prisma/migrations/20230227022751_refine_edge/migration.sql
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- Warnings:
-
- - The primary key for the `Edge` table will be changed. If it partially fails, the table could be left without primary key constraint.
- - You are about to drop the column `fromId` on the `Edge` table. All the data in the column will be lost.
- - You are about to drop the column `toId` on the `Edge` table. All the data in the column will be lost.
- - You are about to drop the column `podsId` on the `Repo` table. All the data in the column will be lost.
- - Added the required column `sourceId` to the `Edge` table without a default value. This is not possible if the table is not empty.
- - Added the required column `targetId` to the `Edge` table without a default value. This is not possible if the table is not empty.
-
-*/
--- DropForeignKey
-ALTER TABLE "Edge" DROP CONSTRAINT "Edge_fromId_fkey";
-
--- DropForeignKey
-ALTER TABLE "Edge" DROP CONSTRAINT "Edge_toId_fkey";
-
--- AlterTable
-ALTER TABLE "Edge" DROP CONSTRAINT "Edge_pkey",
-DROP COLUMN "fromId",
-DROP COLUMN "toId",
-ADD COLUMN "repoId" TEXT,
-ADD COLUMN "sourceId" TEXT NOT NULL,
-ADD COLUMN "targetId" TEXT NOT NULL,
-ADD CONSTRAINT "Edge_pkey" PRIMARY KEY ("sourceId", "targetId");
-
--- AlterTable
-ALTER TABLE "Repo" DROP COLUMN "podsId";
-
--- AddForeignKey
-ALTER TABLE "Edge" ADD CONSTRAINT "Edge_sourceId_fkey" FOREIGN KEY ("sourceId") REFERENCES "Pod"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Edge" ADD CONSTRAINT "Edge_targetId_fkey" FOREIGN KEY ("targetId") REFERENCES "Pod"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-
--- AddForeignKey
-ALTER TABLE "Edge" ADD CONSTRAINT "Edge_repoId_fkey" FOREIGN KEY ("repoId") REFERENCES "Repo"("id") ON DELETE SET NULL ON UPDATE CASCADE;
diff --git a/api/prisma/migrations/20230227084111_use_computed_id_for_user_repo_data/migration.sql b/api/prisma/migrations/20230227084111_use_computed_id_for_user_repo_data/migration.sql
deleted file mode 100644
index ef883287..00000000
--- a/api/prisma/migrations/20230227084111_use_computed_id_for_user_repo_data/migration.sql
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- Warnings:
-
- - The primary key for the `UserRepoData` table will be changed. If it partially fails, the table could be left without primary key constraint.
- - You are about to drop the column `id` on the `UserRepoData` table. All the data in the column will be lost.
-
-*/
--- AlterTable
-ALTER TABLE "UserRepoData" DROP CONSTRAINT "UserRepoData_pkey",
-DROP COLUMN "id",
-ADD CONSTRAINT "UserRepoData_pkey" PRIMARY KEY ("userId", "repoId");
diff --git a/api/prisma/migrations/20230501222052_add_isguset_field/migration.sql b/api/prisma/migrations/20230501222052_add_isguset_field/migration.sql
deleted file mode 100644
index cf267c14..00000000
--- a/api/prisma/migrations/20230501222052_add_isguset_field/migration.sql
+++ /dev/null
@@ -1,2 +0,0 @@
--- AlterTable
-ALTER TABLE "User" ADD COLUMN "isGuest" BOOLEAN NOT NULL DEFAULT false;
diff --git a/api/prisma/migrations/migration_lock.toml b/api/prisma/migrations/migration_lock.toml
deleted file mode 100644
index fbffa92c..00000000
--- a/api/prisma/migrations/migration_lock.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Please do not edit this file manually
-# It should be added in your version-control system (i.e. Git)
-provider = "postgresql"
\ No newline at end of file
diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma
deleted file mode 100755
index 1a03e5d6..00000000
--- a/api/prisma/schema.prisma
+++ /dev/null
@@ -1,156 +0,0 @@
-// This is your Prisma schema file,
-// learn more about it in the docs: https://pris.ly/d/prisma-schema
-
-datasource db {
- provider = "postgresql"
- url = env("DATABASE_URL")
-}
-
-generator client {
- provider = "prisma-client-js"
-}
-
-generator studio-client {
- provider = "prisma-client-js"
- binaryTargets = ["native"]
-}
-
-model Post {
- id String @id
- createdAt DateTime @default(now())
- updatedAt DateTime @updatedAt
- title String @db.VarChar(255)
- content String?
- published Boolean @default(false)
- author User @relation(fields: [authorId], references: [id])
- authorId String
-}
-
-model Profile {
- id String @id
- bio String?
- user User @relation(fields: [userId], references: [id])
- userId String @unique
-}
-
-model User {
- id String @id
- email String @unique
- // username is an optional value, because it might create barrier when user signup.
- username String? @unique
- firstname String
- lastname String
- // A user might not have a password, if they login via OAuth.
- hashedPassword String?
- isGuest Boolean @default(false)
-
- createdAt DateTime @default(now())
- updatedAt DateTime @default(now()) @updatedAt
- posts Post[]
- profile Profile?
- Repo Repo[] @relation("OWNER")
- sharedRepos Repo[] @relation("COLLABORATOR")
- UserRepoData UserRepoData[]
-}
-
-model UserRepoData {
- user User @relation(fields: [userId], references: [id])
- userId String
- repo Repo @relation(fields: [repoId], references: [id])
- repoId String
- accessedAt DateTime @default(now()) @updatedAt
- dummyCount Int @default(0)
-
- // use computed ID
- @@id([userId, repoId])
-}
-
-model Repo {
- id String @id
- name String?
- // fullname String @unique
- owner User @relation("OWNER", fields: [userId], references: [id])
- userId String
- pods Pod[] @relation("BELONG")
- edges Edge[]
- public Boolean @default(false)
- collaborators User[] @relation("COLLABORATOR")
- createdAt DateTime @default(now())
- // Edit pod content likely won't update this updatedAt field.
- updatedAt DateTime @default(now()) @updatedAt
- UserRepoData UserRepoData[]
-}
-
-enum PodType {
- CODE
- SCOPE
- DECK
- WYSIWYG
- MD
- REPL
-}
-
-model Edge {
- source Pod @relation("SOURCE", fields: [sourceId], references: [id])
- sourceId String
- target Pod @relation("TARGET", fields: [targetId], references: [id])
- targetId String
- repo Repo? @relation(fields: [repoId], references: [id])
- repoId String?
-
- @@id([sourceId, targetId])
-}
-
-model Pod {
- id String @id
- parent Pod? @relation("PARENT", fields: [parentId], references: [id])
- parentId String?
- x Float @default(0)
- y Float @default(0)
- width Float @default(0)
- height Float @default(0)
- index Int
- // TODO how to specify the order of children
- //
- // Option 1:
- // https://stackoverflow.com/questions/11094338/storing-item-positions-for-ordering-in-a-database-efficiently
- // I can store a (position, timestamp). To udpate, just move the position, and
- // use a new timestamp. The newer timestamp will ensure the correct order.
- //
- // What about
- // - addition: OK
- // - deletion: OK
- // - deletion + insertion: seems OK
- //
- //
- // Option 2:
- // https://softwareengineering.stackexchange.com/questions/304593/how-to-store-ordered-information-in-a-relational-database
- // Another option is to maintain the order of the pod, then, update all other
- // pods after it.
- children Pod[] @relation("PARENT")
- content String?
- // the HEAD version and STAGED version of pod content
- githead String?
- staged String?
- column Int @default(1)
- fold Boolean @default(false)
- thundar Boolean @default(false)
- utility Boolean @default(false)
- name String?
- lang String?
- type PodType
- result String?
- stdout String?
- error String?
- imports String?
- exports String?
- midports String?
- reexports String?
- // repo Repo? @relation("ROOT")
- repo Repo @relation("BELONG", fields: [repoId], references: [id])
-
- repoId String
- // this is just a place holder. Not useful
- source Edge[] @relation("SOURCE")
- target Edge[] @relation("TARGET")
-}
diff --git a/api/src/cli.ts b/api/src/cli.ts
new file mode 100755
index 00000000..ae3d48e9
--- /dev/null
+++ b/api/src/cli.ts
@@ -0,0 +1,21 @@
+#!/usr/bin/env node
+
+import { program } from "commander";
+import { startServer } from "./server";
+
+// This is a binary executable to run the server.
+
+// First, parse the command line arguments.
+// CMD: codepod /path/to/repo
+
+program
+ // get the version from package.json
+ .version(require("../package.json").version)
+ .arguments("")
+ .action(function (repoPath) {
+ console.log("repoPath", repoPath);
+ // start the server
+ startServer({ port: 4001, repoDir: repoPath });
+ });
+
+program.parse(process.argv);
diff --git a/api/src/resolver.test.ts b/api/src/resolver.test.ts
deleted file mode 100644
index cc8d0c02..00000000
--- a/api/src/resolver.test.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { typeDefs } from "./typedefs";
-import { resolvers } from "./resolver";
-import { ApolloServer, gql } from "apollo-server-express";
-// import { gql } from "@apollo/client";
-
-import { describe, expect, test } from "@jest/globals";
-
-describe("sum module", () => {
- test("adds 1 + 2 to equal 3", () => {
- expect(1 + 2).toBe(3);
- });
-
- test("returns hello with the provided name", async () => {
- const testServer = new ApolloServer({
- typeDefs,
- resolvers,
- });
-
- const result = await testServer.executeOperation({
- query: gql`
- query hello {
- hello
- }
- `,
- // query: "query hello() { hello }",
- variables: { name: "world" },
- });
-
- expect(result.errors).toBeUndefined();
- expect(result.data?.hello).toBe("Hello world!");
- });
-
- test("User signup, login, me, delete.", async () => {
- const testServer = new ApolloServer({
- typeDefs,
- resolvers,
- });
-
- let result;
-
- // remove this user
- result = await testServer.executeOperation({
- query: gql`
- mutation {
- deleteUserCCC
- }
- `,
- });
-
- expect(result.errors).toBeUndefined();
- expect(result.data?.deleteUserCCC).toBeTruthy();
-
- // signup again
- result = await testServer.executeOperation({
- query: gql`
- mutation Signup(
- $email: String
- $password: String
- $firstname: String
- $lastname: String
- $invitation: String
- ) {
- signup(
- email: $email
- password: $password
- firstname: $firstname
- lastname: $lastname
- invitation: $invitation
- ) {
- token
- }
- }
- `,
- // query: "query hello() { hello }",
- variables: {
- email: "ccc@ccc.com",
- password: "ccc",
- firstname: "C1",
- lastname: "C2",
- invitation: "CPFOUNDERS",
- },
- });
-
- expect(result.errors).toBeUndefined();
- expect(result.data?.signup.token).toBeDefined();
-
- // login the user
- result = await testServer.executeOperation({
- query: gql`
- mutation Login($email: String, $password: String) {
- login(email: $email, password: $password) {
- token
- }
- }
- `,
- variables: {
- email: "ccc@ccc.com",
- password: "ccc",
- },
- });
-
- expect(result.errors).toBeUndefined();
- expect(result.data?.login.token).toBeDefined();
- });
-});
diff --git a/api/src/resolver.ts b/api/src/resolver.ts
deleted file mode 100644
index 45149d91..00000000
--- a/api/src/resolver.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import UserResolver from "./resolver_user";
-import RepoResolver from "./resolver_repo";
-import RuntimeResolver from "./resolver_runtime";
-import ExportResolver from "./resolver_export";
-
-export const resolvers = {
- Query: {
- hello: () => {
- return "Hello world!";
- },
- ...UserResolver.Query,
- ...RepoResolver.Query,
- ...RuntimeResolver.Query,
- ...ExportResolver.Query,
- },
- Mutation: {
- ...UserResolver.Mutation,
- ...RepoResolver.Mutation,
- ...RuntimeResolver.Mutation,
- ...ExportResolver.Mutation,
- },
-};
diff --git a/api/src/resolver_export.ts b/api/src/resolver_export.ts
deleted file mode 100644
index 2413e059..00000000
--- a/api/src/resolver_export.ts
+++ /dev/null
@@ -1,175 +0,0 @@
-import Prisma from "@prisma/client";
-
-import AWS from "aws-sdk";
-import { writeFile, readFile, unlink } from "fs/promises";
-
-console.log("REGION", process.env.EXPORT_AWS_S3_REGION);
-
-// Set your AWS region and credentials
-AWS.config.update({
- region: process.env.EXPORT_AWS_S3_REGION,
- accessKeyId: process.env.EXPORT_AWS_S3_ACCESS_KEY_ID,
- secretAccessKey: process.env.EXPORT_AWS_S3_SECRET_ACCESS_KEY,
-});
-
-// Create a new S3 object
-const s3 = new AWS.S3();
-
-async function uploadToS3WithExpiration(filename, content) {
- try {
- await writeFile(filename, content);
-
- // Set the S3 parameters
- const params = {
- Bucket: process.env.EXPORT_AWS_S3_BUCKET as string,
- Key: filename,
- Body: await readFile(filename),
- };
-
- // Upload the file to S3 and set an expiration policy
- const { Location } = await s3.upload(params).promise();
-
- // Delete the generated file
- await unlink(filename);
- return Location;
- } catch (error) {
- console.log("Error uploading file:", error);
- }
-}
-
-const { PrismaClient } = Prisma;
-
-const prisma = new PrismaClient();
-
-/**
- * Export to a JSON file for the pods' raw data.
- */
-async function exportJSON(_, { repoId }, { userId }) {
- const repo = await prisma.repo.findFirst({
- where: {
- OR: [
- { id: repoId, public: true },
- { id: repoId, owner: { id: userId || "undefined" } },
- { id: repoId, collaborators: { some: { id: userId || "undefined" } } },
- ],
- },
- include: {
- pods: {
- include: {
- children: true,
- parent: true,
- },
- orderBy: {
- index: "asc",
- },
- },
- },
- });
- // now export repo to a file
- if (!repo) throw Error("Repo not exists.");
- const filename = `${
- repo.name || "Untitled"
- }-${new Date().toISOString()}.json`;
- const aws_url = await uploadToS3WithExpiration(
- filename,
- JSON.stringify({ name: repo.name, version: "v0.0.1", pods: repo.pods })
- );
- return aws_url;
-}
-
-interface Pod {
- type: "CODE" | "DECK";
- id: string;
- children: string[];
- content: string;
- name: string;
-}
-
-function generate_dfs(pod: Pod, pods: Record, level) {
- const space = " ".repeat(level);
- if (pod.type === "CODE")
- return [
- space + `# BEGIN POD ${pod.id}`,
- space + `${pod.content}`,
- space + `# END POD ${pod.id}`,
- ].join("\n");
- else {
- // this is a DECK
- let ids = pod.children;
- const children_content = ids
- .map((id) => generate_dfs(pods[id], pods, level + 1))
- .join("\n\n");
- return [
- space + `# BEGIN SCOPE ${pod.name} ${pod.id}`,
- children_content,
- space + `# END SCOPE ${pod.name} ${pod.id}`,
- ].join("\n");
- }
-}
-
-function pods_list2dict(pods) {
- // build a id=>pod map
- let d = {};
- for (const pod of pods) {
- d[pod.id] = pod;
- pod.children = [];
- pod.content = JSON.parse(pod.content);
- }
- d["ROOT"] = {
- id: "ROOT",
- type: "DECK",
- ns: "ROOT",
- children: [],
- };
- // construct .children
- for (const pod of pods) {
- pod.parentId = pod.parentId || "ROOT";
- d[pod.parentId].children.push(pod.id);
- }
- return d;
-}
-
-/**
- * export to a Python file.
- */
-async function exportFile(_, { repoId }, { userId }) {
- const repo = await prisma.repo.findFirst({
- where: {
- OR: [
- { id: repoId, public: true },
- { id: repoId, owner: { id: userId || "undefined" } },
- { id: repoId, collaborators: { some: { id: userId || "undefined" } } },
- ],
- },
- include: {
- pods: {
- include: {
- children: true,
- parent: true,
- },
- orderBy: {
- index: "asc",
- },
- },
- },
- });
- // now export repo to a file
- if (!repo) throw Error("Repo not exists.");
-
- let d = pods_list2dict(repo.pods);
- // let decks = pods.filter((pod) => pod.type === "DECK");
- const content = generate_dfs(d["ROOT"], d, 0);
-
- // create a hierarchy of the pods
- const filename = `${repo.name || "Untitled"}-${new Date().toISOString()}.py`;
- const aws_url = await uploadToS3WithExpiration(filename, content);
- return aws_url;
-}
-
-export default {
- Query: {},
- Mutation: {
- exportJSON,
- exportFile,
- },
-};
diff --git a/api/src/resolver_repo.ts b/api/src/resolver_repo.ts
deleted file mode 100644
index 20a49254..00000000
--- a/api/src/resolver_repo.ts
+++ /dev/null
@@ -1,520 +0,0 @@
-import Prisma from "@prisma/client";
-// nanoid v4 does not work with nodejs. https://github.com/ai/nanoid/issues/365
-import { customAlphabet } from "nanoid/async";
-import { lowercase, numbers } from "nanoid-dictionary";
-
-const nanoid = customAlphabet(lowercase + numbers, 20);
-const { PrismaClient } = Prisma;
-
-const prisma = new PrismaClient();
-
-async function ensureRepoEditAccess({ repoId, userId }) {
- let repo = await prisma.repo.findFirst({
- where: {
- id: repoId,
- OR: [
- { owner: { id: userId || "undefined" } },
- { collaborators: { some: { id: userId || "undefined" } } },
- ],
- },
- });
- if (!repo) {
- // this might be caused by creating a pod and update it too soon before it
- // is created on server, which is a time sequence bug
- throw new Error("Repo not exists.");
- }
-}
-
-async function ensurePodEditAccess({ id, userId }) {
- let pod = await prisma.pod.findFirst({
- where: {
- id,
- repo: {
- OR: [
- { owner: { id: userId || "undefined" } },
- { collaborators: { some: { id: userId || "undefined" } } },
- ],
- },
- },
- });
- if (!pod) {
- // this might be caused by creating a pod and update it too soon before it
- // is created on server, which is a time sequence bug
- throw new Error("Pod not exists.");
- }
-}
-
-async function myRepos(_, __, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- const repos = await prisma.repo.findMany({
- where: {
- owner: {
- id: userId,
- },
- },
- include: {
- UserRepoData: {
- where: {
- userId: userId,
- },
- },
- },
- });
- // Sort by last access time.
- repos.sort((a, b) => {
- if (a.UserRepoData.length > 0) {
- if (b.UserRepoData.length > 0) {
- return (
- b.UserRepoData[0].accessedAt.valueOf() -
- a.UserRepoData[0].accessedAt.valueOf()
- );
- }
- return -1;
- }
- return a.updatedAt.valueOf() - b.updatedAt.valueOf();
- });
- // Re-use updatedAt field (this is actually the lastviewed field).
- return repos.map((repo) => {
- return {
- ...repo,
- updatedAt:
- repo.UserRepoData.length > 0
- ? repo.UserRepoData[0].accessedAt
- : repo.updatedAt,
- };
- });
-}
-
-async function myCollabRepos(_, __, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- const repos = await prisma.repo.findMany({
- where: {
- collaborators: {
- some: { id: userId },
- },
- },
- });
- return repos;
-}
-
-async function updateUserRepoData({ userId, repoId }) {
- // FIXME I should probably rename this from query to mutation?
- //
- // update AccessTime field
- const repoData = await prisma.userRepoData.findFirst({
- where: {
- userId,
- repoId,
- },
- });
- if (!repoData) {
- await prisma.userRepoData.create({
- data: {
- user: { connect: { id: userId } },
- repo: { connect: { id: repoId } },
- },
- });
- } else {
- await prisma.userRepoData.updateMany({
- where: {
- user: { id: userId },
- repo: { id: repoId },
- },
- data: {
- dummyCount: { increment: 1 },
- // TODO I could also update accessedAt directly
- // accessedAt: new Date(),
- },
- });
- }
-}
-
-async function repo(_, { id }, { userId }) {
- // a user can only access a private repo if he is the owner or a collaborator
- const repo = await prisma.repo.findFirst({
- where: {
- OR: [
- { id, public: true },
- { id, owner: { id: userId || "undefined" } },
- { id, collaborators: { some: { id: userId || "undefined" } } },
- ],
- },
- include: {
- owner: true,
- collaborators: true,
- pods: {
- include: {
- children: true,
- parent: true,
- },
- orderBy: {
- index: "asc",
- },
- },
- edges: true,
- },
- });
- if (!repo) throw Error("Repo not found");
- await updateUserRepoData({ userId, repoId: id });
- return {
- ...repo,
- edges: repo.edges.map((edge) => ({
- source: edge.sourceId,
- target: edge.targetId,
- })),
- };
-}
-
-async function addEdge(_, { source, target }, { userId }) {
- if (!userId) throw new Error("Not authenticated.");
- const sourcePod = await prisma.pod.findFirst({ where: { id: source } });
- const targetPod = await prisma.pod.findFirst({ where: { id: target } });
- if (!sourcePod || !targetPod) throw new Error("Pods not found.");
- if (sourcePod.repoId !== targetPod.repoId)
- throw new Error("Pods are not in the same repo.");
- await ensureRepoEditAccess({ repoId: sourcePod.repoId, userId });
- await prisma.edge.create({
- data: {
- source: {
- connect: {
- id: source,
- },
- },
- target: {
- connect: {
- id: target,
- },
- },
- repo: {
- connect: {
- id: sourcePod.repoId,
- },
- },
- },
- });
- return true;
-}
-
-async function deleteEdge(_, { source, target }, { userId }) {
- if (!userId) throw new Error("Not authenticated.");
- const sourcePod = await prisma.pod.findFirst({ where: { id: source } });
- const targetPod = await prisma.pod.findFirst({ where: { id: target } });
- if (!sourcePod || !targetPod) throw new Error("Pods not found.");
- if (sourcePod.repoId !== targetPod.repoId)
- throw new Error("Pods are not in the same repo.");
- await ensureRepoEditAccess({ repoId: sourcePod.repoId, userId });
- await prisma.edge.deleteMany({
- where: {
- source: {
- id: source,
- },
- target: {
- id: target,
- },
- },
- });
- return true;
-}
-
-async function createRepo(_, { id, name, isPublic }, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- const repo = await prisma.repo.create({
- data: {
- id: await nanoid(),
- owner: {
- connect: {
- id: userId,
- },
- },
- },
- include: {
- owner: true,
- },
- });
- return repo;
-}
-
-async function getVisibility(_, { repoId }, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- const repo = await prisma.repo.findFirst({
- where: {
- id: repoId,
- owner: { id: userId || "undefined" },
- },
- include: {
- collaborators: true,
- },
- });
- if (!repo) throw Error("Repo not found");
- return { collaborators: repo.collaborators, isPublic: repo.public };
-}
-
-async function updateVisibility(_, { repoId, isPublic }, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- const repo = await prisma.repo.findFirst({
- where: {
- id: repoId,
- owner: { id: userId || "undefined" },
- },
- });
- if (!repo) throw Error("Repo not found");
- await prisma.repo.update({
- where: {
- id: repoId,
- },
- data: {
- public: isPublic,
- },
- });
- return true;
-}
-
-async function updateRepo(_, { id, name }, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- const repo = await prisma.repo.findFirst({
- where: {
- id,
- owner: {
- id: userId,
- },
- },
- });
- if (!repo) throw new Error("Repo not found");
- const updatedRepo = await prisma.repo.update({
- where: {
- id,
- },
- data: {
- name,
- },
- });
- return true;
-}
-
-async function deleteRepo(_, { id }, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- // only a repo owner can delete a repo.
- const repo = await prisma.repo.findFirst({
- where: {
- id,
- owner: {
- id: userId,
- },
- },
- });
- if (!repo) throw new Error("Repo not found");
- // 1. delete all pods
- await prisma.pod.deleteMany({
- where: {
- repo: {
- id: repo.id,
- },
- },
- });
- // 2. delete UserRepoData
- await prisma.userRepoData.deleteMany({
- where: {
- repo: {
- id: repo.id,
- },
- },
- });
- // 3. delete the repo itself
- await prisma.repo.delete({
- where: {
- id: repo.id,
- },
- });
- return true;
-}
-
-async function addCollaborator(_, { repoId, email }, { userId }) {
- // make sure the repo is writable by this user
- if (!userId) throw new Error("Not authenticated.");
- // 1. find the repo
- const repo = await prisma.repo.findFirst({
- where: {
- id: repoId,
- owner: { id: userId },
- },
- include: {
- collaborators: true,
- },
- });
- if (!repo) throw new Error("Repo not found or you are not the owner.");
- // 2. find the user
- const other = await prisma.user.findFirst({
- where: {
- email,
- },
- });
- if (!other) throw new Error("User not found");
- if (other.id === userId) throw new Error("You are already the owner.");
- if (repo.collaborators.findIndex((user) => user.id === other.id) !== -1)
- throw new Error("The user is already a collaborator.");
- // 3. add the user to the repo
- const res = await prisma.repo.update({
- where: {
- id: repoId,
- },
- data: {
- collaborators: { connect: { id: other.id } },
- },
- });
- return true;
-}
-
-async function deleteCollaborator(_, { repoId, collaboratorId }, { userId }) {
- if (!userId) throw new Error("Not authenticated.");
- // 1. find the repo
- const repo = await prisma.repo.findFirst({
- where: {
- id: repoId,
- owner: { id: userId },
- },
- });
- // 2. delete the user from the repo
- if (!repo) throw new Error("Repo not found or you are not the owner.");
- const res = await prisma.repo.update({
- where: {
- id: repoId,
- },
- data: {
- collaborators: { disconnect: { id: collaboratorId } },
- },
- });
- return true;
-}
-
-async function updatePod(_, { id, repoId, input }, { userId }) {
- if (!userId) throw new Error("Not authenticated.");
- await ensureRepoEditAccess({ repoId, userId });
- // if repoId has id, just update
- let pod_found = await prisma.pod.findFirst({
- where: {
- id,
- repo: {
- id: repoId,
- },
- },
- });
- // or, return false and leave it dirty
- if (!pod_found) return false;
- const pod = await prisma.pod.update({
- where: {
- id,
- },
- data: {
- ...input,
- parent: input.parent
- ? input.parent === "ROOT"
- ? { disconnect: true }
- : {
- connect: {
- id: input.parent,
- },
- }
- : undefined,
- children: {
- connect: input.children?.map((id) => ({ id })),
- },
- },
- });
- return true;
-}
-
-async function addPods(_, { repoId, pods }, { userId }) {
- if (!userId) throw new Error("Not authenticated.");
- await ensureRepoEditAccess({ repoId, userId });
- // notice: we keep the field "children", "parent", "repo" empty when first insertion the repo. Because if we insist on filling them, we must specify children, parent and repo by prisma.create.pod. Regardless of what order we insert them, we can't make sure both children and parent exist in the DB, the insertion must fail.
- // Here, we first insert all pods and ignore their any relationship, then the relationship will be updated by updateAllPods because we don't clean the dirty tag of them next.
- await prisma.pod.createMany({
- data: pods.map((pod) => {
- const res = { ...pod, id: pod.id, index: 0, parent: undefined, repoId };
- if (res.children) delete res.children;
- return res;
- }),
- });
-
- return true;
-}
-
-async function deletePods(_, { ids }: { ids: string[] }, { userId }) {
- if (!userId) throw new Error("Not authenticated.");
- if (ids.length === 0) return false;
- // find the repo
- const pod = await prisma.pod.findFirst({
- where: { id: ids[0] },
- include: { repo: true },
- });
- if (!pod) throw new Error("Pod not found");
- await ensureRepoEditAccess({ repoId: pod.repo.id, userId });
- // If the pod is connected to a scope, the frontend will fire deleteEdge calls
- // as well simultaneously. Thus, if this call is fired before the edges are
- // deleted, an error will be thrown.
- //
- // Additional Notes:
- // 1. The deleteEdge graphQL call will still be fired. This would be redundant
- // but should be fine.
- // 2. We still need the deleteEdge graphQL calls when the edge is selected and
- // deleted.
-
- const deletedEdges = await prisma.edge.deleteMany({
- where: {
- OR: [
- {
- source: {
- id: {
- in: ids,
- },
- },
- },
- {
- target: {
- id: {
- in: ids,
- },
- },
- },
- ],
- repo: {
- id: pod.repo.id,
- },
- },
- });
-
- // delete all the nodes, but make sure they are in this exact repo.
- const deletedPods = await prisma.pod.deleteMany({
- where: {
- id: {
- in: ids,
- },
- repo: {
- id: pod.repo.id,
- },
- },
- });
- return true;
-}
-
-export default {
- Query: {
- myRepos,
- repo,
- myCollabRepos,
- getVisibility,
- },
- Mutation: {
- addPods,
- createRepo,
- updateRepo,
- deleteRepo,
- updatePod,
- deletePods,
- addEdge,
- deleteEdge,
- addCollaborator,
- updateVisibility,
- deleteCollaborator,
- },
-};
diff --git a/api/src/resolver_runtime.ts b/api/src/resolver_runtime.ts
deleted file mode 100644
index 0bb42d29..00000000
--- a/api/src/resolver_runtime.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { ApolloClient, InMemoryCache, gql } from "@apollo/client/core";
-
-// chooes between docker and k8s spawners
-import {
- spawnRuntime as spawnRuntime_docker,
- killRuntime as killRuntime_docker,
- infoRuntime as infoRuntime_docker,
- loopKillInactiveRoutes as loopKillInactiveRoutes_docker,
- initRoutes as initRoutes_docker,
-} from "./spawner-docker";
-import {
- spawnRuntime as spawnRuntime_k8s,
- killRuntime as killRuntime_k8s,
- infoRuntime as infoRuntime_k8s,
- loopKillInactiveRoutes as loopKillInactiveRoutes_k8s,
- initRoutes as initRoutes_k8s,
-} from "./spawner-k8s";
-
-import Prisma from "@prisma/client";
-
-const { PrismaClient } = Prisma;
-
-const prisma = new PrismaClient();
-
-const apollo_client = new ApolloClient({
- cache: new InMemoryCache({}),
- uri: process.env.PROXY_API_URL,
-});
-
-async function listAllRuntimes(_, {}, { userId }) {
- // 1. get all containers, and filter by container name. This is the safest way to get all the running instances.
- // If this is too expensive, I should maintain a DB, and periodically check for zombie containers.
- // 2. get all routes. I need to clean this up as well. UPDATE: the route gets deleted in the end, so I can use this as truth.
- // For UI: I should show the runtime status on the repos page.
- // TODO kill the runtime server.
- // FIXME handle exception, and kill zombie containers
- // let url = `/${sessionId}`;
- // remote route
- let urls = await apollo_client.query({
- // query: gql`
- // query getUrls {
- // getUrls
- // }
- // `,
- query: gql`
- query {
- getUrls {
- url
- lastActive
- }
- }
- `,
- fetchPolicy: "network-only",
- });
- let res = urls.data.getUrls
- .map(({ url, lastActive }) => {
- // Just find userId in the session ID
- let sessionId = url.substring(1);
- if (sessionId.indexOf(userId) !== -1) {
- return {
- sessionId,
- lastActive,
- };
- }
- return false;
- })
- .filter((x) => x);
- return res;
-}
-
-export default {
- Query: {
- listAllRuntimes,
-
- ...(process.env.RUNTIME_SPAWNER === "k8s"
- ? {
- infoRuntime: infoRuntime_k8s,
- }
- : {
- infoRuntime: infoRuntime_docker,
- }),
- },
- Mutation: {
- ...(process.env.RUNTIME_SPAWNER === "k8s"
- ? {
- spawnRuntime: spawnRuntime_k8s,
- killRuntime: killRuntime_k8s,
- }
- : {
- spawnRuntime: spawnRuntime_docker,
- killRuntime: killRuntime_docker,
- }),
- },
-};
-
-export const initRoutes =
- process.env.RUNTIME_SPAWNER !== "k8s" ? initRoutes_docker : initRoutes_k8s;
-export const loopKillInactiveRoutes =
- process.env.RUNTIME_SPAWNER !== "k8s"
- ? loopKillInactiveRoutes_docker
- : loopKillInactiveRoutes_k8s;
diff --git a/api/src/resolver_user.ts b/api/src/resolver_user.ts
deleted file mode 100644
index abf98228..00000000
--- a/api/src/resolver_user.ts
+++ /dev/null
@@ -1,187 +0,0 @@
-import Prisma from "@prisma/client";
-import bcrypt from "bcryptjs";
-import jwt from "jsonwebtoken";
-import { OAuth2Client } from "google-auth-library";
-
-// nanoid v4 does not work with nodejs. https://github.com/ai/nanoid/issues/365
-import { customAlphabet } from "nanoid/async";
-import { lowercase, numbers } from "nanoid-dictionary";
-
-const nanoid = customAlphabet(lowercase + numbers, 20);
-
-const { PrismaClient } = Prisma;
-
-const prisma = new PrismaClient();
-
-async function me(_, __, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- const user = await prisma.user.findFirst({
- where: {
- id: userId,
- },
- });
- if (!user) throw Error("Authorization token is not valid");
- return user;
-}
-
-async function signup(_, { email, password, firstname, lastname }) {
- const salt = await bcrypt.genSalt(10);
- const hashed = await bcrypt.hash(password, salt);
- const user = await prisma.user.create({
- data: {
- id: await nanoid(),
- email,
- firstname,
- lastname,
- hashedPassword: hashed,
- },
- });
- return {
- token: jwt.sign({ id: user.id }, process.env.JWT_SECRET as string, {
- expiresIn: "30d",
- }),
- };
-}
-
-/**
- * Create a guest user and return a token. The guest user doesn't have a password or email.
- */
-async function signupGuest(_, {}) {
- const id = await nanoid();
- const user = await prisma.user.create({
- data: {
- id: id,
- email: id + "@example.com",
- firstname: "Guest",
- lastname: "Guest",
- isGuest: true,
- },
- });
- return {
- // CAUTION the front-end should save the user ID so that we can login again after expiration.
- token: jwt.sign({ id: user.id }, process.env.JWT_SECRET as string, {
- expiresIn: "30d",
- }),
- };
-}
-
-/**
- * Login a user with a guest ID and no password.
- */
-async function loginGuest(_, {id}) {
- const user = await prisma.user.findFirst({
- where: {
- id,
- isGuest: true,
- }
- });
- if (!user) throw Error(`User does not exist`);
- return {
- id: user.id,
- email: user.email,
- token: jwt.sign({ id: user.id }, process.env.JWT_SECRET as string, {
- expiresIn: "30d",
- }),
- };
-}
-
-async function updateUser(_, { email, firstname, lastname }, { userId }) {
- if (!userId) throw Error("Unauthenticated");
- let user = await prisma.user.findFirst({
- where: {
- id: userId,
- },
- });
- if (!user) throw Error("User not found.");
- if (user.id !== userId) {
- throw new Error("You do not have access to the user.");
- }
- // do the udpate
- await prisma.user.update({
- where: {
- id: userId,
- },
- data: {
- firstname,
- lastname,
- email,
- },
- });
- return true;
-}
-
-async function login(_, { email, password }) {
- // FIXME findUnique seems broken https://github.com/prisma/prisma/issues/5071
- const user = await prisma.user.findFirst({
- where: {
- email,
- },
- });
- if (!user) throw Error(`User does not exist`);
- if (!user.hashedPassword) throw Error(`User does not have a password`);
- const match = await bcrypt.compare(password, user.hashedPassword!);
- if (!match) {
- throw Error(`Email and password do not match.`);
- } else {
- return {
- id: user.id,
- email: user.email,
- token: jwt.sign({ id: user.id }, process.env.JWT_SECRET as string, {
- expiresIn: "30d",
- }),
- };
- }
-}
-
-const client = new OAuth2Client(process.env.GOOGLE_CLIENT_ID);
-
-async function loginWithGoogle(_, { idToken }) {
- const ticket = await client.verifyIdToken({
- idToken: idToken,
- audience: process.env.GOOGLE_CLIENT_ID, // Specify the CLIENT_ID of the app that accesses the backend
- // Or, if multiple clients access the backend:
- //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
- });
- const payload = ticket.getPayload();
- if (!payload) throw Error(`Invalid token`);
- // check if registered
- let user = await prisma.user.findFirst({
- where: {
- email: payload["email"]!,
- },
- });
- if (!user) {
- // create a new user
- user = await prisma.user.create({
- data: {
- id: await nanoid(),
- email: payload["email"]!,
- firstname: payload["given_name"]!,
- lastname: payload["family_name"]!,
- },
- });
- }
- if (!user) throw Error("User create failed.");
- // return a token
- return {
- id: user.id,
- email: user.email,
- token: jwt.sign({ id: user.id }, process.env.JWT_SECRET as string, {
- expiresIn: "30d",
- }),
- };
-}
-
-export default {
- Query: {
- me,
- },
- Mutation: {
- login,
- loginWithGoogle,
- signup,
- updateUser,
- signupGuest,
- loginGuest,
- },
-};
diff --git a/api/src/run.ts b/api/src/run.ts
new file mode 100644
index 00000000..1624808b
--- /dev/null
+++ b/api/src/run.ts
@@ -0,0 +1,6 @@
+import { startServer } from "./server";
+
+const repoDir = `${process.cwd()}/example-repo`;
+console.log("repoDir", repoDir);
+
+startServer({ port: 4000, repoDir });
diff --git a/api/src/runtime/index.ts b/api/src/runtime/index.ts
new file mode 100644
index 00000000..364a9257
--- /dev/null
+++ b/api/src/runtime/index.ts
@@ -0,0 +1 @@
+export * from "./server";
diff --git a/api/src/runtime/run.ts b/api/src/runtime/run.ts
new file mode 100644
index 00000000..1ae0ce4c
--- /dev/null
+++ b/api/src/runtime/run.ts
@@ -0,0 +1,21 @@
+import { KernelSpec, startServer } from "./server";
+
+let host = process.env.ZMQ_HOST;
+if (!host) {
+ throw Error("ZMQ_HOST not set");
+}
+
+let spec: KernelSpec = {
+ shell_port: 55692,
+ iopub_port: 55693,
+ stdin_port: 55694,
+ control_port: 55695,
+ hb_port: 55696,
+ // ip: "0.0.0.0",
+ ip: host,
+ key: "",
+ transport: "tcp",
+ kernel_name: "",
+};
+
+startServer({ spec, port: 4020 });
diff --git a/api/src/runtime/server.ts b/api/src/runtime/server.ts
new file mode 100644
index 00000000..ebcd00cb
--- /dev/null
+++ b/api/src/runtime/server.ts
@@ -0,0 +1,199 @@
+import { WebSocket, WebSocketServer } from "ws";
+
+import express from "express";
+import http from "http";
+
+import {
+ ZmqWire,
+ constructExecuteRequest,
+ constructMessage,
+ handleIOPub_status,
+ handleIOPub_execute_result,
+ handleIOPub_stdout,
+ handleIOPub_error,
+ handleIOPub_stream,
+ handleIOPub_display_data,
+} from "./zmq-utils";
+
+function bindZMQ(zmq_wire: ZmqWire, socket: WebSocket) {
+ zmq_wire.setOnIOPub((topic, msgs) => {
+ // console.log("-----", topic, msgs);
+ // iracket's topic seems to be an ID. I should use msg type instead
+ switch (msgs.header.msg_type) {
+ case "status":
+ handleIOPub_status({ msgs, socket, lang: "python" });
+ break;
+ case "execute_result":
+ handleIOPub_execute_result({
+ msgs,
+ socket,
+ });
+ break;
+ case "stdout":
+ handleIOPub_stdout({ msgs, socket });
+ break;
+ case "error":
+ handleIOPub_error({ msgs, socket });
+ break;
+ case "stream":
+ handleIOPub_stream({
+ msgs,
+ socket,
+ });
+ break;
+ case "display_data":
+ handleIOPub_display_data({
+ msgs,
+ socket,
+ });
+ break;
+ default:
+ console.log(
+ "Message Not handled",
+ msgs.header.msg_type,
+ "topic:",
+ topic
+ );
+ // console.log("Message body:", msgs);
+ break;
+ }
+ });
+
+ zmq_wire.setOnShell((msgs) => {
+ // DEBUG
+ // socket = this.mq_socket;
+ // socket = this.socket;
+ switch (msgs.header.msg_type) {
+ case "execute_reply":
+ {
+ let [podId, name] = msgs.parent_header.msg_id.split("#");
+ let payload = {
+ podId,
+ name,
+ // content: {
+ // status: 'ok',
+ // payload: [],
+ // user_expressions: { x: [Object] },
+ // execution_count: 2
+ // },
+ result: msgs.content.status,
+ count: msgs.content.execution_count,
+ };
+ if (name) {
+ console.log("emitting IO execute_reply");
+ socket.send(JSON.stringify({ type: "IO:execute_reply", payload }));
+ } else {
+ console.log("emitting execute_reply");
+ socket.send(JSON.stringify({ type: "execute_reply", payload }));
+ }
+ }
+ break;
+ case "interrupt_reply":
+ {
+ socket.send(
+ JSON.stringify({
+ type: "interrupt_reply",
+ payload: {
+ status: msgs.content,
+ lang: "python",
+ },
+ })
+ );
+ }
+ break;
+ default: {
+ console.log("Unhandled shell message", msgs.header.msg_type);
+ }
+ }
+ });
+}
+
+function runCode(wire, { code, msg_id }) {
+ wire.sendShellMessage(
+ constructExecuteRequest({
+ code,
+ msg_id,
+ })
+ );
+}
+
+function requestKernelStatus(wire) {
+ wire.sendShellMessage(constructMessage({ msg_type: "kernel_info_request" }));
+}
+function interrupt(wire) {
+ wire.sendControlMessage(constructMessage({ msg_type: "interrupt_request" }));
+}
+
+export type KernelSpec = {
+ shell_port: number;
+ iopub_port: number;
+ stdin_port: number;
+ control_port: number;
+ hb_port: number;
+ ip: string;
+ key: string;
+ transport: string;
+ kernel_name: string;
+};
+
+export function startServer({
+ spec,
+ port,
+}: {
+ spec: KernelSpec;
+ port: number;
+}) {
+ const expapp = express();
+ const http_server = http.createServer(expapp);
+ const wss = new WebSocketServer({ server: http_server });
+
+ wss.on("connection", (socket) => {
+ console.log("a user connected");
+ // 1. connect ZMQ wire to the kernel
+ // Assume only one connection, from the spawner service. The user browser doesn't connect to kernel directly.
+ const zmq_wire = new ZmqWire(spec);
+ // Listen on ZMQWire replies (wire.setOnIOPub and wire.setOnShell) and send back to websocket.
+ bindZMQ(zmq_wire, socket);
+ socket.on("close", () => {
+ console.log("user disconnected");
+ });
+ // Listen on WS and send commands to kernels through ZMQWire.
+ socket.on("message", async (msg) => {
+ let { type, payload } = JSON.parse(msg.toString());
+ if (type === "ping") return;
+ let { sessionId, lang } = payload;
+ switch (type) {
+ case "runCode":
+ {
+ let { sessionId, lang, raw, code, podId, namespace, midports } =
+ payload;
+ if (!code) {
+ console.log("Code is empty");
+ return;
+ }
+ runCode(zmq_wire, {
+ code,
+ msg_id: podId,
+ });
+ }
+ break;
+ case "requestKernelStatus":
+ console.log("requestKernelStatus", sessionId, lang);
+ requestKernelStatus(zmq_wire);
+ break;
+ case "interruptKernel":
+ {
+ interrupt(zmq_wire);
+ }
+ break;
+ default:
+ console.log("WARNING unhandled message", { type, payload });
+ }
+ });
+ });
+
+ http_server.listen({ port }, () => {
+ console.log(`🚀 WS_server ready at http://localhost:${port}`);
+ });
+ return http_server;
+}
diff --git a/runtime/src/zmq-utils.ts b/api/src/runtime/zmq-utils.ts
similarity index 96%
rename from runtime/src/zmq-utils.ts
rename to api/src/runtime/zmq-utils.ts
index c9c11abc..3fb7feef 100644
--- a/runtime/src/zmq-utils.ts
+++ b/api/src/runtime/zmq-utils.ts
@@ -133,7 +133,7 @@ export function constructExecuteRequest({ code, msg_id, cp = {} }) {
cp,
// FIXME if this is true, no result is returned!
silent: false,
- store_history: false,
+ store_history: true,
// XXX this does not seem to be used
user_expressions: {
x: "3+4",
@@ -154,14 +154,8 @@ export class ZmqWire {
kernelStatus;
results;
- constructor(spec, ip) {
+ constructor(spec) {
this.kernelSpec = spec;
- // console.log(this.kernelSpec);
- if (ip) {
- console.log("Got IP Address:", ip);
- // FIXME hard-coded IP and port
- this.kernelSpec.ip = ip;
- }
this.onshell = (msgs) => {
console.log("Default OnShell:", msgs);
};
@@ -286,7 +280,7 @@ export function handleIOPub_display_data({ msgs, socket }) {
let [podId, name] = msgs.parent_header.msg_id.split("#");
let payload = {
podId,
- name,
+ //name,
// content is a dict of
// {
// data: {'text/plain': ..., 'image/png': ...},
@@ -294,10 +288,6 @@ export function handleIOPub_display_data({ msgs, socket }) {
// transient: ...
// }
content: msgs.content,
- // There's no exe_count in display_data
- // FIXME I should use execute_reply for count
- //
- // count: msgs.content.execution_count,
};
socket.send(JSON.stringify({ type: "display_data", payload }));
}
@@ -309,7 +299,7 @@ export function handleIOPub_execute_result({ msgs, socket }) {
podId,
name,
// result: msgs.content.data["text/plain"],
- // This might contina text/plain, or text/html that contains image
+ // This might contain text/plain, or text/html that contains image
content: msgs.content,
count: msgs.content.execution_count,
};
diff --git a/api/src/server.ts b/api/src/server.ts
index 0a55298e..c8ad55f9 100644
--- a/api/src/server.ts
+++ b/api/src/server.ts
@@ -1,61 +1,64 @@
-import { WebSocketServer } from "ws";
-
import express from "express";
import http from "http";
+import { WebSocketServer } from "ws";
-import { ApolloServer, gql } from "apollo-server-express";
-import jwt from "jsonwebtoken";
+import * as trpcExpress from "@trpc/server/adapters/express";
-import {
- ApolloServerPluginLandingPageProductionDefault,
- ApolloServerPluginLandingPageLocalDefault,
-} from "apollo-server-core";
+import { createSetupWSConnection } from "./yjs/yjs-setupWS";
+import { bindState, writeState } from "./yjs/yjs-blob";
-import { typeDefs } from "./typedefs";
-import { resolvers } from "./resolver";
-import { initRoutes, loopKillInactiveRoutes } from "./resolver_runtime";
+import cors from "cors";
+import { createSpawnerRouter, router } from "./spawner/trpc";
-interface TokenInterface {
- id: string;
-}
+export async function startServer({ port, repoDir }) {
+ console.log("starting server ..");
+ const app = express();
+ app.use(express.json({ limit: "20mb" }));
+ // support cors
+ app.use(cors());
+ // serve static files generated from UI
+ const path = `${__dirname}/../public`;
+ console.log("html path: ", path);
+ app.use(express.static(path));
-async function startServer() {
- const apollo = new ApolloServer({
- typeDefs,
- resolvers,
- context: ({ req }) => {
- const token = req?.headers?.authorization?.slice(7);
- let userId;
-
- if (token) {
- const decoded = jwt.verify(
- token,
- process.env.JWT_SECRET as string
- ) as TokenInterface;
- userId = decoded.id;
- }
- return {
- userId,
- };
- },
- plugins: [ApolloServerPluginLandingPageLocalDefault({ embed: true })],
- });
- const expapp = express();
- expapp.use(express.json({ limit: "20mb" }));
- const http_server = http.createServer(expapp);
- const wss = new WebSocketServer({ server: http_server });
- // graphql api will be available at /graphql
+ const yjsServerUrl = `ws://localhost:${port}/socket`;
- await apollo.start();
- apollo.applyMiddleware({ app: expapp });
+ app.use(
+ "/trpc",
+ trpcExpress.createExpressMiddleware({
+ router: router({
+ spawner: createSpawnerRouter(yjsServerUrl),
+ }),
+ })
+ );
- await initRoutes();
- loopKillInactiveRoutes();
+ const http_server = http.createServer(app);
+
+ // Yjs websocket
+ const wss = new WebSocketServer({ noServer: true });
+
+ wss.on("connection", (...args) =>
+ createSetupWSConnection(
+ (doc, repoId) => bindState(doc, repoId, repoDir),
+ writeState
+ )(...args)
+ );
+
+ http_server.on("upgrade", async (request, socket, head) => {
+ // You may check auth of request here..
+ // See https://github.com/websockets/ws#client-authentication
+ if (request.url) {
+ wss.handleUpgrade(request, socket, head, function done(ws) {
+ wss.emit("connection", ws, request, { readOnly: false });
+ });
+ return;
+ }
+ socket.write("HTTP/1.1 401 Unauthorized\r\n\r\n");
+ socket.destroy();
+ return;
+ });
- const port = process.env.PORT || 4000;
http_server.listen({ port }, () => {
console.log(`🚀 Server ready at http://localhost:${port}`);
});
}
-
-startServer();
diff --git a/api/src/spawner-docker.ts b/api/src/spawner-docker.ts
deleted file mode 100644
index a09e922e..00000000
--- a/api/src/spawner-docker.ts
+++ /dev/null
@@ -1,388 +0,0 @@
-import Docker from "dockerode";
-
-import { ApolloClient, InMemoryCache, gql } from "@apollo/client/core";
-
-const apollo_client = new ApolloClient({
- cache: new InMemoryCache({}),
- uri: process.env.PROXY_API_URL,
-});
-
-const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
-
-async function removeContainer(name) {
- return new Promise((resolve, reject) => {
- var docker = new Docker();
- console.log("remove if already exist");
- let old = docker.getContainer(name);
- old.inspect((err, data) => {
- if (err) {
- console.log("removeContainer: container seems not exist.");
- return resolve(null);
- }
- if (data?.State.Running) {
- old.stop((err, data) => {
- // FIXME If the container is stopped but not removed, will there be errors
- // if I call stop?
- if (err) {
- // console.log("ERR:", err);
- // console.log("No such container, resolving ..");
- // reject();
- console.log("No such container running. Returning.");
- return resolve(null);
- }
- console.log("Stopped. Removing ..");
- old.remove((err, data) => {
- if (err) {
- console.log("ERR during removing container:", err);
- return reject("ERROR!!!");
- // resolve();
- }
- console.log("removed successfully");
- return resolve(null);
- });
- });
- } else {
- console.log("Already stopped. Removing ..");
- old.remove((err, data) => {
- if (err) {
- console.log("ERR during removing container:", err);
- return reject("ERROR!!!");
- // resolve();
- }
- console.log("removed successfully");
- return resolve(null);
- });
- }
- });
- });
-}
-
-/**
- * Load or create a docker container.
- * @param image image name
- * @param name name of container
- * @param network which docker network to use
- * @param Env additional optional env for the container
- * @returns Boolean for whether a new container is created.
- */
-async function loadOrCreateContainer(image, name, network, Env: string[] = []) {
- console.log("loading container", name);
- let ip = await loadContainer(name, network);
- if (ip) return false;
- console.log("beforing creating container, removing just in case ..");
- await removeContainer(name);
- console.log("creating container ..");
- await createContainer(image, name, network, Env);
- return true;
-}
-
-async function getContainerInfo(name): Promise {
- return new Promise((resolve, reject) => {
- var docker = new Docker();
- let container = docker.getContainer(name);
- container.inspect((err, data) => {
- if (err) {
- console.log("getContainerInfo: container seems not exist.");
- return resolve(null);
- }
- if (data?.State.Running) {
- return resolve(data.State.StartedAt);
- }
- return resolve(null);
- });
- });
-}
-
-async function loadContainer(name, network) {
- // if already exists, just return the IP
- // else, create and return the IP
- return new Promise((resolve, reject) => {
- var docker = new Docker();
- console.log("remove if already exist");
- let old = docker.getContainer(name);
- old.inspect((err, data) => {
- if (err) {
- console.log("removeContainer: container seems not exist.");
- return resolve(null);
- }
- if (data?.State.Running) {
- // console.log(data.NetworkSettings.Networks);
- let ip = data.NetworkSettings.Networks[network].IPAddress;
- console.log("IP:", ip);
- resolve(ip);
- } else {
- console.log("Already stopped. Removing ..");
- old.remove((err, data) => {
- if (err) {
- console.log("ERR during removing container:", err);
- return reject("ERROR!!!");
- // resolve();
- }
- console.log("removed successfully");
- return resolve(null);
- });
- }
- });
- });
-}
-
-// return promise of IP address
-async function createContainer(image, name, network, Env) {
- return new Promise((resolve, reject) => {
- var docker = new Docker();
- // spawn("docker", ["run", "-d", "jp-julia"]);
- // 1. first check if the container already there. If so, stop and delete
- // let name = "julia_kernel_X";
- console.log("spawning kernel in container ..");
- docker.createContainer(
- {
- Image: image,
- name,
- Env,
- HostConfig: {
- NetworkMode: network,
- Binds: [
- "dotjulia:/root/.julia",
- "pipcache:/root/.cache/pip",
- // FIXME hard coded dev_ prefix
- "dev_shared_vol:/mount/shared",
- ],
- // DeviceRequests: [
- // {
- // Count: -1,
- // Driver: "nvidia",
- // Capabilities: [["gpu"]],
- // },
- // ],
- },
- },
- (err, container) => {
- if (err) {
- console.log("ERR:", err);
- return;
- }
- container?.start((err, data) => {
- console.log("Container started!");
- // console.log(container);
- container.inspect((err, data) => {
- // console.log("inspect");
- // let ip = data.NetworkSettings.IPAddress
- //
- // If created using codepod network bridge, the IP is here:
- console.log(data?.NetworkSettings.Networks);
- let ip = data?.NetworkSettings.Networks[network].IPAddress;
- if (!ip) {
- console.log(
- "ERROR: IP not available. All network",
- data?.NetworkSettings.Networks
- );
- resolve(null);
- } else {
- console.log("IP:", ip);
- resolve(ip);
- }
- });
- // console.log("IPaddress:", container.NetworkSettings.IPAddress)
- });
- }
- );
- });
-}
-
-async function scanRunningSessions(): Promise {
- return new Promise((resolve, reject) => {
- var docker = new Docker();
- docker.listContainers((err, containers) => {
- if (err) {
- console.log("ERR:", err);
- return;
- }
- let sessionIds = containers
- ?.filter(
- (c) => c.Names[0].startsWith("/cpkernel_") && c.State === "running"
- )
- .map((c) => c.Names[0].substring("/cpkernel_".length));
- return resolve(sessionIds || []);
- });
- });
-}
-
-export async function spawnRuntime(_, { sessionId }) {
- // launch the kernel
- console.log("Spawning ");
- let url = `/${sessionId}`;
- console.log("spawning kernel");
- let zmq_host = `cpkernel_${sessionId}`;
- await loadOrCreateContainer(
- process.env.ZMQ_KERNEL_IMAGE,
- zmq_host,
- // "cpkernel1_hello_world-foo",
- "codepod"
- );
- console.log("spawning ws");
- let ws_host = `cpruntime_${sessionId}`;
- await loadOrCreateContainer(
- process.env.WS_RUNTIME_IMAGE,
- ws_host,
- // "cpruntime1_hello_world-foo",
- "codepod",
- [`ZMQ_HOST=${zmq_host}`]
- );
- console.log("adding route", url, ws_host);
- // add to routing table
- await apollo_client.mutate({
- mutation: gql`
- mutation addRoute($url: String, $target: String) {
- addRoute(url: $url, target: $target)
- }
- `,
- variables: {
- url,
- // This 4020 is the WS listening port in WS_RUNTIME_IMAGE
- target: `${ws_host}:4020`,
- },
- // refetchQueries: ["getUrls"],
- refetchQueries: [
- {
- query: gql`
- query getUrls {
- getUrls
- }
- `,
- },
- ],
- });
- console.log("returning");
- // console.log("res", res);
- return true;
-}
-
-export async function killRuntime(_, { sessionId }) {
- if (!sessionId) return false;
- // TODO kill the runtime server.
- // FIXME handle exception, and kill zombie containers
- let url = `/${sessionId!}`;
- let zmq_host = `cpkernel_${sessionId}`;
- try {
- await removeContainer(zmq_host);
- } catch (e) {
- console.log("Error removing container", zmq_host, e);
- return false;
- }
- let ws_host = `cpruntime_${sessionId}`;
- try {
- await removeContainer(ws_host);
- } catch (e) {
- console.log("Error removing container", ws_host, e);
- return false;
- }
- // remote route
- console.log("Removing route ..");
- await apollo_client.mutate({
- mutation: gql`
- mutation deleteRoute($url: String) {
- deleteRoute(url: $url)
- }
- `,
- variables: {
- url,
- },
- // FIMXE why name doesn't work? Actually the refetchQueries doesn't work
- // refetchQueries: ["getUrls"],
- // refetchQueries: [{ query: GET_URLS_QUERY }],
- });
- return true;
-}
-
-/**
- * Get the runtime info.
- * @param sessionId the session ID
- * @returns {startedAt} the time when the runtime is started.
- */
-export async function infoRuntime(_, { sessionId }) {
- let zmq_host = `cpkernel_${sessionId}`;
- let ws_host = `cpruntime_${sessionId}`;
- let startedAt = await getContainerInfo(ws_host);
- return {
- startedAt: startedAt ? new Date(startedAt).getTime() : null,
- };
-}
-// debug: 3 min: 1000 * 60 * 3;
-// prod: 12 hours: 1000 * 60 * 60 * 12;
-let kernel_ttl: number = process.env.KERNEL_TTL
- ? parseInt(process.env.KERNEL_TTL)
- : 1000 * 60 * 60 * 12;
-let loop_interval = process.env.LOOP_INTERVAL
- ? parseInt(process.env.LOOP_INTERVAL)
- : 1000 * 60 * 1;
-
-async function killInactiveRoutes() {
- let { data } = await apollo_client.query({
- query: gql`
- query GetUrls {
- getUrls {
- url
- lastActive
- }
- }
- `,
- fetchPolicy: "network-only",
- });
- const now = new Date();
- let inactiveRoutes = data.getUrls
- .filter(({ url, lastActive }) => {
- if (!lastActive) return true;
- let d2 = new Date(parseInt(lastActive));
- let activeTime = now.getTime() - d2.getTime();
- return activeTime > kernel_ttl;
- })
- .map(({ url }) => url);
- console.log("Inactive routes", inactiveRoutes);
- for (let url of inactiveRoutes) {
- let sessionId = url.substring(1);
- await killRuntime(null, { sessionId });
- }
-}
-
-/**
- * Periodically kill inactive routes every minute.
- */
-export function loopKillInactiveRoutes() {
- setInterval(async () => {
- await killInactiveRoutes();
- }, loop_interval);
-}
-
-/**
- * At startup, check all active containers and add them to the table.
- */
-export async function initRoutes() {
- let sessionIds = await scanRunningSessions();
- console.log("initRoutes sessionIds", sessionIds);
- for (let id of sessionIds) {
- let url = `/${id}`;
- let ws_host = `cpruntime_${id}`;
- await apollo_client.mutate({
- mutation: gql`
- mutation addRoute($url: String, $target: String) {
- addRoute(url: $url, target: $target)
- }
- `,
- variables: {
- url,
- // This 4020 is the WS listening port in WS_RUNTIME_IMAGE
- target: `${ws_host}:4020`,
- },
- // refetchQueries: ["getUrls"],
- refetchQueries: [
- {
- query: gql`
- query getUrls {
- getUrls
- }
- `,
- },
- ],
- });
- }
-}
diff --git a/api/src/spawner-k8s.ts b/api/src/spawner-k8s.ts
deleted file mode 100644
index d6177baf..00000000
--- a/api/src/spawner-k8s.ts
+++ /dev/null
@@ -1,384 +0,0 @@
-import * as k8s from "@kubernetes/client-node";
-import * as fs from "fs";
-
-import { ApolloClient, InMemoryCache, gql } from "@apollo/client/core";
-
-const apollo_client = new ApolloClient({
- cache: new InMemoryCache({}),
- uri: "http://codepod-proxy-service:4011/graphql",
-});
-
-const kc = new k8s.KubeConfig();
-kc.loadFromDefault();
-
-const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
-const k8sAppsApi = kc.makeApiClient(k8s.AppsV1Api);
-
-function getDeploymentSpec(name) {
- return {
- apiVersion: "apps/v1",
- kind: "Deployment",
- metadata: {
- name: `${name}-deployment`,
- },
- spec: {
- replicas: 1,
- selector: {
- matchLabels: { app: `${name}` },
- },
- template: {
- metadata: { labels: { app: `${name}` } },
- spec: {
- containers: [
- {
- name: `${name}-kernel`,
- image: process.env.ZMQ_KERNEL_IMAGE,
- ports: [
- // These are pre-defined in kernel/conn.json
- { containerPort: 55692 },
- { containerPort: 55693 },
- { containerPort: 55694 },
- { containerPort: 55695 },
- { containerPort: 55696 },
- ],
- },
- {
- name: `${name}-ws`,
- image: process.env.WS_RUNTIME_IMAGE,
- // The out-facing port for proxy to talk to.
- ports: [{ containerPort: 4020 }],
- // It will talk to the above kernel container.
- env: [
- {
- name: "ZMQ_HOST",
- // value: `${name}-kernel`
- //
- // In k8s, the sidecar container doesn't get a IP/hostname.
- // Instead, I have to bind the port and use localhost for them
- // to connect.
- value: "localhost",
- },
- ],
- },
- ],
- },
- },
- },
- };
-}
-
-function getServiceSpec(name) {
- return {
- apiVersion: "v1",
- kind: "Service",
- metadata: {
- name: `${name}-service`,
- },
- spec: {
- selector: {
- app: `${name}`,
- },
- ports: [
- {
- protocol: "TCP",
- port: 4020,
- targetPort: 4020,
- },
- ],
- },
- };
-}
-
-async function createDeployment(ns, deploy_spec) {
- try {
- // TODO if exists, skip
- // await k8sApi.createNamespacedPod(ns, getPodSpec(k8s_name));
- await k8sAppsApi.createNamespacedDeployment(ns, deploy_spec);
- // FIXME would this also do creation?
- } catch (e: any) {
- if (e.body.reason === "AlreadyExists") {
- console.log("Already exists, patching ..");
- try {
- await k8sAppsApi.patchNamespacedDeployment(
- deploy_spec.metadata.name,
- ns,
- deploy_spec,
- undefined,
- undefined,
- undefined,
- undefined,
- undefined,
- {
- headers: {
- "content-type": "application/strategic-merge-patch+json",
- },
- }
- );
- } catch (e: any) {
- console.log("ERROR", e.body.message);
- return false;
- }
- } else {
- console.log("ERROR", e.body.message);
- return false;
- }
- }
-}
-
-async function createService(ns: string, service_spec) {
- try {
- await k8sApi.createNamespacedService(ns, service_spec);
-
- // The DNS name of the service is
- } catch (e: any) {
- if (e.body.reason === "AlreadyExists") {
- console.log("Already exists, patching ..");
- try {
- await k8sApi.patchNamespacedService(
- service_spec.metadata.name,
- ns,
- service_spec,
- undefined,
- undefined,
- undefined,
- undefined,
- undefined,
- // Ref: https://github.com/kubernetes-client/javascript/issues/19
- //
- // FIXME actually the patch is not the same as kubectl apply -f. It
- // won't remove old selectors with a different label name. But it's
- // not a problem here, as we have only one selector "app".
- {
- headers: {
- "content-type": "application/strategic-merge-patch+json",
- },
- }
- );
- } catch (e: any) {
- console.log("ERROR", e.body.message);
- return false;
- }
- } else {
- console.log("ERROR", e.body.message);
- return false;
- }
- }
-}
-
-async function addRoute(ns: string, service_spec, url: string) {
- let dnsname = `${service_spec.metadata.name}.${ns}.svc.cluster.local`;
- console.log("Created, dns:", dnsname);
- // let ws_host = `${k8s_name}-deployment`;
- let ws_host = dnsname;
- // send to node-http
- console.log("adding route", url, ws_host);
- // add to routing table
- await apollo_client.mutate({
- mutation: gql`
- mutation addRoute($url: String, $target: String) {
- addRoute(url: $url, target: $target)
- }
- `,
- variables: {
- url,
- // This 4020 is the WS listening port in WS_RUNTIME_IMAGE
- target: `${ws_host}:4020`,
- },
- // refetchQueries: ["getUrls"],
- refetchQueries: [
- {
- query: gql`
- query getUrls {
- getUrls
- }
- `,
- },
- ],
- });
-}
-
-export async function spawnRuntime(_, { sessionId }) {
- let url = `/${sessionId}`;
- sessionId = sessionId.replaceAll("_", "-").toLowerCase();
- let k8s_name = `rt-${sessionId}`;
- console.log("spawnRuntime", url, k8s_name);
- console.log("Creating namespaced pod ..");
- let ns =
- process.env.RUNTIME_NS ||
- fs
- .readFileSync("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
- .toString();
- console.log("Using k8s ns:", ns);
- let deploy_spec = getDeploymentSpec(k8s_name);
- let service_spec = getServiceSpec(k8s_name);
- await createDeployment(ns, deploy_spec);
- console.log("Creating service ..");
- await createService(ns, service_spec);
- await addRoute(ns, service_spec, url);
- return true;
-}
-
-export async function killRuntime(_, { sessionId }) {
- let url = `/${sessionId}`;
- sessionId = sessionId.replaceAll("_", "-").toLowerCase();
- let k8s_name = `rt-${sessionId}`;
- console.log("killRuntime", url, k8s_name);
- let ns =
- process.env.RUNTIME_NS ||
- fs
- .readFileSync("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
- .toString();
- console.log("Using k8s ns:", ns);
- console.log("Killing pod ..");
- // await k8sApi.deleteNamespacedPod(getPodSpec(k8s_name).metadata.name, ns);
- try {
- await k8sAppsApi.deleteNamespacedDeployment(
- getDeploymentSpec(k8s_name).metadata.name,
- ns
- );
- } catch (e: any) {
- console.log("[ERROR] cannot kill pod", url, e);
- return false;
- }
-
- console.log("Killing service ..");
- try {
- await k8sApi.deleteNamespacedService(
- getServiceSpec(k8s_name).metadata.name,
- ns
- );
- } catch (e: any) {
- console.log("[ERROR] cannot kill route", url, e);
- return false;
- }
-
- // remote route
- console.log("Removing route ..");
- await apollo_client.mutate({
- mutation: gql`
- mutation deleteRoute($url: String) {
- deleteRoute(url: $url)
- }
- `,
- variables: {
- url,
- },
- // FIMXE why name doesn't work? Actually the refetchQueries doesn't work
- // refetchQueries: ["getUrls"],
- // refetchQueries: [{ query: GET_URLS_QUERY }],
- });
- return true;
-}
-
-/**
- * Get the runtime info.
- * @param sessionId the session ID
- * @returns {startedAt} the time when the runtime is started.
- */
-export async function infoRuntime(_, { sessionId }) {
- sessionId = sessionId.replaceAll("_", "-").toLowerCase();
- let k8s_name = `rt-${sessionId}`;
- let ns =
- process.env.RUNTIME_NS ||
- fs
- .readFileSync("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
- .toString();
- let deploy_spec = getDeploymentSpec(k8s_name);
- // read the startTime from the deployment status
- let status = await k8sAppsApi.readNamespacedDeployment(
- deploy_spec.metadata.name,
- ns
- );
- let startedAt = status.body.metadata?.creationTimestamp;
- return {
- startedAt: startedAt ? new Date(startedAt).getTime() : null,
- };
-}
-
-// debug: 3 min: 1000 * 60 * 3;
-// prod: 12 hours: 1000 * 60 * 60 * 12;
-let kernel_ttl: number = process.env.KERNEL_TTL
- ? parseInt(process.env.KERNEL_TTL)
- : 1000 * 60 * 60 * 12;
-let loop_interval = process.env.LOOP_INTERVAL
- ? parseInt(process.env.LOOP_INTERVAL)
- : 1000 * 60 * 1;
-
-async function killInactiveRoutes() {
- let { data } = await apollo_client.query({
- query: gql`
- query GetUrls {
- getUrls {
- url
- lastActive
- }
- }
- `,
- fetchPolicy: "network-only",
- });
- const now = new Date();
- let inactiveRoutes = data.getUrls
- .filter(({ url, lastActive }) => {
- // If the lastActive is null, it means the route is not active.
- if (!lastActive) return true;
- let d2 = new Date(parseInt(lastActive));
- let activeTime = now.getTime() - d2.getTime();
- return activeTime > kernel_ttl;
- })
- .map(({ url }) => url);
- console.log("Inactive routes", inactiveRoutes);
- for (let url of inactiveRoutes) {
- let sessionId = url.substring(1);
- await killRuntime(null, { sessionId });
- }
-}
-
-/**
- * Periodically kill inactive routes every minute.
- */
-export function loopKillInactiveRoutes() {
- setInterval(async () => {
- await killInactiveRoutes();
- }, loop_interval);
-}
-
-function deploymentName2sessionId(deploymentName: string) {
- // NOTE: this is sessionId.replaceAll("_", "-").toLowerCase()
- return deploymentName.match(/rt-(.*)-deployment/)![1];
-}
-
-async function scanRunningSessions(): Promise {
- let ns =
- process.env.RUNTIME_NS ||
- fs
- .readFileSync("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
- .toString();
- let deployments = await k8sAppsApi.listNamespacedDeployment(ns);
- let sessionIds = deployments.body.items
- .map((d) => d.metadata!.name!)
- .filter((x) => x)
- .map((name) => deploymentName2sessionId(name));
-
- return new Promise((resolve, reject) => {
- resolve(sessionIds || []);
- });
-}
-
-/**
- * At startup, check all active containers and add them to the table.
- */
-export async function initRoutes() {
- let ns =
- process.env.RUNTIME_NS ||
- fs
- .readFileSync("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
- .toString();
- let sessionIds = await scanRunningSessions();
- console.log("initRoutes sessionIds", sessionIds);
- for (let id of sessionIds) {
- let url = `/${id}`;
- let k8s_name = `rt-${id}`;
- let service_spec = getServiceSpec(k8s_name);
- await addRoute(ns, service_spec, url);
- }
-}
diff --git a/api/src/spawner/spawner_native.ts b/api/src/spawner/spawner_native.ts
new file mode 100644
index 00000000..6902c751
--- /dev/null
+++ b/api/src/spawner/spawner_native.ts
@@ -0,0 +1,129 @@
+import { ChildProcessWithoutNullStreams, spawn } from "child_process";
+import { writeFileSync } from "fs";
+import net from "net";
+import http from "http";
+
+import { startServer } from "../runtime/server";
+
+type KernelInfo = {
+ // the kernel
+ zmq_proc: ChildProcessWithoutNullStreams;
+ spec: KernelSpec;
+ // the WS gateway
+ ws_server: http.Server;
+ ws_port: number;
+};
+
+const id2KernelInfo = new Map();
+
+const usedPorts = new Set();
+
+async function getFreePort(): Promise {
+ return new Promise((resolve, reject) => {
+ // get one free pod
+ const srv = net.createServer();
+ srv.listen(0, () => {
+ const addr = srv.address() as net.AddressInfo;
+ const port = addr.port;
+ srv.close();
+ resolve(port);
+ });
+ });
+}
+
+async function getAvailablePort() {
+ while (true) {
+ let port = await getFreePort();
+ if (!usedPorts.has(port)) {
+ usedPorts.add(port);
+ return port;
+ }
+ }
+}
+
+type KernelSpec = {
+ shell_port: number;
+ iopub_port: number;
+ stdin_port: number;
+ control_port: number;
+ hb_port: number;
+ ip: string;
+ key: string;
+ transport: string;
+ kernel_name: string;
+};
+
+async function createNewConnSpec() {
+ let spec: KernelSpec = {
+ shell_port: await getAvailablePort(),
+ iopub_port: await getAvailablePort(),
+ stdin_port: await getAvailablePort(),
+ control_port: await getAvailablePort(),
+ hb_port: await getAvailablePort(),
+ ip: "127.0.0.1",
+ key: "",
+ transport: "tcp",
+ kernel_name: "",
+ };
+ return spec;
+}
+
+/**
+ *
+ * @returns target url: ws://container:port
+ */
+export async function spawnRuntime(runtimeId) {
+ // 1. launch the kernel with some connection file
+ const spec = await createNewConnSpec();
+ console.log("=== spec", spec);
+ // This file is only used once.
+ writeFileSync("/tmp/conn.json", JSON.stringify(spec));
+ // create a new process
+ // "python3", "-m", "ipykernel_launcher", "-f", "/conn.json"
+ const proc = spawn("python3", [
+ "-m",
+ "ipykernel_launcher",
+ "-f",
+ "/tmp/conn.json",
+ ]);
+ proc.stdout.on("data", (data) => {
+ console.log(`child stdout:\n${data}`);
+ });
+ proc.stderr.on("data", (data) => {
+ console.error(`child stderr:\n${data}`);
+ });
+
+ // 2. launch the WS gateway server, at some port
+ const port = await getAvailablePort();
+ console.log("=== ws port", port);
+ const server = startServer({ spec, port });
+ // 3. return the runtimeInfo
+ // add the process PID to the runtimeInfo
+ const runtimeInfo: KernelInfo = {
+ spec,
+ zmq_proc: proc,
+ ws_server: server,
+ ws_port: port,
+ };
+ id2KernelInfo.set(runtimeId, runtimeInfo);
+ return `ws://localhost:${port}`;
+}
+
+export async function killRuntime(runtimeId) {
+ // free resources
+ const info = id2KernelInfo.get(runtimeId);
+ if (!info) {
+ console.warn(`WARN Runtime ${runtimeId} not found`);
+ return;
+ }
+ // kill the kernel process and free the ports
+ info.zmq_proc.kill();
+ usedPorts.delete(info.spec.shell_port);
+ usedPorts.delete(info.spec.iopub_port);
+ usedPorts.delete(info.spec.stdin_port);
+ usedPorts.delete(info.spec.control_port);
+ usedPorts.delete(info.spec.hb_port);
+ // kill the ws server and free its port
+ info.ws_server.close();
+ usedPorts.delete(info.ws_port);
+}
diff --git a/api/src/spawner/trpc.ts b/api/src/spawner/trpc.ts
new file mode 100644
index 00000000..87d1631e
--- /dev/null
+++ b/api/src/spawner/trpc.ts
@@ -0,0 +1,237 @@
+import { initTRPC } from "@trpc/server";
+const t = initTRPC.create();
+export const router = t.router;
+export const publicProcedure = t.procedure;
+
+import Y from "yjs";
+import WebSocket from "ws";
+import { z } from "zod";
+
+// import { WebsocketProvider } from "../../ui/src/lib/y-websocket";
+import { WebsocketProvider } from "../yjs/y-websocket";
+
+import { killRuntime, spawnRuntime } from "./spawner_native";
+
+import { connectSocket, runtime2socket, RuntimeInfo } from "./yjs_runtime";
+
+// FIXME need to have a TTL to clear the ydoc.
+const docs: Map = new Map();
+
+async function getMyYDoc({ repoId, yjsServerUrl }): Promise {
+ return new Promise((resolve, reject) => {
+ const oldydoc = docs.get(repoId);
+ if (oldydoc) {
+ resolve(oldydoc);
+ return;
+ }
+ const ydoc = new Y.Doc();
+ // connect to primary database
+ console.log("connecting to y-websocket provider", yjsServerUrl);
+ const provider = new WebsocketProvider(yjsServerUrl, repoId, ydoc, {
+ // resyncInterval: 2000,
+ //
+ // BC is more complex to track our custom Uploading status and SyncDone events.
+ disableBc: true,
+ params: {
+ role: "runtime",
+ },
+ // IMPORTANT: import websocket, because we're running it in node.js
+ WebSocketPolyfill: WebSocket as any,
+ });
+ provider.on("status", ({ status }) => {
+ console.log("provider status", status);
+ });
+ provider.once("synced", () => {
+ console.log("Provider synced");
+ docs.set(repoId, ydoc);
+ resolve(ydoc);
+ });
+ provider.connect();
+ });
+}
+
+const routingTable: Map = new Map();
+
+export function createSpawnerRouter(yjsServerUrl) {
+ return router({
+ spawnRuntime: publicProcedure
+ .input(z.object({ runtimeId: z.string(), repoId: z.string() }))
+ .mutation(async ({ input: { runtimeId, repoId } }) => {
+ console.log("spawnRuntime", runtimeId, repoId);
+ // create the runtime container
+ const wsUrl = await spawnRuntime(runtimeId);
+ console.log("Runtime spawned at", wsUrl);
+ routingTable.set(runtimeId, wsUrl);
+ // set initial runtimeMap info for this runtime
+ console.log("Loading yDoc ..");
+ const doc = await getMyYDoc({ repoId, yjsServerUrl });
+ console.log("yDoc loaded");
+ const rootMap = doc.getMap("rootMap");
+ const runtimeMap = rootMap.get("runtimeMap") as Y.Map;
+ runtimeMap.set(runtimeId, {});
+ // console.log("=== runtimeMap", runtimeMap);
+ let values = Array.from(runtimeMap.values());
+ const keys = Array.from(runtimeMap.keys());
+ console.log("all runtimes", keys);
+ const nodesMap = rootMap.get("nodesMap") as Y.Map;
+ const nodes = Array.from(nodesMap.values());
+ console.log("all nodes", nodes);
+ return true;
+ }),
+ killRuntime: publicProcedure
+ .input(z.object({ runtimeId: z.string(), repoId: z.string() }))
+ .mutation(async ({ input: { runtimeId, repoId } }) => {
+ await killRuntime(runtimeId);
+ console.log("Removing route ..");
+ // remove from runtimeMap
+ const doc = await getMyYDoc({ repoId, yjsServerUrl });
+ const rootMap = doc.getMap("rootMap");
+ const runtimeMap = rootMap.get("runtimeMap") as Y.Map;
+ runtimeMap.delete(runtimeId);
+ routingTable.delete(runtimeId);
+ return true;
+ }),
+
+ connectRuntime: publicProcedure
+ .input(z.object({ runtimeId: z.string(), repoId: z.string() }))
+ .mutation(async ({ input: { runtimeId, repoId } }) => {
+ console.log("=== connectRuntime", runtimeId, repoId);
+ // assuming doc is already loaded.
+ // FIXME this socket/ is the prefix of url. This is very prone to errors.
+ const doc = await getMyYDoc({ repoId, yjsServerUrl });
+ const rootMap = doc.getMap("rootMap");
+ console.log("rootMap", Array.from(rootMap.keys()));
+ const runtimeMap = rootMap.get("runtimeMap") as any;
+ const resultMap = rootMap.get("resultMap") as any;
+ await connectSocket({
+ runtimeId,
+ runtimeMap,
+ resultMap,
+ routingTable,
+ });
+ }),
+ disconnectRuntime: publicProcedure
+ .input(z.object({ runtimeId: z.string(), repoId: z.string() }))
+ .mutation(async ({ input: { runtimeId, repoId } }) => {
+ console.log("=== disconnectRuntime", runtimeId);
+ // get socket
+ const socket = runtime2socket.get(runtimeId);
+ if (socket) {
+ socket.close();
+ runtime2socket.delete(runtimeId);
+ }
+
+ const doc = await getMyYDoc({ repoId, yjsServerUrl });
+ const rootMap = doc.getMap("rootMap");
+ const runtimeMap = rootMap.get("runtimeMap") as Y.Map;
+ runtimeMap.set(runtimeId, {});
+ }),
+ runCode: publicProcedure
+ .input(
+ z.object({
+ runtimeId: z.string(),
+ spec: z.object({ code: z.string(), podId: z.string() }),
+ })
+ )
+ .mutation(
+ async ({
+ input: {
+ runtimeId,
+ spec: { code, podId },
+ },
+ }) => {
+ console.log("runCode", runtimeId, podId);
+ const socket = runtime2socket.get(runtimeId);
+ if (!socket) return false;
+ // clear old results
+ // TODO move this to frontend, because it is hard to get ydoc in GraphQL handler.
+ //
+ // console.log("clear old result");
+ // console.log("old", resultMap.get(runtimeId));
+ // resultMap.set(podId, { data: [] });
+ // console.log("new", resultMap.get(runtimeId));
+ // console.log("send new result");
+ socket.send(
+ JSON.stringify({
+ type: "runCode",
+ payload: {
+ lang: "python",
+ code: code,
+ raw: true,
+ podId: podId,
+ sessionId: runtimeId,
+ },
+ })
+ );
+ return true;
+ }
+ ),
+ runChain: publicProcedure
+ .input(
+ z.object({
+ runtimeId: z.string(),
+ specs: z.array(z.object({ code: z.string(), podId: z.string() })),
+ })
+ )
+ .mutation(async ({ input: { runtimeId, specs } }) => {
+ console.log("runChain", runtimeId);
+ const socket = runtime2socket.get(runtimeId);
+ if (!socket) return false;
+ specs.forEach(({ code, podId }) => {
+ socket.send(
+ JSON.stringify({
+ type: "runCode",
+ payload: {
+ lang: "python",
+ code: code,
+ raw: true,
+ podId: podId,
+ sessionId: runtimeId,
+ },
+ })
+ );
+ });
+ return true;
+ }),
+ interruptKernel: publicProcedure
+ .input(z.object({ runtimeId: z.string() }))
+ .mutation(async ({ input: { runtimeId } }) => {
+ const socket = runtime2socket.get(runtimeId);
+ if (!socket) return false;
+ socket.send(
+ JSON.stringify({
+ type: "interruptKernel",
+ payload: {
+ sessionId: runtimeId,
+ },
+ })
+ );
+ return true;
+ }),
+ requestKernelStatus: publicProcedure
+ .input(z.object({ runtimeId: z.string() }))
+ .mutation(async ({ input: { runtimeId } }) => {
+ console.log("requestKernelStatus", runtimeId);
+ const socket = runtime2socket.get(runtimeId);
+ if (!socket) {
+ console.log("WARN: socket not found");
+ return false;
+ }
+ socket.send(
+ JSON.stringify({
+ type: "requestKernelStatus",
+ payload: {
+ sessionId: runtimeId,
+ },
+ })
+ );
+ return true;
+ }),
+ });
+}
+
+// This is only used for frontend to get the type of router.
+const _appRouter_for_type = router({
+ spawner: createSpawnerRouter(null), // put procedures under "post" namespace
+});
+export type AppRouter = typeof _appRouter_for_type;
diff --git a/api/src/spawner/yjs_runtime.ts b/api/src/spawner/yjs_runtime.ts
new file mode 100644
index 00000000..d621c601
--- /dev/null
+++ b/api/src/spawner/yjs_runtime.ts
@@ -0,0 +1,185 @@
+import * as Y from "yjs";
+import WebSocket from "ws";
+
+export type PodResult = {
+ exec_count?: number;
+ data: {
+ type: string;
+ html?: string;
+ text?: string;
+ image?: string;
+ }[];
+ running?: boolean;
+ lastExecutedAt?: number;
+ error?: { ename: string; evalue: string; stacktrace: string[] } | null;
+};
+
+export type RuntimeInfo = {
+ status?: string;
+ wsStatus?: string;
+};
+
+export const runtime2socket = new Map();
+
+export async function setupRuntimeSocket({
+ socket,
+ sessionId,
+ runtimeMap,
+ resultMap,
+}: {
+ resultMap: Y.Map;
+ runtimeMap: Y.Map;
+ sessionId: string;
+ socket: WebSocket;
+}) {
+ console.log("--- setupRuntimeSocket", sessionId);
+ socket.onopen = () => {
+ console.log("socket connected for runtime", sessionId);
+ runtimeMap.set(sessionId, {
+ wsStatus: "connected",
+ });
+ runtime2socket.set(sessionId, socket);
+ // request kernel status
+ socket.send(
+ JSON.stringify({
+ type: "requestKernelStatus",
+ payload: {
+ sessionId,
+ },
+ })
+ );
+ };
+ socket.onclose = () => {
+ console.log("Socket closed for runtime", sessionId);
+ runtimeMap.set(sessionId, {
+ wsStatus: "disconnected",
+ });
+ runtime2socket.delete(sessionId);
+ };
+ socket.onerror = (err) => {
+ console.error("[ERROR] Got error", err.message);
+ // if error is 404, try create the kernel
+ };
+ socket.onmessage = (msg) => {
+ // FIXME is msg.data a string?
+ let { type, payload } = JSON.parse(msg.data as string);
+ // console.debug("got message", type, payload);
+
+ switch (type) {
+ case "stream":
+ {
+ let { podId, content } = payload;
+ const oldresult: PodResult = resultMap.get(podId) || { data: [] };
+ // FIXME if I modify the object, would it modify resultMap as well?
+ oldresult.data.push({
+ type: `${type}_${content.name}`,
+ text: content.text,
+ });
+ resultMap.set(podId, oldresult);
+ }
+ break;
+ case "execute_result":
+ {
+ let { podId, content, count } = payload;
+ const oldresult: PodResult = resultMap.get(podId) || { data: [] };
+ oldresult.data.push({
+ type,
+ text: content.data["text/plain"],
+ html: content.data["text/html"],
+ });
+ resultMap.set(podId, oldresult);
+ }
+ break;
+ case "display_data":
+ {
+ let { podId, content } = payload;
+ const oldresult: PodResult = resultMap.get(podId) || { data: [] };
+ oldresult.data.push({
+ type,
+ text: content.data["text/plain"],
+ image: content.data["image/png"],
+ html: content.data["text/html"],
+ });
+ resultMap.set(podId, oldresult);
+ }
+ break;
+ case "execute_reply":
+ {
+ let { podId, result, count } = payload;
+ const oldresult: PodResult = resultMap.get(podId) || { data: [] };
+ oldresult.running = false;
+ oldresult.lastExecutedAt = Date.now();
+ oldresult.exec_count = count;
+ resultMap.set(podId, oldresult);
+ }
+ break;
+ case "error":
+ {
+ let { podId, ename, evalue, stacktrace } = payload;
+ const oldresult: PodResult = resultMap.get(podId) || { data: [] };
+ oldresult.error = { ename, evalue, stacktrace };
+ }
+ break;
+ case "status":
+ {
+ const { lang, status, id } = payload;
+ // listen to messages
+ runtimeMap.set(sessionId, { ...runtimeMap.get(sessionId), status });
+ }
+ break;
+ case "interrupt_reply":
+ // console.log("got interrupt_reply", payload);
+ break;
+ default:
+ console.warn("WARNING unhandled message", { type, payload });
+ }
+ };
+}
+
+/**
+ * Get the active socket. Create if not connected.
+ */
+export async function connectSocket({
+ runtimeId,
+ runtimeMap,
+ resultMap,
+ routingTable,
+}: {
+ runtimeId: string;
+ runtimeMap: Y.Map;
+ resultMap: Y.Map;
+ routingTable: Map;
+}) {
+ console.log("connectSocket");
+ const runtime = runtimeMap.get(runtimeId)!;
+ switch (runtime.wsStatus) {
+ case "connecting":
+ // FIXME connecting status could cause dead lock.
+ console.log("socket was connecting, skip");
+ return;
+ case "connected":
+ console.log("socket was connected, skip");
+ return;
+ case "disconnected":
+ case undefined:
+ {
+ const url = routingTable.get(runtimeId);
+ if (!url) throw new Error(`cannot find url for runtime ${runtimeId}`);
+ console.log("connecting to websocket url", url);
+ runtimeMap.set(runtimeId, {
+ ...runtime,
+ wsStatus: "connecting",
+ });
+ let socket = new WebSocket(url);
+ await setupRuntimeSocket({
+ socket,
+ sessionId: runtimeId,
+ runtimeMap,
+ resultMap,
+ });
+ }
+ break;
+ default:
+ throw new Error(`unknown wsStatus ${runtime.wsStatus}`);
+ }
+}
diff --git a/api/src/typedefs.ts b/api/src/typedefs.ts
deleted file mode 100644
index 0d9a3085..00000000
--- a/api/src/typedefs.ts
+++ /dev/null
@@ -1,146 +0,0 @@
-import { gql } from "apollo-server";
-
-export const typeDefs = gql`
- type AuthData {
- token: String
- }
-
- type User {
- id: ID!
- username: String
- email: String!
- password: String!
- firstname: String!
- lastname: String!
- }
-
- type Visibility {
- collaborators: [User]
- isPublic: Boolean
- }
-
- type Repo {
- id: ID!
- name: String
- pods: [Pod]
- edges: [Edge]
- userId: ID!
- collaborators: [User]
- public: Boolean
- createdAt: String
- updatedAt: String
- }
-
- type Edge {
- source: String!
- target: String!
- }
-
- type Pod {
- id: ID!
- type: String
- content: String
- githead: String
- staged: String
- column: Int
- lang: String
- parent: Pod
- index: Int
- children: [Pod]
- result: String
- stdout: String
- error: String
- imports: String
- exports: String
- reexports: String
- midports: String
- fold: Boolean
- thundar: Boolean
- utility: Boolean
- name: String
- x: Float
- y: Float
- width: Float
- height: Float
- }
-
- input PodInput {
- id: ID!
- type: String
- content: String
- column: Int
- lang: String
- result: String
- stdout: String
- error: String
- imports: String
- exports: String
- reexports: String
- midports: String
- fold: Boolean
- thundar: Boolean
- utility: Boolean
- name: String
- x: Float
- y: Float
- width: Float
- height: Float
- parent: ID
- children: [ID]
- }
-
- type RuntimeInfo {
- startedAt: String
- lastActive: String
- sessionId: String
- ttl: Int
- }
-
- type Query {
- hello: String
- users: [User]
- me: User
- repos: [Repo]
- repo(id: String!): Repo
- pod(id: ID!): Pod
- myRepos: [Repo]
- activeSessions: [String]
- getVisibility(repoId: String!): Visibility
- listAllRuntimes: [RuntimeInfo]
- myCollabRepos: [Repo]
- infoRuntime(sessionId: String!): RuntimeInfo
- }
-
- type Mutation {
- login(email: String!, password: String!): AuthData
- loginGuest(id: String!): AuthData
- signupGuest: AuthData
- signup(
- email: String!
- password: String!
- firstname: String!
- lastname: String!
- ): AuthData
- loginWithGoogle(idToken: String!): AuthData
- updateUser(email: String!, firstname: String!, lastname: String!): Boolean
- createRepo: Repo
- updateRepo(id: ID!, name: String!): Boolean
- deleteRepo(id: ID!): Boolean
- deletePods(ids: [String]): Boolean
- addPods(repoId: String!, pods: [PodInput]): Boolean
- updatePod(id: String!, repoId: String!, input: PodInput): Boolean
- addEdge(source: ID!, target: ID!): Boolean
- deleteEdge(source: ID!, target: ID!): Boolean
- clearUser: Boolean
- clearRepo: Boolean
- clearPod: Boolean
- spawnRuntime(sessionId: String!): Boolean
- killRuntime(sessionId: String!): Boolean
- updateVisibility(repoId: String!, isPublic: Boolean!): Boolean
- addCollaborator(repoId: String!, email: String!): Boolean
- deleteCollaborator(repoId: String!, collaboratorId: String!): Boolean
-
- exportJSON(repoId: String!): String!
- exportFile(repoId: String!): String!
- }
-`;
diff --git a/api/src/yjs/y-websocket.js b/api/src/yjs/y-websocket.js
new file mode 100644
index 00000000..7d2b2944
--- /dev/null
+++ b/api/src/yjs/y-websocket.js
@@ -0,0 +1,544 @@
+/**
+ * @module provider/websocket
+ */
+
+/* eslint-env browser */
+
+import * as Y from "yjs"; // eslint-disable-line
+import * as bc from "lib0/broadcastchannel";
+import * as time from "lib0/time";
+import * as encoding from "lib0/encoding";
+import * as decoding from "lib0/decoding";
+import * as syncProtocol from "y-protocols/sync";
+import * as authProtocol from "y-protocols/auth";
+import * as awarenessProtocol from "y-protocols/awareness";
+import { Observable } from "lib0/observable";
+import * as math from "lib0/math";
+import * as url from "lib0/url";
+
+export const messageSync = 0;
+export const messageQueryAwareness = 3;
+export const messageAwareness = 1;
+export const messageAuth = 2;
+
+/**
+ * encoder, decoder, provider, emitSynced, messageType
+ * @type {Array}
+ */
+const messageHandlers = [];
+
+const messageYjsSyncDone = 3;
+
+const readSyncMessage = (decoder, encoder, doc, transactionOrigin) => {
+ const messageType = decoding.readVarUint(decoder);
+ switch (messageType) {
+ case syncProtocol.messageYjsSyncStep1:
+ syncProtocol.readSyncStep1(decoder, encoder, doc);
+ break;
+ case syncProtocol.messageYjsSyncStep2:
+ syncProtocol.readSyncStep2(decoder, doc, transactionOrigin);
+ // there will be a sync step 1 after the step 2
+ // syncProtocol.readSyncStep1(decoder, encoder, doc);
+ break;
+ case syncProtocol.messageYjsUpdate:
+ syncProtocol.readUpdate(decoder, doc, transactionOrigin);
+ break;
+ case messageYjsSyncDone:
+ // But do I know which sync is done? That doesn't matter. I just set
+ // sync-status to dirty when we send out step2 or update, and mark it
+ // clean when we receive sync-done.
+ break;
+ default:
+ throw new Error("Unknown message type");
+ }
+ return messageType;
+};
+
+messageHandlers[messageSync] = (
+ encoder,
+ decoder,
+ provider,
+ emitSynced,
+ _messageType
+) => {
+ encoding.writeVarUint(encoder, messageSync);
+ const syncMessageType = readSyncMessage(
+ decoder,
+ encoder,
+ provider.doc,
+ provider
+ );
+ if (
+ emitSynced &&
+ syncMessageType === syncProtocol.messageYjsSyncStep2 &&
+ !provider.synced
+ ) {
+ provider.synced = true;
+ }
+ if (
+ syncMessageType === syncProtocol.messageYjsSyncStep1 &&
+ encoding.length(encoder) > 1
+ ) {
+ // This is a non-empty reply to upload data to the server, so we set
+ // dirty/pending field.
+ provider.emit("mySync", ["uploading"]);
+ }
+ if (syncMessageType === messageYjsSyncDone) {
+ // provider.step = "synced";
+ provider.emit("mySync", ["synced"]);
+ }
+};
+
+messageHandlers[messageQueryAwareness] = (
+ encoder,
+ _decoder,
+ provider,
+ _emitSynced,
+ _messageType
+) => {
+ encoding.writeVarUint(encoder, messageAwareness);
+ encoding.writeVarUint8Array(
+ encoder,
+ awarenessProtocol.encodeAwarenessUpdate(
+ provider.awareness,
+ Array.from(provider.awareness.getStates().keys())
+ )
+ );
+};
+
+messageHandlers[messageAwareness] = (
+ _encoder,
+ decoder,
+ provider,
+ _emitSynced,
+ _messageType
+) => {
+ awarenessProtocol.applyAwarenessUpdate(
+ provider.awareness,
+ decoding.readVarUint8Array(decoder),
+ provider
+ );
+};
+
+messageHandlers[messageAuth] = (
+ _encoder,
+ decoder,
+ provider,
+ _emitSynced,
+ _messageType
+) => {
+ authProtocol.readAuthMessage(decoder, provider.doc, (_ydoc, reason) =>
+ permissionDeniedHandler(provider, reason)
+ );
+};
+
+// @todo - this should depend on awareness.outdatedTime
+const messageReconnectTimeout = 30000;
+
+/**
+ * @param {WebsocketProvider} provider
+ * @param {string} reason
+ */
+const permissionDeniedHandler = (provider, reason) =>
+ console.warn(`Permission denied to access ${provider.url}.\n${reason}`);
+
+/**
+ * @param {WebsocketProvider} provider
+ * @param {Uint8Array} buf
+ * @param {boolean} emitSynced
+ * @return {encoding.Encoder}
+ */
+const readMessage = (provider, buf, emitSynced) => {
+ const decoder = decoding.createDecoder(buf);
+ const encoder = encoding.createEncoder();
+ const messageType = decoding.readVarUint(decoder);
+ const messageHandler = provider.messageHandlers[messageType];
+ if (/** @type {any} */ messageHandler) {
+ messageHandler(encoder, decoder, provider, emitSynced, messageType);
+ } else {
+ console.error("Unable to compute message");
+ }
+ return encoder;
+};
+
+/**
+ * @param {WebsocketProvider} provider
+ */
+const setupWS = (provider) => {
+ if (provider.shouldConnect && provider.ws === null) {
+ const websocket = new provider._WS(provider.url);
+ websocket.binaryType = "arraybuffer";
+ provider.ws = websocket;
+ provider.wsconnecting = true;
+ provider.wsconnected = false;
+ provider.synced = false;
+
+ websocket.onmessage = (event) => {
+ provider.wsLastMessageReceived = time.getUnixTime();
+ const encoder = readMessage(provider, new Uint8Array(event.data), true);
+ if (encoding.length(encoder) > 1) {
+ websocket.send(encoding.toUint8Array(encoder));
+ }
+ };
+ websocket.onerror = (event) => {
+ provider.emit("connection-error", [event, provider]);
+ };
+ websocket.onclose = (event) => {
+ provider.emit("connection-close", [event, provider]);
+ provider.ws = null;
+ provider.wsconnecting = false;
+ if (provider.wsconnected) {
+ provider.wsconnected = false;
+ provider.synced = false;
+ // update awareness (all users except local left)
+ awarenessProtocol.removeAwarenessStates(
+ provider.awareness,
+ Array.from(provider.awareness.getStates().keys()).filter(
+ (client) => client !== provider.doc.clientID
+ ),
+ provider
+ );
+ provider.emit("status", [
+ {
+ status: "disconnected",
+ },
+ ]);
+ } else {
+ provider.wsUnsuccessfulReconnects++;
+ }
+ // Start with no reconnect timeout and increase timeout by
+ // using exponential backoff starting with 100ms
+ setTimeout(
+ setupWS,
+ math.min(
+ math.pow(2, provider.wsUnsuccessfulReconnects) * 100,
+ provider.maxBackoffTime
+ ),
+ provider
+ );
+ };
+ websocket.onopen = () => {
+ provider.wsLastMessageReceived = time.getUnixTime();
+ provider.wsconnecting = false;
+ provider.wsconnected = true;
+ provider.wsUnsuccessfulReconnects = 0;
+ provider.emit("status", [
+ {
+ status: "connected",
+ },
+ ]);
+ // always send sync step 1 when connected
+ const encoder = encoding.createEncoder();
+ encoding.writeVarUint(encoder, messageSync);
+ syncProtocol.writeSyncStep1(encoder, provider.doc);
+ websocket.send(encoding.toUint8Array(encoder));
+ // broadcast local awareness state
+ if (provider.awareness.getLocalState() !== null) {
+ const encoderAwarenessState = encoding.createEncoder();
+ encoding.writeVarUint(encoderAwarenessState, messageAwareness);
+ encoding.writeVarUint8Array(
+ encoderAwarenessState,
+ awarenessProtocol.encodeAwarenessUpdate(provider.awareness, [
+ provider.doc.clientID,
+ ])
+ );
+ websocket.send(encoding.toUint8Array(encoderAwarenessState));
+ }
+ };
+ provider.emit("status", [
+ {
+ status: "connecting",
+ },
+ ]);
+ }
+};
+
+/**
+ * @param {WebsocketProvider} provider
+ * @param {ArrayBuffer} buf
+ */
+const broadcastMessage = (provider, buf) => {
+ const ws = provider.ws;
+ if (provider.wsconnected && ws && ws.readyState === ws.OPEN) {
+ ws.send(buf);
+ }
+ if (provider.bcconnected) {
+ bc.publish(provider.bcChannel, buf, provider);
+ }
+};
+
+/**
+ * Websocket Provider for Yjs. Creates a websocket connection to sync the shared document.
+ * The document name is attached to the provided url. I.e. the following example
+ * creates a websocket connection to http://localhost:1234/my-document-name
+ *
+ * @example
+ * import * as Y from 'yjs'
+ * import { WebsocketProvider } from 'y-websocket'
+ * const doc = new Y.Doc()
+ * const provider = new WebsocketProvider('http://localhost:1234', 'my-document-name', doc)
+ *
+ * @extends {Observable}
+ */
+export class WebsocketProvider extends Observable {
+ /**
+ * @param {string} serverUrl
+ * @param {string} roomname
+ * @param {Y.Doc} doc
+ * @param {object} opts
+ * @param {boolean} [opts.connect]
+ * @param {awarenessProtocol.Awareness} [opts.awareness]
+ * @param {Object} [opts.params]
+ * @param {typeof WebSocket} [opts.WebSocketPolyfill] Optionall provide a WebSocket polyfill
+ * @param {number} [opts.resyncInterval] Request server state every `resyncInterval` milliseconds
+ * @param {number} [opts.maxBackoffTime] Maximum amount of time to wait before trying to reconnect (we try to reconnect using exponential backoff)
+ * @param {boolean} [opts.disableBc] Disable cross-tab BroadcastChannel communication
+ */
+ constructor(
+ serverUrl,
+ roomname,
+ doc,
+ {
+ connect = true,
+ awareness = new awarenessProtocol.Awareness(doc),
+ params = {},
+ WebSocketPolyfill = WebSocket,
+ resyncInterval = -1,
+ maxBackoffTime = 2500,
+ disableBc = false,
+ } = {}
+ ) {
+ super();
+ // ensure that url is always ends with /
+ while (serverUrl[serverUrl.length - 1] === "/") {
+ serverUrl = serverUrl.slice(0, serverUrl.length - 1);
+ }
+ const encodedParams = url.encodeQueryParams(params);
+ this.maxBackoffTime = maxBackoffTime;
+ this.bcChannel = serverUrl + "/" + roomname;
+ this.url =
+ serverUrl +
+ "/" +
+ roomname +
+ (encodedParams.length === 0 ? "" : "?" + encodedParams);
+ this.roomname = roomname;
+ this.doc = doc;
+ this._WS = WebSocketPolyfill;
+ this.awareness = awareness;
+ this.wsconnected = false;
+ this.wsconnecting = false;
+ this.bcconnected = false;
+ this.disableBc = disableBc;
+ this.wsUnsuccessfulReconnects = 0;
+ this.messageHandlers = messageHandlers.slice();
+ /**
+ * @type {boolean}
+ */
+ this._synced = false;
+ /**
+ * @type {WebSocket?}
+ */
+ this.ws = null;
+ this.wsLastMessageReceived = 0;
+ /**
+ * Whether to connect to other peers or not
+ * @type {boolean}
+ */
+ this.shouldConnect = connect;
+
+ /**
+ * @type {number}
+ */
+ this._resyncInterval = 0;
+ if (resyncInterval > 0) {
+ this._resyncInterval = /** @type {any} */ setInterval(() => {
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
+ // resend sync step 1
+ const encoder = encoding.createEncoder();
+ encoding.writeVarUint(encoder, messageSync);
+ syncProtocol.writeSyncStep1(encoder, doc);
+ this.ws.send(encoding.toUint8Array(encoder));
+ }
+ }, resyncInterval);
+ }
+
+ /**
+ * @param {ArrayBuffer} data
+ * @param {any} origin
+ */
+ this._bcSubscriber = (data, origin) => {
+ if (origin !== this) {
+ const encoder = readMessage(this, new Uint8Array(data), false);
+ if (encoding.length(encoder) > 1) {
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoder), this);
+ }
+ }
+ };
+ /**
+ * Listens to Yjs updates and sends them to remote peers (ws and broadcastchannel)
+ * @param {Uint8Array} update
+ * @param {any} origin
+ */
+ this._updateHandler = (update, origin) => {
+ if (origin !== this) {
+ const encoder = encoding.createEncoder();
+ encoding.writeVarUint(encoder, messageSync);
+ // this is actually where we upload local changes to the server.
+ this.emit("mySync", ["uploading"]);
+ syncProtocol.writeUpdate(encoder, update);
+ broadcastMessage(this, encoding.toUint8Array(encoder));
+ }
+ };
+ this.doc.on("update", this._updateHandler);
+ /**
+ * @param {any} changed
+ * @param {any} _origin
+ */
+ this._awarenessUpdateHandler = ({ added, updated, removed }, _origin) => {
+ const changedClients = added.concat(updated).concat(removed);
+ const encoder = encoding.createEncoder();
+ encoding.writeVarUint(encoder, messageAwareness);
+ encoding.writeVarUint8Array(
+ encoder,
+ awarenessProtocol.encodeAwarenessUpdate(awareness, changedClients)
+ );
+ broadcastMessage(this, encoding.toUint8Array(encoder));
+ };
+ this._unloadHandler = () => {
+ awarenessProtocol.removeAwarenessStates(
+ this.awareness,
+ [doc.clientID],
+ "window unload"
+ );
+ };
+ if (typeof window !== "undefined") {
+ window.addEventListener("unload", this._unloadHandler);
+ } else if (typeof process !== "undefined") {
+ process.on("exit", this._unloadHandler);
+ }
+ awareness.on("update", this._awarenessUpdateHandler);
+ this._checkInterval = /** @type {any} */ setInterval(() => {
+ if (
+ this.wsconnected &&
+ messageReconnectTimeout <
+ time.getUnixTime() - this.wsLastMessageReceived
+ ) {
+ // no message received in a long time - not even your own awareness
+ // updates (which are updated every 15 seconds)
+ /** @type {WebSocket} */ this.ws.close();
+ }
+ }, messageReconnectTimeout / 10);
+ if (connect) {
+ this.connect();
+ }
+ }
+
+ /**
+ * @type {boolean}
+ */
+ get synced() {
+ return this._synced;
+ }
+
+ set synced(state) {
+ if (this._synced !== state) {
+ this._synced = state;
+ this.emit("synced", [state]);
+ this.emit("sync", [state]);
+ }
+ }
+
+ destroy() {
+ if (this._resyncInterval !== 0) {
+ clearInterval(this._resyncInterval);
+ }
+ clearInterval(this._checkInterval);
+ this.disconnect();
+ if (typeof window !== "undefined") {
+ window.removeEventListener("unload", this._unloadHandler);
+ } else if (typeof process !== "undefined") {
+ process.off("exit", this._unloadHandler);
+ }
+ this.awareness.off("update", this._awarenessUpdateHandler);
+ this.doc.off("update", this._updateHandler);
+ super.destroy();
+ }
+
+ connectBc() {
+ if (this.disableBc) {
+ return;
+ }
+ if (!this.bcconnected) {
+ bc.subscribe(this.bcChannel, this._bcSubscriber);
+ this.bcconnected = true;
+ }
+ // send sync step1 to bc
+ // write sync step 1
+ const encoderSync = encoding.createEncoder();
+ encoding.writeVarUint(encoderSync, messageSync);
+ syncProtocol.writeSyncStep1(encoderSync, this.doc);
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoderSync), this);
+ // broadcast local state
+ const encoderState = encoding.createEncoder();
+ encoding.writeVarUint(encoderState, messageSync);
+ syncProtocol.writeSyncStep2(encoderState, this.doc);
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoderState), this);
+ // write queryAwareness
+ const encoderAwarenessQuery = encoding.createEncoder();
+ encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness);
+ bc.publish(
+ this.bcChannel,
+ encoding.toUint8Array(encoderAwarenessQuery),
+ this
+ );
+ // broadcast local awareness state
+ const encoderAwarenessState = encoding.createEncoder();
+ encoding.writeVarUint(encoderAwarenessState, messageAwareness);
+ encoding.writeVarUint8Array(
+ encoderAwarenessState,
+ awarenessProtocol.encodeAwarenessUpdate(this.awareness, [
+ this.doc.clientID,
+ ])
+ );
+ bc.publish(
+ this.bcChannel,
+ encoding.toUint8Array(encoderAwarenessState),
+ this
+ );
+ }
+
+ disconnectBc() {
+ // broadcast message with local awareness state set to null (indicating disconnect)
+ const encoder = encoding.createEncoder();
+ encoding.writeVarUint(encoder, messageAwareness);
+ encoding.writeVarUint8Array(
+ encoder,
+ awarenessProtocol.encodeAwarenessUpdate(
+ this.awareness,
+ [this.doc.clientID],
+ new Map()
+ )
+ );
+ broadcastMessage(this, encoding.toUint8Array(encoder));
+ if (this.bcconnected) {
+ bc.unsubscribe(this.bcChannel, this._bcSubscriber);
+ this.bcconnected = false;
+ }
+ }
+
+ disconnect() {
+ this.shouldConnect = false;
+ this.disconnectBc();
+ if (this.ws !== null) {
+ this.ws.close();
+ }
+ }
+
+ connect() {
+ this.shouldConnect = true;
+ if (!this.wsconnected && this.ws === null) {
+ setupWS(this);
+ this.connectBc();
+ }
+ }
+}
diff --git a/api/src/yjs/yjs-blob.ts b/api/src/yjs/yjs-blob.ts
new file mode 100644
index 00000000..483d6e96
--- /dev/null
+++ b/api/src/yjs/yjs-blob.ts
@@ -0,0 +1,174 @@
+/**
+ * This is an alternative to yjs-plain. The persietence layer here saves a
+ * binary blob to the DB.
+ *
+ * Cons (and the reason why I'm not using this):
+ * - This requires DB schame change and manual DB migration.
+ *
+ * Pros:
+ * - Support history.
+ * - The logic is simpler than yjs-plain, no need to save each entries to the
+ * DB, just the single entire Y.Doc blob.
+ * - The plain version seems to have trouble syncing with reconnected clients.
+ * I.e., if a client disconnects, make some offline edits, and connect back,
+ * those offline edits are not synced. THIS is the reason why I'm using this
+ * binary blob version.
+ */
+
+// throw new Error("Experimental not implemented.");
+
+import fs from "fs";
+import Y from "yjs";
+
+import debounce from "lodash/debounce";
+
+const debounceRegistry = new Map();
+/**
+ * Invoke the callback that debounce w.r.t. the key. Also register the callback
+ * in the registry to make sure it's called before the connection is closed..
+ */
+function getDebouncedCallback(key) {
+ if (!debounceRegistry.has(key)) {
+ console.log("registering for", key);
+ debounceRegistry.set(
+ key,
+ debounce(
+ (cb) => {
+ console.log("debounced callback for", key);
+ cb();
+ },
+ // write if no new activity in 10s
+ 1000,
+ {
+ // write at least every 20s
+ maxWait: 5000,
+ }
+ )
+ );
+ }
+ // 2. call it
+ return debounceRegistry.get(key);
+}
+
+function handleSaveBlob({ repoId, yDocBlob, repoDir }) {
+ console.log("save blob", repoId, yDocBlob.length);
+ // create the yjs-blob folder if not exists
+ if (!fs.existsSync(repoDir)) {
+ fs.mkdirSync(repoDir, { recursive: true });
+ }
+ // save the blob to file system
+ fs.writeFileSync(`${repoDir}/codepod.bin`, yDocBlob);
+}
+
+function handleSavePlain({ repoId, ydoc, repoDir }) {
+ console.log("save plain", repoId);
+ // save the plain to file system
+ const rootMap = ydoc.getMap("rootMap");
+ const nodesMap = rootMap.get("nodesMap") as Y.Map;
+ const edgesMap = rootMap.get("edgesMap") as Y.Map;
+ const codeMap = rootMap.get("codeMap") as Y.Map;
+ const richMap = rootMap.get("richMap") as Y.Map;
+ const resultMap = rootMap.get("resultMap") as Y.Map;
+ const runtimeMap = rootMap.get("runtimeMap") as Y.Map;
+ const metaMap = rootMap.get("metaMap") as Y.Map;
+ const plain = {
+ lastUpdate: new Date().toISOString(),
+ metaMap: metaMap.toJSON(),
+ nodesMap: nodesMap.toJSON(),
+ edgesMap: edgesMap.toJSON(),
+ codeMap: codeMap.toJSON(),
+ richMap: richMap.toJSON(),
+ resultMap: resultMap.toJSON(),
+ runtimeMap: runtimeMap.toJSON(),
+ };
+ if (!fs.existsSync(repoDir)) {
+ fs.mkdirSync(repoDir, { recursive: true });
+ }
+ fs.writeFileSync(`${repoDir}/codepod.json`, JSON.stringify(plain, null, 2));
+}
+
+/**
+ * This function is called when setting up the WS connection, after the loadFromCodePod step.
+ * TODO need to make sure this is only called once per repo, regardless of how many users are connected later.
+ */
+function setupObserversToDB(ydoc: Y.Doc, repoId: string, repoDir: string) {
+ console.log("setupObserversToDB for repo", repoId);
+ // just observe and save the entire doc
+ function observer(_, transaction) {
+ if (transaction.local) {
+ // There shouldn't be local updates.
+ console.log("[WARNING] Local update");
+ return;
+ }
+ // FIXME the waiting time could be used to reduce the cost of saving to DB.
+ getDebouncedCallback(`update-blob-${repoId}`)(() => {
+ // encode state as update
+ // FIXME it may be too expensive to update the entire doc.
+ // FIXME history is discarded
+ const update = Y.encodeStateAsUpdate(ydoc);
+ handleSaveBlob({ repoId, yDocBlob: Buffer.from(update), repoDir });
+ handleSavePlain({ repoId, ydoc, repoDir });
+ });
+ }
+ const rootMap = ydoc.getMap("rootMap");
+ const nodesMap = rootMap.get("nodesMap") as Y.Map;
+ nodesMap.observe(observer);
+ const edgesMap = rootMap.get("edgesMap") as Y.Map;
+ edgesMap.observe(observer);
+ const codeMap = rootMap.get("codeMap") as Y.Map;
+ codeMap.observeDeep(observer);
+ const richMap = rootMap.get("richMap") as Y.Map;
+ richMap.observeDeep(observer);
+ const resultMap = rootMap.get("resultMap") as Y.Map;
+ resultMap.observeDeep(observer);
+}
+
+/**
+ * This function is called when setting up the WS connection, as a first step.
+ */
+async function loadFromFS(ydoc: Y.Doc, repoId: string, repoDir: string) {
+ // load from the database and write to the ydoc
+ console.log("=== loadFromFS");
+ // read the blob from file system
+ const binFile = `${repoDir}/codepod.bin`;
+ if (fs.existsSync(binFile)) {
+ const yDocBlob = fs.readFileSync(binFile);
+ Y.applyUpdate(ydoc, yDocBlob);
+ } else {
+ // init the ydoc
+ const rootMap = ydoc.getMap("rootMap");
+ rootMap.set("nodesMap", new Y.Map());
+ rootMap.set("edgesMap", new Y.Map());
+ rootMap.set("codeMap", new Y.Map());
+ rootMap.set("richMap", new Y.Map());
+ rootMap.set("resultMap", new Y.Map());
+ rootMap.set("runtimeMap", new Y.Map());
+ const metaMap = new Y.Map();
+ metaMap.set("version", "v0.0.1");
+ rootMap.set("metaMap", metaMap);
+ }
+}
+
+export async function bindState(doc: Y.Doc, repoId: string, repoDir: string) {
+ // Load persisted document state from the database.
+ await loadFromFS(doc, repoId, repoDir);
+ // Observe changes and write to the database.
+ setupObserversToDB(doc, repoId, repoDir);
+ // setupObserversToRuntime(doc, repoId);
+ // reset runtime status
+ // clear runtimeMap status/commands but keep the ID
+ const rootMap = doc.getMap("rootMap");
+ if (rootMap.get("runtimeMap") === undefined) {
+ rootMap.set("runtimeMap", new Y.Map());
+ }
+ const runtimeMap = rootMap.get("runtimeMap") as Y.Map;
+ for (let key of runtimeMap.keys()) {
+ runtimeMap.set(key, {});
+ }
+}
+
+export function writeState() {
+ // FIXME IMPORTANT make sure the observer events are finished.
+ console.log("=== flushing allDebouncedCallbacks", debounceRegistry.size);
+ debounceRegistry.forEach((cb) => cb.flush());
+}
diff --git a/api/src/yjs/yjs-setupWS.ts b/api/src/yjs/yjs-setupWS.ts
new file mode 100644
index 00000000..cb797130
--- /dev/null
+++ b/api/src/yjs/yjs-setupWS.ts
@@ -0,0 +1,388 @@
+// Code from https://github.com/yjs/y-protocols
+
+import Y from "yjs";
+import * as awarenessProtocol from "y-protocols/awareness";
+import * as syncProtocol from "y-protocols/sync";
+
+import { encoding, decoding, map } from "lib0";
+
+let writeState: () => any = () => {
+ throw new Error("writeState not set");
+};
+let bindState = async (doc: Y.Doc, repoId: string) => {
+ throw new Error("bindState not set");
+};
+
+const wsReadyStateConnecting = 0;
+const wsReadyStateOpen = 1;
+
+// disable gc when using snapshots!
+const gcEnabled = process.env.GC !== "false" && process.env.GC !== "0";
+
+/**
+ * @type {Map}
+ */
+const docs: Map = new Map();
+// exporting docs so that others can use it
+
+const messageSync = 0;
+const messageAwareness = 1;
+// const messageAuth = 2
+
+/**
+ * @param {Uint8Array} update
+ * @param {any} origin
+ * @param {WSSharedDoc} doc
+ */
+const updateHandler = (update, origin, doc) => {
+ const encoder = encoding.createEncoder();
+ encoding.writeVarUint(encoder, messageSync);
+ syncProtocol.writeUpdate(encoder, update);
+ const message = encoding.toUint8Array(encoder);
+ doc.conns.forEach((_, conn) => send(doc, conn, message));
+};
+
+class WSSharedDoc extends Y.Doc {
+ name: string;
+ conns: Map>;
+ awareness: awarenessProtocol.Awareness;
+
+ constructor(name) {
+ super({ gc: gcEnabled });
+ this.name = name;
+ /**
+ * Maps from conn to set of controlled user ids. Delete all user ids from awareness when this conn is closed
+ * @type {Map