├── .dockerignore ├── .gitignore ├── .vscode └── settings.json ├── Dockerfile ├── LICENSE ├── README.md ├── builder ├── Dockerfile ├── build-functions.sh └── build.sh ├── docker-compose.yml ├── ecosystem.config.js ├── frontend ├── .babelrc ├── assets │ ├── building-status.svg │ ├── error-status.svg │ ├── failed-status.svg │ ├── logo.png │ ├── logo.svg │ └── success-status.svg ├── package.json ├── src │ ├── index.html │ └── index.tsx ├── tsconfig.json └── yarn.lock ├── install.sh └── server ├── .env example ├── package.json ├── src ├── BuildProcesses │ └── index.ts ├── build │ └── index.ts ├── config.ts ├── docker │ ├── buildImage.ts │ ├── checkBuilderImage.ts │ ├── createBuilderContainer.ts │ ├── helpers.ts │ └── index.ts ├── env.ts ├── index.ts ├── middlewares │ ├── index.ts │ └── withAuth.ts ├── routes │ ├── authenticate.ts │ ├── badge.ts │ ├── build.ts │ ├── builds.ts │ ├── createSite.ts │ ├── delSite.ts │ ├── events.ts │ └── getSite.ts ├── sql │ ├── Event.ts │ ├── Site.ts │ └── index.ts ├── types │ └── index.ts └── util │ └── index.ts ├── tsconfig.json └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | db 2 | mongodb 3 | sites-public 4 | builds-out 5 | node_modules 6 | dist 7 | .cache 8 | .vscode 9 | resources 10 | .gitignore 11 | LICENSE 12 | README.md -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/node,code,react,macos 3 | # Edit at https://www.gitignore.io/?templates=node,code,react,macos 4 | 5 | ### Code ### 6 | .vscode/* 7 | !.vscode/settings.json 8 | !.vscode/tasks.json 9 | !.vscode/launch.json 10 | !.vscode/extensions.json 11 | 12 | ### macOS ### 13 | # General 14 | .DS_Store 15 | .AppleDouble 16 | .LSOverride 17 | 18 | # Icon must end with two \r 19 | Icon 20 | 21 | # Thumbnails 22 | ._* 23 | 24 | # Files that might appear in the root of a volume 25 | .DocumentRevisions-V100 26 | .fseventsd 27 | .Spotlight-V100 28 | .TemporaryItems 29 | .Trashes 30 | .VolumeIcon.icns 31 | .com.apple.timemachine.donotpresent 32 | 33 | # Directories potentially created on remote AFP share 34 | .AppleDB 35 | .AppleDesktop 36 | Network Trash Folder 37 | Temporary Items 38 | .apdisk 39 | 40 | ### Node ### 41 | # Logs 42 | logs 43 | *.log 44 | npm-debug.log* 45 | yarn-debug.log* 46 | yarn-error.log* 47 | lerna-debug.log* 48 | 49 | # Diagnostic reports (https://nodejs.org/api/report.html) 50 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 51 | 52 | # Runtime data 53 | pids 54 | *.pid 55 | *.seed 56 | *.pid.lock 57 | 58 | # Directory for instrumented libs generated by jscoverage/JSCover 59 | lib-cov 60 | 61 | # Coverage directory used by tools like istanbul 62 | coverage 63 | *.lcov 64 | 65 | # nyc test coverage 66 | .nyc_output 67 | 68 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 69 | .grunt 70 | 71 | # Bower dependency directory (https://bower.io/) 72 | bower_components 73 | 74 | # node-waf configuration 75 | .lock-wscript 76 | 77 | # Compiled binary addons (https://nodejs.org/api/addons.html) 78 | build/Release 79 | 80 | # Dependency directories 81 | node_modules/ 82 | jspm_packages/ 83 | 84 | # TypeScript v1 declaration files 85 | typings/ 86 | 87 | # TypeScript cache 88 | *.tsbuildinfo 89 | 90 | # Optional npm cache directory 91 | .npm 92 | 93 | # Optional eslint cache 94 | .eslintcache 95 | 96 | # Optional REPL history 97 | .node_repl_history 98 | 99 | # Output of 'npm pack' 100 | *.tgz 101 | 102 | # Yarn Integrity file 103 | .yarn-integrity 104 | 105 | # dotenv environment variables file 106 | .env 107 | .env.test 108 | 109 | # parcel-bundler cache (https://parceljs.org/) 110 | .cache 111 | 112 | # next.js build output 113 | .next 114 | 115 | # nuxt.js build output 116 | .nuxt 117 | 118 | # react / gatsby 119 | public/ 120 | dist/ 121 | 122 | # vuepress build output 123 | .vuepress/dist 124 | 125 | # Serverless directories 126 | .serverless/ 127 | 128 | # FuseBox cache 129 | .fusebox/ 130 | 131 | # DynamoDB Local files 132 | .dynamodb/ 133 | 134 | ### react ### 135 | .DS_* 136 | **/*.backup.* 137 | **/*.back.* 138 | 139 | node_modules 140 | bower_componets 141 | 142 | *.sublime* 143 | 144 | psd 145 | thumb 146 | sketch 147 | 148 | # End of https://www.gitignore.io/api/node,code,react,macos 149 | 150 | builder/tmp/**/* 151 | db 152 | .devcontainer/ 153 | sites-public/ 154 | build-cache/ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true 3 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine3.11 2 | 3 | WORKDIR /home 4 | 5 | COPY . . 6 | 7 | RUN cd frontend && \ 8 | yarn install && \ 9 | yarn build && \ 10 | cd ../server && \ 11 | yarn install && \ 12 | yarn build 13 | 14 | ENV DOCKER=true 15 | ENV PORT=80 16 | 17 | EXPOSE 80 18 | VOLUME [ "/volumes/db", "/volumes/builds-out", "/var/run/docker.sock" ] 19 | 20 | ENTRYPOINT [ "node", "server/dist" ] 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Alexander Hörl 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | Logo 4 |
5 | JAMStackBox 6 |

7 | 8 | Your own self hosted continuous deployment solution for JAM Stack websites. 9 | 10 | It takes GitHub repositories containing GatsbyJS sites and builts them once an POST request to a specific URL has been called. 11 | 12 | The build happens inside a Docker container to assure that a stable enviroment is provided. Once the build is finished the static files are saved to a dedicated folder inside of `sites-public`. 13 | 14 | Feel free to contact me on Twitter [@alexanderhorl](https://twitter.com/alexanderhorl) or send me a mail (on my GitHub profile) if you like this project or would want to know more about it. 15 | 16 | ## ⚠️ Prerequisites 17 | 18 | - You need to have a running Docker instance on your machine. 19 | Currently only Docker on Linux or MacOS is supported. 20 | - Currently only sites based on [GatsbyJS](https://www.gatsbyjs.org) are supported. 21 | Feel free to contribute by editing the builder to support other static site generators. 22 | 23 | ## 🚀 Quick Start 24 | 25 | 1. **Download this repo** 26 | 27 | ```sh 28 | git clone https://github.com/AlexanderProd/jam-stack-box 29 | ``` 30 | 31 | 2. **Install packages and build server** 32 | 33 | Simply run the install script in the downloaded directory. 34 | 35 | ```sh 36 | $ bash install.sh 37 | ``` 38 | 39 | 3. **Create .env file from example** 40 | 41 | Use the `.env example` file to a create a file called `.env` in the server directory. This file contains all the necessary enviroment variables like the admin password. 42 | 43 | 4. **Start the server process** 44 | 45 | The server process is a NodeJS server listening to a specific port, default `3000`. 46 | You can change the port by providing a `PORT` enviroment variable. 47 | 48 | The server process can be started manually. 49 | 50 | ```sh 51 | $ node server/dist/index.js 52 | ``` 53 | 54 | Or using the [PM2 process manager](https://pm2.keymetrics.io) by running the following command in the downloaded directory. 55 | 56 | ```sh 57 | $ pm2 start 58 | ``` 59 | 60 | or 61 | 62 | ```sh 63 | $ pm2 start --env production 64 | ``` 65 | 66 | ## Usage 67 | 68 | Since this project is currently in development theres no frontend to control your sites yet. Though you can still use it simply by doing requests agains the rest server. 69 | 70 | When a new site gets added all parameters get saves to the DB and the sites gets a unique 6 digit alphanumeric string as ID. 71 | 72 | A new site gets created by posting a POST request against `/site` and a build gets triggered with a POST to `/build/[id]`. 73 | 74 | ## REST Endpoints 75 | 76 | The most important API endpoints are the following, checkout index.js in the server directory for the rest. 77 | The default development port is 3000. It can be changed with a either PORT enviroment variable or in the config file in the server directory. 78 | 79 | ### POST `/site` 80 | 81 | Creates a new site instance and saves it to the database, returns the id of the site. 82 | Expects content type `x-www-form-urlencoded`. 83 | 84 | | field | required | description | 85 | | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------- | 86 | | name | true | Name of the site, only used for front-end purposes. | 87 | | source | true | GitHub link to a repository with the site content.
( e.g. https://github.com/AlexanderProd/gatsby-shopify-starter ) | 88 | 89 | If you want to use a private repo as source you have to supply a GitHub OAuth token in the source URL, like this. `https://@github.com/owner/repo.git`. JamStackBox is using [this technique](https://docs.github.com/en/github/extending-github/git-automation-with-oauth-tokens) to clone private repos. 90 | You can read how to create a personal OAuth token [here](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token). 91 | 92 | ### POST `/build/[id or name]` 93 | 94 | Triggers a new build for the site with the ID. 95 | 96 | ### GET `/sites` 97 | 98 | Returns a JSON array with all sites in the database. 99 | 100 | ### GET `/sites/[id]` 101 | 102 | Returns all details of a specific site. 103 | 104 | ### DELETE `/site/[id]` 105 | 106 | Deletes the site with given ID. 107 | 108 | ### GET `/badge/[id or name]` 109 | 110 | Returns an svg image with the current state of a site, for example building or success. 111 | 112 | success badge 113 | 114 | ## 📌 ToDo 115 | 116 | - [x] Use dynamic NodeJS version in Builder using NVM. 117 | - [ ] Remote Deployment 118 | - [ ] Add frontend to control sites and builds. 119 | - [ ] Add support for other static site generators than Gatsby. 120 | - [ ] Implement a message broker. 121 | - [x] Deploy status badge. 122 | - [x] Split server and builder into dedicated docker containers. 123 | -------------------------------------------------------------------------------- /builder/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:20.04 2 | 3 | LABEL maintainer="@alexanderhorl" 4 | 5 | ENV LANGUAGE=en_US:en 6 | ENV LANG=en_US.UTF-8 7 | ENV LC_ALL=en_US.UTF-8 8 | 9 | RUN export DEBIAN_FRONTEND=noninteractive && \ 10 | apt-get -y update && \ 11 | apt-get install -y --no-install-recommends software-properties-common language-pack-en-base apt-transport-https && \ 12 | echo 'Acquire::Languages {"none";};' > /etc/apt/apt.conf.d/60language && \ 13 | echo 'LANG="en_US.UTF-8"' > /etc/default/locale && \ 14 | echo 'LANGUAGE="en_US:en"' >> /etc/default/locale && \ 15 | locale-gen en_US.UTF-8 && \ 16 | update-locale en_US.UTF-8 && \ 17 | add-apt-repository -y ppa:git-core/ppa && \ 18 | #add-apt-repository -y ppa:rwky/graphicsmagick && \ 19 | add-apt-repository -y ppa:deadsnakes/ppa && \ 20 | apt-get -y update && \ 21 | apt-get install -y --no-install-recommends \ 22 | advancecomp \ 23 | apt-utils \ 24 | autoconf \ 25 | automake \ 26 | bison \ 27 | build-essential \ 28 | bzr \ 29 | cmake \ 30 | curl \ 31 | doxygen \ 32 | elixir \ 33 | expect \ 34 | fontconfig \ 35 | fontconfig-config \ 36 | g++ \ 37 | gawk \ 38 | git \ 39 | git-lfs \ 40 | gifsicle \ 41 | gobject-introspection \ 42 | graphicsmagick \ 43 | graphviz \ 44 | gtk-doc-tools \ 45 | gnupg2 \ 46 | imagemagick \ 47 | jpegoptim \ 48 | jq \ 49 | libasound2 \ 50 | libcurl4 \ 51 | libenchant1c2a \ 52 | libexif-dev \ 53 | libffi-dev \ 54 | libfontconfig1 \ 55 | libgconf-2-4 \ 56 | libgd-dev \ 57 | libgdbm-dev \ 58 | libgif-dev \ 59 | libglib2.0-dev \ 60 | libgmp3-dev \ 61 | libgsl-dev \ 62 | libgtk-3-0 \ 63 | libgtk2.0-0 \ 64 | libicu-dev \ 65 | libimage-exiftool-perl \ 66 | libjpeg-progs \ 67 | libjpeg-turbo8-dev \ 68 | libmagickwand-dev \ 69 | libmcrypt-dev \ 70 | libncurses5-dev \ 71 | libnss3 \ 72 | libreadline6-dev \ 73 | librsvg2-bin \ 74 | libsm6 \ 75 | libsqlite3-dev \ 76 | libssl-dev \ 77 | libtiff5-dev \ 78 | libwebp-dev \ 79 | libxml2-dev \ 80 | libxrender1 \ 81 | libxslt-dev \ 82 | libxss1 \ 83 | libxtst6 \ 84 | libyaml-dev \ 85 | mercurial \ 86 | nasm \ 87 | optipng \ 88 | pngcrush \ 89 | rsync \ 90 | software-properties-common \ 91 | strace \ 92 | swig \ 93 | tree \ 94 | unzip \ 95 | xfonts-base \ 96 | xfonts-75dpi \ 97 | xvfb \ 98 | zip 99 | 100 | ARG user=jamstackbox 101 | ARG group=jamstackbox 102 | ARG uid=1000 103 | ARG gid=1000 104 | 105 | RUN groupadd -g ${gid} ${group} 106 | RUN useradd -u ${uid} -g ${group} -s /bin/bash -m ${user} 107 | 108 | USER ${uid}:${gid} 109 | 110 | RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash && \ 111 | export NVM_DIR="$HOME/.nvm" && \ 112 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \ 113 | [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" && \ 114 | nvm install --lts && \ 115 | npm install -g node-gyp 116 | 117 | WORKDIR /home/${user} 118 | 119 | COPY . . 120 | 121 | VOLUME [ "/sites-public", "/build-cache" ] 122 | 123 | CMD [ "./build.sh" ] -------------------------------------------------------------------------------- /builder/build-functions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | run_custom_command() { 4 | if $BUILD_COMMAND; then 5 | echo "Successfully build with custom command \"$BUILD_COMMAND\"." 6 | else 7 | echo "Custom build command \"$BUILD_COMMAND\" failed." 8 | exit 1 9 | fi 10 | } 11 | 12 | link_node_modules() { 13 | if ! mkdir -p /build-cache/$SITE_ID/node_modules; then 14 | echo "Creating node_modules cache failed!" 15 | exit 1 16 | fi 17 | 18 | if ! ln -s /build-cache/$SITE_ID/node_modules $(pwd)/node_modules; then 19 | echo "Linking node_modules cache failed!" 20 | exit 1 21 | fi 22 | } 23 | 24 | run_yarn() { 25 | if ! npm install -g yarn; then 26 | echo "Failed installing yarn!" 27 | exit 1 28 | fi 29 | 30 | if yarn install; then 31 | echo "Sucessfully installed packages with yarn." 32 | else 33 | echo "Installing packages with yarn $(yarn --version) failed." 34 | exit 1 35 | fi 36 | 37 | if [ "$BUILD_COMMAND" != "undefined" ]; then 38 | run_custom_command 39 | else 40 | if yarn build; then 41 | echo "Sucessfully build with yarn." 42 | else 43 | echo "Build with yarn failed." 44 | exit 1 45 | fi 46 | fi 47 | } 48 | 49 | run_npm() { 50 | if npm install; then 51 | echo "Sucessfully installed packages with npm." 52 | else 53 | echo "Installing packages with npm ($(npm --version)) failed." 54 | exit 1 55 | fi 56 | 57 | if [ "$BUILD_COMMAND" != "undefined" ]; then 58 | run_custom_command 59 | else 60 | if npm run build; then 61 | echo "Sucessfully build with npm." 62 | else 63 | echo "Build with npm failed." 64 | exit 1 65 | fi 66 | fi 67 | } 68 | 69 | switch_node_version() { 70 | if ! nvm install $NODE_VERSION; then 71 | echo "Switching to node version $NODE_VERSION failed!" 72 | echo "Using node version $(node -v)." 73 | fi 74 | } 75 | 76 | copy_build_cache() { 77 | if rsync -aru --delete $(pwd)/.cache /build-cache/$SITE_ID; then 78 | echo "Sucessfully copied .cache to /build-cache/$SITE_ID." 79 | else 80 | echo "Copying .cache to /build-cache/$SITE_ID failed!" 81 | fi 82 | 83 | if rsync -aru --delete $(pwd)/$BUILD_DIR /build-cache/$SITE_ID; then 84 | echo "Sucessfully copied $BUILD_DIR to /build-cache/$SITE_ID." 85 | else 86 | echo "Copying $BUILD_DIR to /build-cache/$SITE_ID failed!" 87 | fi 88 | } 89 | 90 | restore_build_cache() { 91 | if rsync -aru --delete /build-cache/$SITE_ID/.cache $(pwd); then 92 | echo "Sucessfully restored .cache from /build-cache/$SITE_ID." 93 | else 94 | echo "Restoring .cache from /build-cache/$SITE_ID failed!" 95 | fi 96 | 97 | if rsync -aru --delete /build-cache/$SITE_ID/$BUILD_DIR $(pwd); then 98 | echo "Sucessfully restored $BUILD_DIR from /build-cache/$SITE_ID." 99 | else 100 | echo "Restoring $BUILD_DIR from /build-cache/$SITE_ID failed!" 101 | fi 102 | } 103 | 104 | deploy_files() { 105 | if ! mkdir -p $DEPLOY_DIR; then 106 | echo "Creating $DEPLOY_DIR failed!" 107 | exit 1 108 | fi 109 | 110 | if rsync -aru --delete ./$BUILD_DIR/ $DEPLOY_DIR; then 111 | echo "Sucessfully deployed!" 112 | exit 0 113 | else 114 | echo "Deploy failed!" 115 | exit 1 116 | fi 117 | } -------------------------------------------------------------------------------- /builder/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | export LANG=en_US.UTF-8 4 | export LANGUAGE=en_US:en 5 | export LC_ALL=en_US.UTF-8 6 | export FORCE_COLOR=0 7 | export NO_COLOR=1 8 | 9 | . $HOME/.nvm/nvm.sh 10 | . ./build-functions.sh --source-only 11 | 12 | main() { 13 | if [ "$REPO_URL" == "undefined" ]; then 14 | echo "No repository URL provided." 15 | exit 0 16 | fi 17 | 18 | mkdir $SITE_ID 19 | cd $SITE_ID 20 | 21 | echo git clone $REPO_URL 22 | if git clone $REPO_URL .; then 23 | echo "Cloned $REPO_URL." 24 | else 25 | echo "Cloning $REPO_URL failed!" 26 | exit 1 27 | fi 28 | 29 | if [ "$USE_CACHE" == "true" ]; then 30 | echo "Using cache for $SITE_ID." 31 | link_node_modules 32 | restore_build_cache 33 | fi 34 | 35 | if [ "$NODE_VERSION" != "undefined" ]; then 36 | switch_node_version 37 | fi 38 | 39 | if [ -f "yarn.lock" ]; then 40 | run_yarn 41 | else 42 | run_npm 43 | fi 44 | 45 | copy_build_cache 46 | deploy_files 47 | } 48 | 49 | main "$@" 50 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.7" 2 | services: 3 | server: 4 | build: . 5 | restart: unless-stopped 6 | ports: 7 | - "3000:80" 8 | volumes: 9 | - "/var/run/docker.sock:/var/run/docker.sock" 10 | - "./db:/home/db" 11 | - "./builds-out:/home/builds-out" 12 | - "./sites-public:/home/sites-public" 13 | 14 | mongo: 15 | image: mongo 16 | volumes: 17 | - "./mongodb:/data/db" 18 | -------------------------------------------------------------------------------- /ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [ 3 | { 4 | name: "JAMStackBox", 5 | script: "server/dist/index.js", 6 | 7 | // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/ 8 | instances: 1, 9 | autorestart: true, 10 | watch: false, 11 | max_memory_restart: "1G", 12 | log_date_format: "HH:mm:ss DD-MM-YY", 13 | }, 14 | ], 15 | }; 16 | -------------------------------------------------------------------------------- /frontend/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["env", "react"] 3 | } 4 | -------------------------------------------------------------------------------- /frontend/assets/building-status.svg: -------------------------------------------------------------------------------- 1 | 3 | 10 | 11 | 12 | 13 | 14 | 17 | 19 | 21 | 23 | 26 | 28 | 30 | 36 | 37 | 38 | 40 | 43 | 46 | 49 | 51 | 54 | 56 | 58 | 61 | 63 | 65 | 66 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /frontend/assets/error-status.svg: -------------------------------------------------------------------------------- 1 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 19 | 21 | 23 | 24 | 25 | 27 | 30 | 33 | 36 | 38 | 41 | 43 | 45 | 48 | 50 | 52 | 53 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /frontend/assets/failed-status.svg: -------------------------------------------------------------------------------- 1 | 3 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 20 | 22 | 25 | 28 | 29 | 30 | 32 | 35 | 38 | 41 | 43 | 46 | 48 | 50 | 53 | 55 | 57 | 58 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /frontend/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderProd/jam-stack-box/28bd4744dd5fb09414f83c55e09263010c3a9e05/frontend/assets/logo.png -------------------------------------------------------------------------------- /frontend/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 18 | 19 | 20 | 27 | 53 | 59 | 63 | 69 | 77 | 83 | 89 | 95 | 101 | 105 | 109 | 113 | 116 | 118 | 120 | 122 | 126 | 129 | 131 | 132 | 133 | -------------------------------------------------------------------------------- /frontend/assets/success-status.svg: -------------------------------------------------------------------------------- 1 | 3 | 10 | 11 | 12 | 13 | 14 | 17 | 19 | 21 | 23 | 26 | 29 | 32 | 33 | 34 | 36 | 39 | 42 | 45 | 47 | 50 | 52 | 54 | 57 | 59 | 61 | 62 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "dev": "parcel src/index.html", 8 | "build": "rm -rf dist .cache && parcel build src/index.html --public-url ./" 9 | }, 10 | "dependencies": { 11 | "@emotion/core": "^10.0.22", 12 | "@emotion/styled": "^10.0.23", 13 | "react": "^16.12.0", 14 | "react-dom": "^16.12.0" 15 | }, 16 | "devDependencies": { 17 | "@types/react": "^16.9.19", 18 | "@types/react-dom": "^16.9.5", 19 | "babel-core": "^6.26.3", 20 | "babel-preset-env": "^1.7.0", 21 | "babel-preset-react": "^6.24.1", 22 | "parcel-bundler": "^1.12.4", 23 | "typescript": "^3.7.5" 24 | }, 25 | "prettier": { 26 | "trailingComma": "es5", 27 | "tabWidth": 2, 28 | "semi": false, 29 | "singleQuote": true, 30 | "arrowParens": "avoid" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /frontend/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | React Parcel Demo 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /frontend/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styled from '@emotion/styled' 3 | import { render } from 'react-dom' 4 | 5 | const Hello = styled.h1` 6 | color: blue; 7 | ` 8 | 9 | const App = () => { 10 | return ( 11 |
12 | Hello Parcel 13 |
14 | ) 15 | } 16 | 17 | render(, document.getElementById('app')) 18 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "es2015", 5 | "jsx": "react", 6 | "moduleResolution": "node", 7 | "allowSyntheticDefaultImports": true, 8 | "lib": ["dom", "es5", "es6"] 9 | }, 10 | "include": ["src/**/*"] 11 | } 12 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | cd frontend 2 | yarn install 3 | yarn build 4 | 5 | cd ../server 6 | yarn install 7 | yarn build -------------------------------------------------------------------------------- /server/.env example: -------------------------------------------------------------------------------- 1 | PORT=3000 2 | SECRET=yHSHGuYkD4YMryOU1mJUId4zUihMNg 3 | PASSWORD=admin 4 | NODE_ENV=development -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "main": "src/index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "start": "yarn build && DOCKER=false node dist/index.js", 8 | "build": "rm -rf dist; tsc", 9 | "dev": "DOCKER=false ts-node-dev --respawn ./src/index.ts" 10 | }, 11 | "dependencies": { 12 | "@types/dockerode": "^2.5.21", 13 | "@types/express": "4.17.8", 14 | "@types/jsonwebtoken": "^8.3.8", 15 | "body-parser": "^1.20.2", 16 | "dockerode": "^3.1.0", 17 | "dotenv": "^8.2.0", 18 | "express": "^4.19.2", 19 | "jsonwebtoken": "^8.5.1", 20 | "mariadb": "^3.3.1", 21 | "reflect-metadata": "^0.1.13", 22 | "sequelize": "^6.37.3", 23 | "sequelize-typescript": "^2.1.6", 24 | "sqlite3": "^5.1.7" 25 | }, 26 | "devDependencies": { 27 | "@types/validator": "^13.12.0", 28 | "prettier": "^3.3.3", 29 | "ts-node": "^10.9.2", 30 | "ts-node-dev": "^2.0.0", 31 | "typescript": "^5.5.4" 32 | }, 33 | "prettier": { 34 | "trailingComma": "es5", 35 | "tabWidth": 2, 36 | "semi": true, 37 | "singleQuote": true, 38 | "arrowParens": "avoid" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /server/src/BuildProcesses/index.ts: -------------------------------------------------------------------------------- 1 | import { BuildProcess } from '../types'; 2 | 3 | const BuildProcesses = (() => { 4 | let processes: BuildProcess = {}; 5 | 6 | const get = (): BuildProcess => { 7 | return processes; 8 | }; 9 | 10 | const set = (process: BuildProcess) => { 11 | processes = { 12 | ...processes, 13 | ...process, 14 | }; 15 | }; 16 | 17 | const del = (id: string) => { 18 | delete processes[id]; 19 | }; 20 | 21 | return { get, set, del }; 22 | })(); 23 | 24 | export default BuildProcesses; 25 | -------------------------------------------------------------------------------- /server/src/build/index.ts: -------------------------------------------------------------------------------- 1 | import { exec } from 'child_process'; 2 | import { join } from 'path'; 3 | 4 | import BuildProcesses from '../BuildProcesses'; 5 | import { createBuilderContainer } from '../docker'; 6 | import { BuildEnvVars } from '../types'; 7 | import { saveBuildLog } from '../util'; 8 | import { Site, Event } from '../sql'; 9 | import { docker } from '..'; 10 | 11 | const startBuild = async (site: Site) => { 12 | const { id, envVariables } = site; 13 | 14 | const buildEnvVars: BuildEnvVars = { 15 | SITE_ID: site.id ? site.id : 'undefined', 16 | REPO_URL: site.source ? site.source : 'undefined', 17 | BUILD_COMMAND: site.buildCommand ? site.buildCommand : 'undefined', 18 | NODE_VERSION: site.nodeVersion ? site.nodeVersion : 'undefined', 19 | BUILD_DIR: site.buildDir ? site.buildDir : 'public', 20 | DEPLOY_DIR: join('/sites-public/', site.name), 21 | GITHUB_ACCESS_TOKEN: site.githubAccessToken 22 | ? site.githubAccessToken 23 | : 'undefined', 24 | USE_CACHE: true, 25 | ...envVariables, 26 | }; 27 | 28 | let event: Event; 29 | 30 | /** 31 | * Check if theres already one build process for this site running. 32 | * If the active build process is in prepare stage return 33 | * otherwise stop running build and start a new one. 34 | */ 35 | if (BuildProcesses.get()[id] !== undefined) { 36 | const runningBuild = BuildProcesses.get()[id]; 37 | 38 | if (runningBuild.status === 'preparing') { 39 | return; 40 | } 41 | 42 | BuildProcesses.set({ 43 | [id]: { ...runningBuild, status: 'preparing' }, 44 | }); 45 | event = await site.$create('event', { 46 | siteId: site.id, 47 | status: 'preparing', 48 | }); 49 | 50 | try { 51 | const container = docker.getContainer(runningBuild.container.id); 52 | await container.stop(); 53 | await runningBuild.event.update({ status: 'stopped' }); 54 | BuildProcesses.del(id); 55 | } catch (error) { 56 | console.error(error); 57 | } 58 | } else { 59 | event = await site.$create('event', { 60 | siteId: site.id, 61 | status: 'preparing', 62 | }); 63 | } 64 | 65 | try { 66 | const container = await createBuilderContainer( 67 | buildEnvVars, 68 | site.containerHostConfig, 69 | site.containerCreationOptions 70 | ); 71 | const stream = await container.attach({ 72 | stream: true, 73 | stdout: true, 74 | stderr: true, 75 | tty: false, 76 | }); 77 | 78 | BuildProcesses.set({ [id]: { status: 'building', container, event } }); 79 | await event.update({ status: 'building' }); 80 | 81 | saveBuildLog(event, stream); 82 | 83 | stream.on('end', async () => { 84 | BuildProcesses.del(id); 85 | const { 86 | State: { ExitCode }, 87 | } = await container.inspect(); 88 | 89 | if (ExitCode === 0) { 90 | event.update({ 91 | status: 'success', 92 | }); 93 | 94 | if (site.postBuildCommand) { 95 | exec(site.postBuildCommand); 96 | } 97 | 98 | container.remove(); 99 | } else { 100 | if (event.status !== 'stopped') 101 | event.update({ 102 | status: 'failed', 103 | }); 104 | 105 | container.remove(); 106 | } 107 | }); 108 | stream.on('error', code => { 109 | const errorMessage = `Container returned error code ${code}`; 110 | 111 | console.log(errorMessage); 112 | BuildProcesses.del(id); 113 | event.update({ status: 'failed', description: errorMessage }); 114 | 115 | container.remove(); 116 | }); 117 | 118 | container.start(); 119 | } catch (error) { 120 | console.error(error); 121 | } 122 | }; 123 | 124 | export default startBuild; 125 | -------------------------------------------------------------------------------- /server/src/config.ts: -------------------------------------------------------------------------------- 1 | import { join } from 'path'; 2 | 3 | const constants = { 4 | PORT: process.env.PORT ? process.env.PORT : 3000, 5 | FRONTEND_DIR: join(__dirname, '/../../frontend/dist/'), 6 | BUILDER_PATH: join(__dirname, '/../../builder/'), 7 | SITES_DIR: join(__dirname, '/../../sites-public/'), 8 | BUILD_CACHE_DIR: join(__dirname, '/../../build-cache/'), 9 | BUILDER_IMAGE_TAG: 'jamstackbox_builder', 10 | DB_DIALECT: process.env.DB_DIALECT ? process.env.DB_DIALECT : 'sqlite', 11 | DB_DIR: join(__dirname, '/../../db/'), 12 | DB_HOST: process.env.DB_HOST ? process.env.DB_HOST : undefined, 13 | DB_NAME: process.env.DB_NAME ? process.env.DB_NAME : 'main.db', 14 | DB_PORT: process.env.DB_PORT ? process.env.DB_PORT : 3306, 15 | DB_USER: process.env.DB_USER ? process.env.DB_USER : undefined, 16 | DB_PASSWORD: process.env.DB_PASSWORD ? process.env.DB_PASSWORD : undefined, 17 | MIGRATE_DB: process.env.MIGRATE_DB ? process.env.MIGRATE_DB : 'false', 18 | }; 19 | 20 | export default constants; 21 | -------------------------------------------------------------------------------- /server/src/docker/buildImage.ts: -------------------------------------------------------------------------------- 1 | import { docker } from '..'; 2 | import constants from '../config'; 3 | 4 | const buildImage = (): Promise => { 5 | return new Promise(async (resolve, reject) => { 6 | try { 7 | const stream = await docker.buildImage( 8 | { 9 | context: constants.BUILDER_PATH, 10 | src: ['Dockerfile', 'build.sh', 'build-functions.sh'], 11 | }, 12 | { 13 | t: constants.BUILDER_IMAGE_TAG, 14 | } 15 | ); 16 | 17 | stream.setEncoding('utf8'); 18 | stream.on('data', data => { 19 | try { 20 | console.log(JSON.parse(data.toString()).stream); 21 | } catch (error) { 22 | return; 23 | } 24 | }); 25 | 26 | stream.on('end', () => { 27 | resolve(); 28 | }); 29 | } catch (error) { 30 | reject(error); 31 | } 32 | }); 33 | }; 34 | 35 | export default buildImage; 36 | -------------------------------------------------------------------------------- /server/src/docker/checkBuilderImage.ts: -------------------------------------------------------------------------------- 1 | import { docker } from '..'; 2 | 3 | import constants from '../config'; 4 | 5 | const checkBuilderImage = (): Promise => { 6 | return new Promise(async (resolve, reject) => { 7 | try { 8 | const dockerImages = await docker.listImages(); 9 | dockerImages.forEach(image => { 10 | if (image.RepoTags[0].includes(constants.BUILDER_IMAGE_TAG)) { 11 | resolve(true); 12 | } 13 | resolve(false); 14 | }); 15 | resolve(false); 16 | } catch (error) { 17 | reject(error); 18 | } 19 | }); 20 | }; 21 | 22 | export default checkBuilderImage; 23 | -------------------------------------------------------------------------------- /server/src/docker/createBuilderContainer.ts: -------------------------------------------------------------------------------- 1 | import { Container, HostConfig, ContainerCreateOptions } from 'dockerode'; 2 | 3 | import { docker } from '..'; 4 | import constants from '../config'; 5 | import { BuildEnvVars } from '../types'; 6 | 7 | const createBuilderContainer = ( 8 | env: BuildEnvVars, 9 | hostConfig?: HostConfig, 10 | containerCreationOptions?: ContainerCreateOptions 11 | ): Promise => { 12 | const envStrings: Array = []; 13 | 14 | for (const [key, value] of Object.entries(env)) { 15 | envStrings.push(`${key}=${value}`); 16 | } 17 | 18 | return new Promise(async (resolve, reject) => { 19 | try { 20 | const container = await docker.createContainer({ 21 | Image: constants.BUILDER_IMAGE_TAG, 22 | Env: envStrings, 23 | Volumes: { 24 | '/sites-public': {}, 25 | '/build-cache': {}, 26 | }, 27 | HostConfig: { 28 | ...hostConfig, 29 | Binds: [ 30 | `${constants.SITES_DIR}:/sites-public`, 31 | `${constants.BUILD_CACHE_DIR}:/build-cache`, 32 | ], 33 | AutoRemove: false, 34 | }, 35 | ...containerCreationOptions, 36 | }); 37 | 38 | resolve(container); 39 | } catch (error) { 40 | console.error(error); 41 | reject(error); 42 | } 43 | }); 44 | }; 45 | 46 | export default createBuilderContainer; 47 | -------------------------------------------------------------------------------- /server/src/docker/helpers.ts: -------------------------------------------------------------------------------- 1 | import { exec } from 'child_process'; 2 | 3 | import { docker } from '../'; 4 | 5 | /** 6 | * Returns own Docker container ID. 7 | */ 8 | export const getSelfCID = (): Promise => { 9 | return new Promise((resolve, reject) => { 10 | exec('cat /etc/hostname', (error, stdout) => { 11 | if (error) { 12 | reject(error); 13 | } 14 | resolve(stdout); 15 | }); 16 | }); 17 | }; 18 | 19 | /** 20 | * Returns the path on the host machine for a given volume directory. 21 | * @param destination The path to the mounted volume inside the container: e.g. /db 22 | */ 23 | export const getHostMountPath = (): Promise => { 24 | return new Promise(async (resolve, reject) => { 25 | try { 26 | const thisContainer = docker.getContainer(await getSelfCID()); 27 | 28 | resolve(thisContainer.id); 29 | /* const { Mounts } = await thisContainer.inspect(); 30 | 31 | Mounts.forEach(({ Destination, Source }) => { 32 | if (Destination === destination) { 33 | resolve(Source); 34 | } 35 | }); 36 | reject(new Error(`No volume with destination ${destination} found`)); */ 37 | } catch (error) { 38 | reject(error); 39 | } 40 | }); 41 | }; 42 | -------------------------------------------------------------------------------- /server/src/docker/index.ts: -------------------------------------------------------------------------------- 1 | import checkBuilderImage from './checkBuilderImage'; 2 | import buildImage from './buildImage'; 3 | import createBuilderContainer from './createBuilderContainer'; 4 | 5 | export * from './helpers'; 6 | export { checkBuilderImage, buildImage, createBuilderContainer }; 7 | -------------------------------------------------------------------------------- /server/src/env.ts: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | import { join } from 'path'; 3 | 4 | const envResult = dotenv.config({ path: join(__dirname, '/../', '.env') }); 5 | if (envResult.error) throw envResult.error; 6 | -------------------------------------------------------------------------------- /server/src/index.ts: -------------------------------------------------------------------------------- 1 | import 'dotenv/config'; 2 | import express from 'express'; 3 | import bodyParser from 'body-parser'; 4 | import Docker from 'dockerode'; 5 | import { existsSync, mkdirSync } from 'fs'; 6 | 7 | import createSite from './routes/createSite'; 8 | import getSite from './routes/getSite'; 9 | import delSite from './routes/delSite'; 10 | import build from './routes/build'; 11 | import builds from './routes/builds'; 12 | import events from './routes/events'; 13 | import authenticate from './routes/authenticate'; 14 | import badge from './routes/badge'; 15 | import constants from './config'; 16 | import { checkBuilderImage, buildImage } from './docker'; 17 | import { withAuth } from './middlewares'; 18 | import { stopRunningBuilds } from './util'; 19 | 20 | const { PORT, FRONTEND_DIR, DB_DIR, SITES_DIR } = constants; 21 | 22 | const app = express(); 23 | export const docker = new Docker({ 24 | socketPath: process.env.DOCKER_HOST ?? '/var/run/docker.sock', 25 | }); 26 | 27 | const main = async () => { 28 | try { 29 | const isAvailable = await checkBuilderImage(); 30 | 31 | if (!isAvailable) { 32 | await buildImage(); 33 | } 34 | 35 | if (!existsSync(DB_DIR)) { 36 | mkdirSync(DB_DIR); 37 | } 38 | 39 | if (!existsSync(SITES_DIR)) { 40 | mkdirSync(SITES_DIR); 41 | } 42 | 43 | if (!existsSync(constants.BUILD_CACHE_DIR)) { 44 | mkdirSync(constants.BUILD_CACHE_DIR); 45 | } 46 | } catch (error) { 47 | console.error(error); 48 | process.exit(1); 49 | } 50 | 51 | app.use(bodyParser.urlencoded({ extended: false })); 52 | app.use('/', express.static(FRONTEND_DIR)); 53 | 54 | app.post('/site', withAuth, createSite); 55 | app.get('/sites/:id', getSite); 56 | app.get('/sites', getSite); 57 | app.delete('/site/:id', withAuth, delSite); 58 | app.post('/build/:id', build); 59 | app.get('/builds', builds); 60 | app.get('/events', events); 61 | app.post('/authenticate', authenticate); 62 | app.get('/badge/:id', badge); 63 | 64 | app.listen(PORT, () => 65 | console.log(`App listening on port ${PORT} in ${process.env.NODE_ENV}!`) 66 | ); 67 | 68 | // make sure build processes stop gracefully once node app stops. 69 | process.on('exit', code => { 70 | stopRunningBuilds(code); 71 | process.exit(code); 72 | }); 73 | }; 74 | 75 | main(); 76 | -------------------------------------------------------------------------------- /server/src/middlewares/index.ts: -------------------------------------------------------------------------------- 1 | import withAuth from './withAuth'; 2 | 3 | export { withAuth }; 4 | -------------------------------------------------------------------------------- /server/src/middlewares/withAuth.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response, NextFunction } from 'express'; 2 | import jwt from 'jsonwebtoken'; 3 | 4 | import { isProd } from '../util'; 5 | 6 | const withAuth = (req: Request, res: Response, next: NextFunction) => { 7 | const token = 8 | req.body?.token || 9 | req.query?.token || 10 | req.cookies?.token || 11 | req.headers['x-access-token']; 12 | 13 | /** 14 | * Auth checking is disabled in development mode. 15 | */ 16 | if (!isProd) { 17 | return next(); 18 | } 19 | 20 | if (token) { 21 | jwt.verify(token, process.env.SECRET, (err: Error) => { 22 | if (err) { 23 | res.status(401).json({ error: 'Unauthorized: Invalid token' }); 24 | } else { 25 | return next(); 26 | } 27 | }); 28 | } else { 29 | res.status(401).json({ error: 'Unauthorized: No token provided' }); 30 | } 31 | }; 32 | 33 | export default withAuth; 34 | -------------------------------------------------------------------------------- /server/src/routes/authenticate.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | import jwt from 'jsonwebtoken'; 3 | 4 | const authenticate = (req: Request, res: Response) => { 5 | const { password } = req.body; 6 | const payload = { loggedIn: true }; 7 | 8 | if (password === process.env.PASSWORD) { 9 | const token = jwt.sign(payload, process.env.SECRET, { 10 | expiresIn: '1h', 11 | }); 12 | res.cookie('token', token, { httpOnly: false }).sendStatus(200); 13 | } else { 14 | res.status(401).json({ error: 'Unauthorized: Incorrect password!' }); 15 | } 16 | }; 17 | 18 | export default authenticate; 19 | -------------------------------------------------------------------------------- /server/src/routes/badge.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | import { promisify } from 'util'; 3 | import { Op } from 'sequelize'; 4 | import { readFile } from 'fs'; 5 | import { join } from 'path'; 6 | 7 | import constants from '../config'; 8 | import { Site } from '../sql'; 9 | 10 | const assetsFolder = join(constants.FRONTEND_DIR, '/../', 'assets'); 11 | const readFilePromise = promisify(readFile); 12 | 13 | const badge = async (req: Request, res: Response) => { 14 | const { id } = req.params; 15 | 16 | const header = { 17 | 'Cache-Control': 'private', 18 | 'Content-Type': 'image/svg+xml', 19 | }; 20 | 21 | const condition = { 22 | [Op.or]: [{ id: { [Op.eq]: id } }, { name: { [Op.eq]: id } }], 23 | }; 24 | 25 | try { 26 | const site = await Site.findOne({ where: condition }); 27 | const lastEvent = await site.$get('events', { 28 | limit: 1, 29 | attributes: ['status'], 30 | order: [['updatedAt', 'DESC']], 31 | }); 32 | 33 | switch (lastEvent[0].status) { 34 | case 'success': { 35 | const succesBadge = String( 36 | await readFilePromise(join(assetsFolder, 'success-status.svg')) 37 | ); 38 | return res 39 | .header(header) 40 | .send(succesBadge) 41 | .status(200); 42 | } 43 | 44 | case 'failed': 45 | const failedBadge = String( 46 | await readFilePromise(join(assetsFolder, 'failed-status.svg')) 47 | ); 48 | return res 49 | .header(header) 50 | .send(failedBadge) 51 | .status(200); 52 | 53 | case 'preparing': { 54 | const buildingBade = String( 55 | await readFilePromise(join(assetsFolder, 'building-status.svg')) 56 | ); 57 | return res 58 | .header(header) 59 | .send(buildingBade) 60 | .status(200); 61 | } 62 | 63 | case 'building': { 64 | const buildingBade = String( 65 | await readFilePromise(join(assetsFolder, 'building-status.svg')) 66 | ); 67 | return res 68 | .header(header) 69 | .send(buildingBade) 70 | .status(200); 71 | } 72 | 73 | default: { 74 | const succesBadge = String( 75 | await readFilePromise(join(assetsFolder, 'success-status.svg')) 76 | ); 77 | return res 78 | .header(header) 79 | .send(succesBadge) 80 | .status(200); 81 | } 82 | } 83 | } catch (error) { 84 | const errorBadge = String( 85 | await readFilePromise(join(assetsFolder, 'error-status.svg')) 86 | ); 87 | return res 88 | .header(header) 89 | .send(errorBadge) 90 | .status(200); 91 | } 92 | }; 93 | 94 | export default badge; 95 | -------------------------------------------------------------------------------- /server/src/routes/build.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | import { Op } from 'sequelize'; 3 | 4 | import startBuild from '../build'; 5 | import { Site } from '../sql'; 6 | 7 | const build = async (req: Request, res: Response) => { 8 | const { id } = req.params; 9 | let site: Site; 10 | 11 | if (!id) { 12 | return res.status(404).json({ error: 'No siteID provided!' }); 13 | } 14 | 15 | const condition = { 16 | [Op.or]: [{ id: { [Op.eq]: id } }, { name: { [Op.eq]: id } }], 17 | }; 18 | 19 | try { 20 | site = await Site.findOne({ where: condition }); 21 | } catch (error) { 22 | return res.status(500).json({ error }); 23 | } 24 | 25 | if (!site) { 26 | return res.status(404).json({ error: 'Site not found!' }); 27 | } 28 | res.sendStatus(200); 29 | 30 | startBuild(site); 31 | }; 32 | 33 | export default build; 34 | -------------------------------------------------------------------------------- /server/src/routes/builds.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | 3 | import BuildProcesses from '../BuildProcesses'; 4 | 5 | const builds = (req: Request, res: Response) => { 6 | res.json(BuildProcesses.get()); 7 | }; 8 | 9 | export default builds; 10 | -------------------------------------------------------------------------------- /server/src/routes/createSite.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | 3 | import { Site } from '../sql'; 4 | import { sanitizeName, sanitizeBuildDir } from '../util'; 5 | 6 | const createSite = async (req: Request, res: Response) => { 7 | const data: Site = { 8 | ...req.body, 9 | name: sanitizeName(req.body.name), 10 | buildDir: req.body.buildDir 11 | ? sanitizeBuildDir(req.body.buildDir) 12 | : 'public', 13 | displayName: req.body.name, 14 | }; 15 | 16 | /** 17 | * Check if site name has been used already. 18 | */ 19 | try { 20 | const result = await Site.findOne({ 21 | where: { name: data.name }, 22 | rejectOnEmpty: false, 23 | }); 24 | if (result) { 25 | return res.status(500).json({ error: 'Site name already used!' }); 26 | } 27 | } catch (error) { 28 | return res.status(500).json({ error: String(error) }); 29 | } 30 | 31 | try { 32 | const newSite = await Site.create(data); 33 | res 34 | .status(200) 35 | .json({ siteCreated: { id: newSite.id, name: newSite.name } }); 36 | } catch (error) { 37 | return res.status(500).json({ error: String(error) }); 38 | } 39 | }; 40 | 41 | export default createSite; 42 | -------------------------------------------------------------------------------- /server/src/routes/delSite.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | 3 | import BuildProcesses from '../BuildProcesses'; 4 | import { Site } from '../sql'; 5 | 6 | const delSite = async (req: Request, res: Response) => { 7 | const { id } = req.params; 8 | 9 | if (!id) { 10 | return res.status(404).json({ error: 'No siteID provided!' }); 11 | } 12 | 13 | if (BuildProcesses.get()[id] !== undefined) { 14 | return res.json({ 15 | error: 'There is an active build process with this site.', 16 | }); 17 | } 18 | 19 | try { 20 | const site = await Site.findByPk(id); 21 | await site.destroy(); 22 | } catch (error) { 23 | return res.status(500).json({ error }); 24 | } 25 | 26 | res.sendStatus(200); 27 | }; 28 | 29 | export default delSite; 30 | -------------------------------------------------------------------------------- /server/src/routes/events.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | 3 | import { Event, Site } from '../sql'; 4 | 5 | const events = async (req: Request, res: Response) => { 6 | const { limit, skip, siteId } = req.query; 7 | let data: { 8 | count: number; 9 | rows: Event[]; 10 | }; 11 | 12 | let limitNumber = limit ? Number(limit) : undefined; 13 | let skipNumber = skip ? Number(skip) : undefined; 14 | 15 | try { 16 | data = await Event.findAndCountAll({ 17 | limit: limitNumber, 18 | offset: skipNumber, 19 | attributes: [ 20 | 'id', 21 | 'name', 22 | 'status', 23 | 'description', 24 | 'createdAt', 25 | 'updatedAt', 26 | 'siteId', 27 | ], 28 | order: [['createdAt', 'DESC']], 29 | //@ts-ignore 30 | include: [{ model: Site, attributes: ['name'] }], 31 | where: siteId ? { siteId: String(siteId) } : {}, 32 | }); 33 | 34 | if (!data) { 35 | return res.status(404).json({ error: 'No events found!' }); 36 | } 37 | res.status(200).json(data); 38 | } catch (error) { 39 | return res.status(500).json({ error: error }); 40 | } 41 | }; 42 | 43 | export default events; 44 | -------------------------------------------------------------------------------- /server/src/routes/getSite.ts: -------------------------------------------------------------------------------- 1 | import { Request, Response } from 'express'; 2 | 3 | import { Site } from '../sql'; 4 | 5 | const getSite = async (req: Request, res: Response) => { 6 | const { id } = req.params; 7 | let data: Site | Site[]; 8 | 9 | try { 10 | if (id) { 11 | data = await Site.findByPk(id); 12 | } else { 13 | data = await Site.findAll(); 14 | } 15 | 16 | if (!data) { 17 | return res.status(404).json({ error: 'Site not found!' }); 18 | } 19 | res.status(200).json(data); 20 | } catch (error) { 21 | return res.status(500).json({ error }); 22 | } 23 | }; 24 | 25 | export default getSite; 26 | -------------------------------------------------------------------------------- /server/src/sql/Event.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Table, 3 | Model, 4 | Column, 5 | DataType, 6 | ForeignKey, 7 | BelongsTo, 8 | } from 'sequelize-typescript'; 9 | import { Optional } from 'sequelize'; 10 | import Site from './Site'; 11 | 12 | export type EventStatus = 13 | | 'preparing' 14 | | 'building' 15 | | 'failed' 16 | | 'success' 17 | | 'stopped'; 18 | 19 | interface EventAttributes { 20 | id: number; 21 | name: string | null; 22 | status: EventStatus; 23 | description: string | null; 24 | log: string | null; 25 | siteId: string; 26 | } 27 | 28 | interface EventCreationAttributes 29 | extends Optional {} 30 | 31 | @Table({ tableName: 'events' }) 32 | class Event extends Model { 33 | @Column({ 34 | primaryKey: true, 35 | autoIncrement: true, 36 | allowNull: false, 37 | }) 38 | id: number; 39 | 40 | @Column({ allowNull: true }) 41 | name: string | null; 42 | 43 | @Column({ type: DataType.STRING, allowNull: false }) 44 | status: EventStatus; 45 | 46 | @Column({ type: DataType.TEXT, allowNull: true }) 47 | description: string | null; 48 | 49 | @Column({ type: DataType.TEXT, allowNull: true }) 50 | log: string | null; 51 | 52 | @ForeignKey(() => Site) 53 | @Column({ allowNull: false }) 54 | siteId: string; 55 | 56 | @BelongsTo(() => Site, { foreignKey: 'siteId' }) 57 | site: Site; 58 | } 59 | 60 | export default Event; 61 | -------------------------------------------------------------------------------- /server/src/sql/Site.ts: -------------------------------------------------------------------------------- 1 | import { Table, Model, Column, HasMany, DataType } from 'sequelize-typescript'; 2 | import { HostConfig, ContainerCreateOptions } from 'dockerode'; 3 | import { Optional } from 'sequelize'; 4 | 5 | import { createSiteID } from '../util'; 6 | import Event from './Event'; 7 | 8 | interface SiteAttributes { 9 | id: string; 10 | name: string; 11 | displayName: string | null; 12 | source: string; 13 | buildCommand: string | null; 14 | nodeVersion: string | null; 15 | buildDir: string | null; 16 | githubAccessToken: string | null; 17 | siteURL: string | null; 18 | postBuildCommand: string | null; 19 | hostConfig: HostConfig | null; 20 | envVariables: { [key: string]: string }; 21 | } 22 | 23 | interface SiteCreationAttributes 24 | extends Optional< 25 | SiteAttributes, 26 | | 'id' 27 | | 'displayName' 28 | | 'buildCommand' 29 | | 'buildDir' 30 | | 'githubAccessToken' 31 | | 'siteURL' 32 | | 'postBuildCommand' 33 | | 'hostConfig' 34 | > {} 35 | 36 | @Table({ tableName: 'sites' }) 37 | class Site extends Model { 38 | @Column({ 39 | defaultValue: () => createSiteID(), 40 | primaryKey: true, 41 | }) 42 | id: string; 43 | 44 | @Column({ 45 | unique: true, 46 | allowNull: false, 47 | }) 48 | name: string; 49 | 50 | @Column({ allowNull: true }) 51 | displayName: string; 52 | 53 | @Column({ allowNull: true }) 54 | source: string; 55 | 56 | @Column({ allowNull: true }) 57 | buildCommand!: string; 58 | 59 | @Column({ allowNull: true }) 60 | nodeVersion!: string; 61 | 62 | @Column({ allowNull: true }) 63 | buildDir: string; 64 | 65 | @Column({ allowNull: true }) 66 | githubAccessToken: string; 67 | 68 | @Column({ allowNull: true }) 69 | siteURL: string; 70 | 71 | @Column({ allowNull: true }) 72 | postBuildCommand: string; 73 | 74 | @Column({ type: DataType.JSON, allowNull: true }) 75 | containerHostConfig: HostConfig; 76 | 77 | @Column({ type: DataType.JSON, allowNull: true }) 78 | containerCreationOptions: ContainerCreateOptions; 79 | 80 | @Column({ type: DataType.JSON, allowNull: true }) 81 | envVariables: { [key: string]: string }; 82 | 83 | @HasMany(() => Event) 84 | events: Event[]; 85 | } 86 | 87 | export default Site; 88 | -------------------------------------------------------------------------------- /server/src/sql/index.ts: -------------------------------------------------------------------------------- 1 | import { Sequelize } from 'sequelize-typescript'; 2 | import { Dialect } from 'sequelize'; 3 | import { join } from 'path'; 4 | 5 | import constants from '../config'; 6 | import Event from './Event'; 7 | import Site from './Site'; 8 | 9 | const sequelize = new Sequelize({ 10 | dialect: constants.DB_DIALECT as Dialect, 11 | host: constants.DB_HOST, 12 | username: constants.DB_USER, 13 | password: constants.DB_PASSWORD, 14 | database: constants.DB_NAME, 15 | storage: join(constants.DB_DIR, constants.DB_NAME), 16 | models: [Site, Event], 17 | logging: false, 18 | }); 19 | 20 | sequelize.sync({ alter: constants.MIGRATE_DB === 'true' }); 21 | 22 | export { Event, Site }; 23 | -------------------------------------------------------------------------------- /server/src/types/index.ts: -------------------------------------------------------------------------------- 1 | import { Container } from 'dockerode'; 2 | 3 | import { Event } from '../sql'; 4 | 5 | export interface BuildEnvVars { 6 | SITE_ID: string; 7 | REPO_URL: string; 8 | BUILD_COMMAND: string; 9 | NODE_VERSION: string; 10 | BUILD_DIR: string; // for Gatsby public, create-react-app usually dist 11 | DEPLOY_DIR: string; 12 | GITHUB_ACCESS_TOKEN: string; 13 | USE_CACHE?: boolean; 14 | [key: string]: string | boolean; 15 | } 16 | 17 | export interface BuildProcess { 18 | [key: string]: { 19 | status: 'preparing' | 'building'; 20 | container?: Container; 21 | event?: Event; 22 | }; 23 | } 24 | 25 | export interface BuildProcessesType { 26 | processes: BuildProcess[]; 27 | get: Function; 28 | set: Function; 29 | del: Function; 30 | } 31 | -------------------------------------------------------------------------------- /server/src/util/index.ts: -------------------------------------------------------------------------------- 1 | import { Event } from '../sql'; 2 | import BuildProcesses from '../BuildProcesses'; 3 | import { docker } from '..'; 4 | 5 | export const isProd = process.env.NODE_ENV === 'production'; 6 | 7 | export const createSiteID = (): string => { 8 | return Math.random().toString(36).substring(2, 8); 9 | }; 10 | 11 | export const saveBuildLog = ( 12 | event: Event, 13 | stream: NodeJS.ReadWriteStream 14 | ): void => { 15 | let log: string = ''; 16 | 17 | stream.on('data', chunk => { 18 | log += removeAnsiEscapeCodes(chunk.toString('utf8')); 19 | console.log(removeAnsiEscapeCodes(chunk.toString('utf8'))); 20 | }); 21 | stream.on('error', error => console.error(error)); 22 | stream.on('end', () => { 23 | event.update({ log }); 24 | }); 25 | }; 26 | 27 | export const sanitizeName = (name: string) => 28 | name.trim().replace(/\s/g, '-').toLowerCase().substr(0, 40); 29 | 30 | /** 31 | * Recursively removes dots, slashes and whitespaces from the start and end of the string. 32 | * @param input A string which represents the directory where to build output is located. 33 | */ 34 | export const sanitizeBuildDir = (input: string): string => { 35 | let inputArr = input.split(''); 36 | 37 | if (inputArr[0].match(/(\/|\.|\/|\\| )/gi) !== null) { 38 | inputArr.shift(); 39 | } 40 | 41 | if (inputArr[inputArr.length - 1].match(/(\/|\.|\/|\\| )/gi) !== null) { 42 | inputArr.pop(); 43 | } 44 | 45 | if ( 46 | inputArr[0].match(/(\/|\.|\/|\\| )/gi) !== null || 47 | inputArr[inputArr.length - 1].match(/(\/|\.|\/|\\| )/gi) !== null 48 | ) { 49 | return sanitizeBuildDir(inputArr.join('')); 50 | } else { 51 | return inputArr.join(''); 52 | } 53 | }; 54 | 55 | /* 56 | ** This stops the currently running build processes in case of a termination signal to the app. 57 | */ 58 | export const stopRunningBuilds = (code: number) => { 59 | const runningBuilds = BuildProcesses.get(); 60 | 61 | for (const id in runningBuilds) { 62 | if (runningBuilds[id].container !== undefined) { 63 | const container = docker.getContainer(runningBuilds[id].container.id); 64 | container.kill({ signal: code }); 65 | } 66 | } 67 | }; 68 | 69 | export const calcuateBuildTime = (event: Event): number => { 70 | try { 71 | const milliseconds = Date.now() - event.createdAt.getTime(); 72 | const seconds = Math.round(milliseconds / 1000); 73 | return seconds; 74 | /*if (seconds < 60) { 75 | return `0m ${seconds}s`; 76 | } else { 77 | const minutes = Math.round(seconds / 60); 78 | seconds = Math.round(seconds % 60); 79 | return `${minutes}m ${seconds}s`; 80 | } */ 81 | } catch (error) { 82 | console.error(error); 83 | } 84 | }; 85 | 86 | export const removeAnsiEscapeCodes = (text: string): string => { 87 | const ansiEscape = 88 | /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; 89 | return text.replace(ansiEscape, ''); 90 | }; 91 | -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "esModuleInterop": true, 5 | "allowSyntheticDefaultImports": true, 6 | "target": "es6", 7 | "experimentalDecorators": true, 8 | "emitDecoratorMetadata": true, 9 | "noImplicitAny": true, 10 | "moduleResolution": "node", 11 | "sourceMap": true, 12 | "outDir": "dist", 13 | "baseUrl": ".", 14 | "paths": { 15 | "*": [ 16 | "node_modules/*", 17 | "src/types/*" 18 | ] 19 | } 20 | }, 21 | "include": [ 22 | "src/**/*" 23 | ] 24 | } -------------------------------------------------------------------------------- /server/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@gar/promisify@^1.0.1": 13 | version "1.1.3" 14 | resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz" 15 | integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== 16 | 17 | "@jridgewell/resolve-uri@^3.0.3": 18 | version "3.1.2" 19 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" 20 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 21 | 22 | "@jridgewell/sourcemap-codec@^1.4.10": 23 | version "1.4.15" 24 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" 25 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 26 | 27 | "@jridgewell/trace-mapping@0.3.9": 28 | version "0.3.9" 29 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" 30 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 31 | dependencies: 32 | "@jridgewell/resolve-uri" "^3.0.3" 33 | "@jridgewell/sourcemap-codec" "^1.4.10" 34 | 35 | "@npmcli/fs@^1.0.0": 36 | version "1.1.1" 37 | resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz" 38 | integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== 39 | dependencies: 40 | "@gar/promisify" "^1.0.1" 41 | semver "^7.3.5" 42 | 43 | "@npmcli/move-file@^1.0.1": 44 | version "1.1.2" 45 | resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz" 46 | integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== 47 | dependencies: 48 | mkdirp "^1.0.4" 49 | rimraf "^3.0.2" 50 | 51 | "@tootallnate/once@1": 52 | version "1.1.2" 53 | resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" 54 | integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== 55 | 56 | "@tsconfig/node10@^1.0.7": 57 | version "1.0.9" 58 | resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" 59 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 60 | 61 | "@tsconfig/node12@^1.0.7": 62 | version "1.0.11" 63 | resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" 64 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 65 | 66 | "@tsconfig/node14@^1.0.0": 67 | version "1.0.3" 68 | resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" 69 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 70 | 71 | "@tsconfig/node16@^1.0.2": 72 | version "1.0.4" 73 | resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" 74 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 75 | 76 | "@types/body-parser@*": 77 | version "1.17.1" 78 | resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.1.tgz" 79 | integrity sha512-RoX2EZjMiFMjZh9lmYrwgoP9RTpAjSHiJxdp4oidAQVO02T7HER3xj9UKue5534ULWeqVEkujhWcyvUce+d68w== 80 | dependencies: 81 | "@types/connect" "*" 82 | "@types/node" "*" 83 | 84 | "@types/connect@*": 85 | version "3.4.32" 86 | resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz" 87 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 88 | dependencies: 89 | "@types/node" "*" 90 | 91 | "@types/debug@^4.1.8": 92 | version "4.1.12" 93 | resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" 94 | integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== 95 | dependencies: 96 | "@types/ms" "*" 97 | 98 | "@types/dockerode@^2.5.21": 99 | version "2.5.21" 100 | resolved "https://registry.npmjs.org/@types/dockerode/-/dockerode-2.5.21.tgz" 101 | integrity sha512-Y9kVV7Umw0SAOsGVp06VGjlAiZbjALNhDIw69NeWNEqfI++7nQijzjWsepOkUjKHr5CrJWgK4v++6a+Ms0G/6A== 102 | dependencies: 103 | "@types/node" "*" 104 | 105 | "@types/express-serve-static-core@*": 106 | version "4.19.5" 107 | resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz" 108 | integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== 109 | dependencies: 110 | "@types/node" "*" 111 | "@types/qs" "*" 112 | "@types/range-parser" "*" 113 | "@types/send" "*" 114 | 115 | "@types/express@4.17.8": 116 | version "4.17.8" 117 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.8.tgz#3df4293293317e61c60137d273a2e96cd8d5f27a" 118 | integrity sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ== 119 | dependencies: 120 | "@types/body-parser" "*" 121 | "@types/express-serve-static-core" "*" 122 | "@types/qs" "*" 123 | "@types/serve-static" "*" 124 | 125 | "@types/geojson@^7946.0.14": 126 | version "7946.0.14" 127 | resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" 128 | integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== 129 | 130 | "@types/jsonwebtoken@^8.3.8": 131 | version "8.3.8" 132 | resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.3.8.tgz" 133 | integrity sha512-g2ke5+AR/RKYpQxd+HJ2yisLHGuOV0uourOcPtKlcT5Zqv4wFg9vKhFpXEztN4H/6Y6RSUKioz/2PTFPP30CTA== 134 | dependencies: 135 | "@types/node" "*" 136 | 137 | "@types/mime@*": 138 | version "2.0.1" 139 | resolved "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz" 140 | integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 141 | 142 | "@types/mime@^1": 143 | version "1.3.5" 144 | resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" 145 | integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== 146 | 147 | "@types/ms@*": 148 | version "0.7.34" 149 | resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" 150 | integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== 151 | 152 | "@types/node@*": 153 | version "12.12.14" 154 | resolved "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz" 155 | integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== 156 | 157 | "@types/node@^20.11.17": 158 | version "20.14.14" 159 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.14.tgz#6b655d4a88623b0edb98300bb9dd2107225f885e" 160 | integrity sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ== 161 | dependencies: 162 | undici-types "~5.26.4" 163 | 164 | "@types/qs@*": 165 | version "6.9.15" 166 | resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz" 167 | integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== 168 | 169 | "@types/range-parser@*": 170 | version "1.2.3" 171 | resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz" 172 | integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== 173 | 174 | "@types/send@*": 175 | version "0.17.4" 176 | resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" 177 | integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== 178 | dependencies: 179 | "@types/mime" "^1" 180 | "@types/node" "*" 181 | 182 | "@types/serve-static@*": 183 | version "1.13.3" 184 | resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz" 185 | integrity sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g== 186 | dependencies: 187 | "@types/express-serve-static-core" "*" 188 | "@types/mime" "*" 189 | 190 | "@types/strip-bom@^3.0.0": 191 | version "3.0.0" 192 | resolved "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz" 193 | integrity sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I= 194 | 195 | "@types/strip-json-comments@0.0.30": 196 | version "0.0.30" 197 | resolved "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz" 198 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 199 | 200 | "@types/validator@^13.12.0", "@types/validator@^13.7.17": 201 | version "13.12.0" 202 | resolved "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz" 203 | integrity sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag== 204 | 205 | abbrev@1: 206 | version "1.1.1" 207 | resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" 208 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 209 | 210 | accepts@~1.3.8: 211 | version "1.3.8" 212 | resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" 213 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 214 | dependencies: 215 | mime-types "~2.1.34" 216 | negotiator "0.6.3" 217 | 218 | acorn-walk@^8.1.1: 219 | version "8.3.2" 220 | resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" 221 | integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== 222 | 223 | acorn@^8.4.1: 224 | version "8.11.3" 225 | resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" 226 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 227 | 228 | agent-base@6, agent-base@^6.0.2: 229 | version "6.0.2" 230 | resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" 231 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 232 | dependencies: 233 | debug "4" 234 | 235 | agentkeepalive@^4.1.3: 236 | version "4.5.0" 237 | resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" 238 | integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== 239 | dependencies: 240 | humanize-ms "^1.2.1" 241 | 242 | aggregate-error@^3.0.0: 243 | version "3.1.0" 244 | resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" 245 | integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== 246 | dependencies: 247 | clean-stack "^2.0.0" 248 | indent-string "^4.0.0" 249 | 250 | ansi-regex@^5.0.1: 251 | version "5.0.1" 252 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 253 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 254 | 255 | anymatch@~3.1.2: 256 | version "3.1.3" 257 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" 258 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 259 | dependencies: 260 | normalize-path "^3.0.0" 261 | picomatch "^2.0.4" 262 | 263 | "aproba@^1.0.3 || ^2.0.0": 264 | version "2.0.0" 265 | resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" 266 | integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== 267 | 268 | are-we-there-yet@^3.0.0: 269 | version "3.0.1" 270 | resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz" 271 | integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== 272 | dependencies: 273 | delegates "^1.0.0" 274 | readable-stream "^3.6.0" 275 | 276 | arg@^4.1.0: 277 | version "4.1.2" 278 | resolved "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz" 279 | integrity sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg== 280 | 281 | array-flatten@1.1.1: 282 | version "1.1.1" 283 | resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" 284 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 285 | 286 | asn1@~0.2.0: 287 | version "0.2.4" 288 | resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" 289 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 290 | dependencies: 291 | safer-buffer "~2.1.0" 292 | 293 | balanced-match@^1.0.0: 294 | version "1.0.0" 295 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 296 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 297 | 298 | base64-js@^1.3.1: 299 | version "1.5.1" 300 | resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" 301 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 302 | 303 | bcrypt-pbkdf@^1.0.2: 304 | version "1.0.2" 305 | resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" 306 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 307 | dependencies: 308 | tweetnacl "^0.14.3" 309 | 310 | binary-extensions@^2.0.0: 311 | version "2.2.0" 312 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" 313 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 314 | 315 | bindings@^1.5.0: 316 | version "1.5.0" 317 | resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" 318 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 319 | dependencies: 320 | file-uri-to-path "1.0.0" 321 | 322 | bl@^3.0.0: 323 | version "3.0.1" 324 | resolved "https://registry.npmjs.org/bl/-/bl-3.0.1.tgz" 325 | integrity sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ== 326 | dependencies: 327 | readable-stream "^3.0.1" 328 | 329 | bl@^4.0.3: 330 | version "4.1.0" 331 | resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" 332 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 333 | dependencies: 334 | buffer "^5.5.0" 335 | inherits "^2.0.4" 336 | readable-stream "^3.4.0" 337 | 338 | body-parser@1.20.2, body-parser@^1.20.2: 339 | version "1.20.2" 340 | resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz" 341 | integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== 342 | dependencies: 343 | bytes "3.1.2" 344 | content-type "~1.0.5" 345 | debug "2.6.9" 346 | depd "2.0.0" 347 | destroy "1.2.0" 348 | http-errors "2.0.0" 349 | iconv-lite "0.4.24" 350 | on-finished "2.4.1" 351 | qs "6.11.0" 352 | raw-body "2.5.2" 353 | type-is "~1.6.18" 354 | unpipe "1.0.0" 355 | 356 | brace-expansion@^1.1.7: 357 | version "1.1.11" 358 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 359 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 360 | dependencies: 361 | balanced-match "^1.0.0" 362 | concat-map "0.0.1" 363 | 364 | braces@~3.0.2: 365 | version "3.0.2" 366 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 367 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 368 | dependencies: 369 | fill-range "^7.0.1" 370 | 371 | buffer-equal-constant-time@1.0.1: 372 | version "1.0.1" 373 | resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" 374 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 375 | 376 | buffer-from@^1.0.0: 377 | version "1.1.1" 378 | resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" 379 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 380 | 381 | buffer@^5.5.0: 382 | version "5.7.1" 383 | resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" 384 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 385 | dependencies: 386 | base64-js "^1.3.1" 387 | ieee754 "^1.1.13" 388 | 389 | bytes@3.1.2: 390 | version "3.1.2" 391 | resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" 392 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 393 | 394 | cacache@^15.2.0: 395 | version "15.3.0" 396 | resolved "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz" 397 | integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== 398 | dependencies: 399 | "@npmcli/fs" "^1.0.0" 400 | "@npmcli/move-file" "^1.0.1" 401 | chownr "^2.0.0" 402 | fs-minipass "^2.0.0" 403 | glob "^7.1.4" 404 | infer-owner "^1.0.4" 405 | lru-cache "^6.0.0" 406 | minipass "^3.1.1" 407 | minipass-collect "^1.0.2" 408 | minipass-flush "^1.0.5" 409 | minipass-pipeline "^1.2.2" 410 | mkdirp "^1.0.3" 411 | p-map "^4.0.0" 412 | promise-inflight "^1.0.1" 413 | rimraf "^3.0.2" 414 | ssri "^8.0.1" 415 | tar "^6.0.2" 416 | unique-filename "^1.1.1" 417 | 418 | call-bind@^1.0.7: 419 | version "1.0.7" 420 | resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" 421 | integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== 422 | dependencies: 423 | es-define-property "^1.0.0" 424 | es-errors "^1.3.0" 425 | function-bind "^1.1.2" 426 | get-intrinsic "^1.2.4" 427 | set-function-length "^1.2.1" 428 | 429 | chokidar@^3.5.1: 430 | version "3.6.0" 431 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" 432 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 433 | dependencies: 434 | anymatch "~3.1.2" 435 | braces "~3.0.2" 436 | glob-parent "~5.1.2" 437 | is-binary-path "~2.1.0" 438 | is-glob "~4.0.1" 439 | normalize-path "~3.0.0" 440 | readdirp "~3.6.0" 441 | optionalDependencies: 442 | fsevents "~2.3.2" 443 | 444 | chownr@^1.1.1: 445 | version "1.1.3" 446 | resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz" 447 | integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== 448 | 449 | chownr@^2.0.0: 450 | version "2.0.0" 451 | resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" 452 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 453 | 454 | clean-stack@^2.0.0: 455 | version "2.2.0" 456 | resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" 457 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== 458 | 459 | color-support@^1.1.3: 460 | version "1.1.3" 461 | resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" 462 | integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== 463 | 464 | concat-map@0.0.1: 465 | version "0.0.1" 466 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 467 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 468 | 469 | concat-stream@~2.0.0: 470 | version "2.0.0" 471 | resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz" 472 | integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== 473 | dependencies: 474 | buffer-from "^1.0.0" 475 | inherits "^2.0.3" 476 | readable-stream "^3.0.2" 477 | typedarray "^0.0.6" 478 | 479 | console-control-strings@^1.1.0: 480 | version "1.1.0" 481 | resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" 482 | integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== 483 | 484 | content-disposition@0.5.4: 485 | version "0.5.4" 486 | resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" 487 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 488 | dependencies: 489 | safe-buffer "5.2.1" 490 | 491 | content-type@~1.0.4: 492 | version "1.0.4" 493 | resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" 494 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 495 | 496 | content-type@~1.0.5: 497 | version "1.0.5" 498 | resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" 499 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 500 | 501 | cookie-signature@1.0.6: 502 | version "1.0.6" 503 | resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" 504 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 505 | 506 | cookie@0.6.0: 507 | version "0.6.0" 508 | resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" 509 | integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== 510 | 511 | create-require@^1.1.0: 512 | version "1.1.1" 513 | resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" 514 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 515 | 516 | debug@2.6.9: 517 | version "2.6.9" 518 | resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 519 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 520 | dependencies: 521 | ms "2.0.0" 522 | 523 | debug@4, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4: 524 | version "4.3.4" 525 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" 526 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 527 | dependencies: 528 | ms "2.1.2" 529 | 530 | decompress-response@^6.0.0: 531 | version "6.0.0" 532 | resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" 533 | integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== 534 | dependencies: 535 | mimic-response "^3.1.0" 536 | 537 | deep-extend@^0.6.0: 538 | version "0.6.0" 539 | resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" 540 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 541 | 542 | define-data-property@^1.1.4: 543 | version "1.1.4" 544 | resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" 545 | integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== 546 | dependencies: 547 | es-define-property "^1.0.0" 548 | es-errors "^1.3.0" 549 | gopd "^1.0.1" 550 | 551 | delegates@^1.0.0: 552 | version "1.0.0" 553 | resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" 554 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 555 | 556 | denque@^2.1.0: 557 | version "2.1.0" 558 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" 559 | integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== 560 | 561 | depd@2.0.0: 562 | version "2.0.0" 563 | resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" 564 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 565 | 566 | destroy@1.2.0: 567 | version "1.2.0" 568 | resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" 569 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 570 | 571 | detect-libc@^2.0.0: 572 | version "2.0.2" 573 | resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" 574 | integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== 575 | 576 | diff@^4.0.1: 577 | version "4.0.1" 578 | resolved "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz" 579 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 580 | 581 | docker-modem@^2.1.0: 582 | version "2.1.1" 583 | resolved "https://registry.npmjs.org/docker-modem/-/docker-modem-2.1.1.tgz" 584 | integrity sha512-zSFwYN4AP38LJhTIOpZMjiDbAqSJbv8+u9i/Xq5XABIeTzgp83VF63epu6sVHWxe+6tfhMXqgV+sYjZWh/UzSQ== 585 | dependencies: 586 | debug "^4.1.1" 587 | readable-stream "^3.5.0" 588 | split-ca "^1.0.1" 589 | ssh2 "^0.8.7" 590 | 591 | dockerode@^3.1.0: 592 | version "3.1.0" 593 | resolved "https://registry.npmjs.org/dockerode/-/dockerode-3.1.0.tgz" 594 | integrity sha512-E0KknBBTlIVEvtt2XJRZ3he59u2UN8Yr1A08Sey/BKIox+WlwnJp5fL5SKyhPgNmSXgamPEuKYCJxMi31uj0Nw== 595 | dependencies: 596 | concat-stream "~2.0.0" 597 | docker-modem "^2.1.0" 598 | tar-fs "~2.0.0" 599 | 600 | dotenv@^8.2.0: 601 | version "8.2.0" 602 | resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz" 603 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 604 | 605 | dottie@^2.0.6: 606 | version "2.0.6" 607 | resolved "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz" 608 | integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== 609 | 610 | dynamic-dedupe@^0.3.0: 611 | version "0.3.0" 612 | resolved "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz" 613 | integrity sha1-BuRMIj9eTpTXjvnbI6ZRXOL5YqE= 614 | dependencies: 615 | xtend "^4.0.0" 616 | 617 | ecdsa-sig-formatter@1.0.11: 618 | version "1.0.11" 619 | resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" 620 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 621 | dependencies: 622 | safe-buffer "^5.0.1" 623 | 624 | ee-first@1.1.1: 625 | version "1.1.1" 626 | resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" 627 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 628 | 629 | emoji-regex@^8.0.0: 630 | version "8.0.0" 631 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 632 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 633 | 634 | encodeurl@~1.0.2: 635 | version "1.0.2" 636 | resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" 637 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 638 | 639 | encoding@^0.1.12: 640 | version "0.1.13" 641 | resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" 642 | integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== 643 | dependencies: 644 | iconv-lite "^0.6.2" 645 | 646 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 647 | version "1.4.4" 648 | resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" 649 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 650 | dependencies: 651 | once "^1.4.0" 652 | 653 | env-paths@^2.2.0: 654 | version "2.2.1" 655 | resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" 656 | integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== 657 | 658 | err-code@^2.0.2: 659 | version "2.0.3" 660 | resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" 661 | integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== 662 | 663 | es-define-property@^1.0.0: 664 | version "1.0.0" 665 | resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" 666 | integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== 667 | dependencies: 668 | get-intrinsic "^1.2.4" 669 | 670 | es-errors@^1.3.0: 671 | version "1.3.0" 672 | resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" 673 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 674 | 675 | escape-html@~1.0.3: 676 | version "1.0.3" 677 | resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" 678 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 679 | 680 | etag@~1.8.1: 681 | version "1.8.1" 682 | resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" 683 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 684 | 685 | expand-template@^2.0.3: 686 | version "2.0.3" 687 | resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" 688 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 689 | 690 | express@^4.19.2: 691 | version "4.19.2" 692 | resolved "https://registry.npmjs.org/express/-/express-4.19.2.tgz" 693 | integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== 694 | dependencies: 695 | accepts "~1.3.8" 696 | array-flatten "1.1.1" 697 | body-parser "1.20.2" 698 | content-disposition "0.5.4" 699 | content-type "~1.0.4" 700 | cookie "0.6.0" 701 | cookie-signature "1.0.6" 702 | debug "2.6.9" 703 | depd "2.0.0" 704 | encodeurl "~1.0.2" 705 | escape-html "~1.0.3" 706 | etag "~1.8.1" 707 | finalhandler "1.2.0" 708 | fresh "0.5.2" 709 | http-errors "2.0.0" 710 | merge-descriptors "1.0.1" 711 | methods "~1.1.2" 712 | on-finished "2.4.1" 713 | parseurl "~1.3.3" 714 | path-to-regexp "0.1.7" 715 | proxy-addr "~2.0.7" 716 | qs "6.11.0" 717 | range-parser "~1.2.1" 718 | safe-buffer "5.2.1" 719 | send "0.18.0" 720 | serve-static "1.15.0" 721 | setprototypeof "1.2.0" 722 | statuses "2.0.1" 723 | type-is "~1.6.18" 724 | utils-merge "1.0.1" 725 | vary "~1.1.2" 726 | 727 | file-uri-to-path@1.0.0: 728 | version "1.0.0" 729 | resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" 730 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 731 | 732 | fill-range@^7.0.1: 733 | version "7.0.1" 734 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 735 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 736 | dependencies: 737 | to-regex-range "^5.0.1" 738 | 739 | finalhandler@1.2.0: 740 | version "1.2.0" 741 | resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" 742 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 743 | dependencies: 744 | debug "2.6.9" 745 | encodeurl "~1.0.2" 746 | escape-html "~1.0.3" 747 | on-finished "2.4.1" 748 | parseurl "~1.3.3" 749 | statuses "2.0.1" 750 | unpipe "~1.0.0" 751 | 752 | forwarded@0.2.0: 753 | version "0.2.0" 754 | resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" 755 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 756 | 757 | fresh@0.5.2: 758 | version "0.5.2" 759 | resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" 760 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 761 | 762 | fs-constants@^1.0.0: 763 | version "1.0.0" 764 | resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" 765 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 766 | 767 | fs-minipass@^2.0.0: 768 | version "2.1.0" 769 | resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" 770 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 771 | dependencies: 772 | minipass "^3.0.0" 773 | 774 | fs.realpath@^1.0.0: 775 | version "1.0.0" 776 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 777 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 778 | 779 | fsevents@~2.3.2: 780 | version "2.3.3" 781 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" 782 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 783 | 784 | function-bind@^1.1.2: 785 | version "1.1.2" 786 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" 787 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 788 | 789 | gauge@^4.0.3: 790 | version "4.0.4" 791 | resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz" 792 | integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== 793 | dependencies: 794 | aproba "^1.0.3 || ^2.0.0" 795 | color-support "^1.1.3" 796 | console-control-strings "^1.1.0" 797 | has-unicode "^2.0.1" 798 | signal-exit "^3.0.7" 799 | string-width "^4.2.3" 800 | strip-ansi "^6.0.1" 801 | wide-align "^1.1.5" 802 | 803 | get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: 804 | version "1.2.4" 805 | resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" 806 | integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== 807 | dependencies: 808 | es-errors "^1.3.0" 809 | function-bind "^1.1.2" 810 | has-proto "^1.0.1" 811 | has-symbols "^1.0.3" 812 | hasown "^2.0.0" 813 | 814 | github-from-package@0.0.0: 815 | version "0.0.0" 816 | resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" 817 | integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== 818 | 819 | glob-parent@~5.1.2: 820 | version "5.1.2" 821 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 822 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 823 | dependencies: 824 | is-glob "^4.0.1" 825 | 826 | glob@7.2.0: 827 | version "7.2.0" 828 | resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" 829 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 830 | dependencies: 831 | fs.realpath "^1.0.0" 832 | inflight "^1.0.4" 833 | inherits "2" 834 | minimatch "^3.0.4" 835 | once "^1.3.0" 836 | path-is-absolute "^1.0.0" 837 | 838 | glob@^7.1.3: 839 | version "7.1.6" 840 | resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" 841 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 842 | dependencies: 843 | fs.realpath "^1.0.0" 844 | inflight "^1.0.4" 845 | inherits "2" 846 | minimatch "^3.0.4" 847 | once "^1.3.0" 848 | path-is-absolute "^1.0.0" 849 | 850 | glob@^7.1.4: 851 | version "7.2.3" 852 | resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" 853 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 854 | dependencies: 855 | fs.realpath "^1.0.0" 856 | inflight "^1.0.4" 857 | inherits "2" 858 | minimatch "^3.1.1" 859 | once "^1.3.0" 860 | path-is-absolute "^1.0.0" 861 | 862 | gopd@^1.0.1: 863 | version "1.0.1" 864 | resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" 865 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 866 | dependencies: 867 | get-intrinsic "^1.1.3" 868 | 869 | graceful-fs@^4.2.6: 870 | version "4.2.11" 871 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" 872 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 873 | 874 | has-property-descriptors@^1.0.2: 875 | version "1.0.2" 876 | resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" 877 | integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== 878 | dependencies: 879 | es-define-property "^1.0.0" 880 | 881 | has-proto@^1.0.1: 882 | version "1.0.3" 883 | resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" 884 | integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== 885 | 886 | has-symbols@^1.0.3: 887 | version "1.0.3" 888 | resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" 889 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 890 | 891 | has-unicode@^2.0.1: 892 | version "2.0.1" 893 | resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" 894 | integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== 895 | 896 | hasown@^2.0.0: 897 | version "2.0.2" 898 | resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" 899 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 900 | dependencies: 901 | function-bind "^1.1.2" 902 | 903 | http-cache-semantics@^4.1.0: 904 | version "4.1.1" 905 | resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" 906 | integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== 907 | 908 | http-errors@2.0.0: 909 | version "2.0.0" 910 | resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" 911 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 912 | dependencies: 913 | depd "2.0.0" 914 | inherits "2.0.4" 915 | setprototypeof "1.2.0" 916 | statuses "2.0.1" 917 | toidentifier "1.0.1" 918 | 919 | http-proxy-agent@^4.0.1: 920 | version "4.0.1" 921 | resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" 922 | integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== 923 | dependencies: 924 | "@tootallnate/once" "1" 925 | agent-base "6" 926 | debug "4" 927 | 928 | https-proxy-agent@^5.0.0: 929 | version "5.0.1" 930 | resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" 931 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 932 | dependencies: 933 | agent-base "6" 934 | debug "4" 935 | 936 | humanize-ms@^1.2.1: 937 | version "1.2.1" 938 | resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" 939 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 940 | dependencies: 941 | ms "^2.0.0" 942 | 943 | iconv-lite@0.4.24: 944 | version "0.4.24" 945 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" 946 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 947 | dependencies: 948 | safer-buffer ">= 2.1.2 < 3" 949 | 950 | iconv-lite@^0.6.2, iconv-lite@^0.6.3: 951 | version "0.6.3" 952 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" 953 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 954 | dependencies: 955 | safer-buffer ">= 2.1.2 < 3.0.0" 956 | 957 | ieee754@^1.1.13: 958 | version "1.2.1" 959 | resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" 960 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 961 | 962 | imurmurhash@^0.1.4: 963 | version "0.1.4" 964 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 965 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 966 | 967 | indent-string@^4.0.0: 968 | version "4.0.0" 969 | resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" 970 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== 971 | 972 | infer-owner@^1.0.4: 973 | version "1.0.4" 974 | resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz" 975 | integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== 976 | 977 | inflection@^1.13.4: 978 | version "1.13.4" 979 | resolved "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz" 980 | integrity sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw== 981 | 982 | inflight@^1.0.4: 983 | version "1.0.6" 984 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 985 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 986 | dependencies: 987 | once "^1.3.0" 988 | wrappy "1" 989 | 990 | inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: 991 | version "2.0.4" 992 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 993 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 994 | 995 | ini@~1.3.0: 996 | version "1.3.8" 997 | resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" 998 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 999 | 1000 | ip-address@^9.0.5: 1001 | version "9.0.5" 1002 | resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz" 1003 | integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== 1004 | dependencies: 1005 | jsbn "1.1.0" 1006 | sprintf-js "^1.1.3" 1007 | 1008 | ipaddr.js@1.9.1: 1009 | version "1.9.1" 1010 | resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" 1011 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1012 | 1013 | is-binary-path@~2.1.0: 1014 | version "2.1.0" 1015 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 1016 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1017 | dependencies: 1018 | binary-extensions "^2.0.0" 1019 | 1020 | is-extglob@^2.1.1: 1021 | version "2.1.1" 1022 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 1023 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1024 | 1025 | is-fullwidth-code-point@^3.0.0: 1026 | version "3.0.0" 1027 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 1028 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1029 | 1030 | is-glob@^4.0.1, is-glob@~4.0.1: 1031 | version "4.0.3" 1032 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 1033 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1034 | dependencies: 1035 | is-extglob "^2.1.1" 1036 | 1037 | is-lambda@^1.0.1: 1038 | version "1.0.1" 1039 | resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" 1040 | integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== 1041 | 1042 | is-number@^7.0.0: 1043 | version "7.0.0" 1044 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 1045 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1046 | 1047 | isexe@^2.0.0: 1048 | version "2.0.0" 1049 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 1050 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1051 | 1052 | jsbn@1.1.0: 1053 | version "1.1.0" 1054 | resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" 1055 | integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== 1056 | 1057 | jsonwebtoken@^8.5.1: 1058 | version "8.5.1" 1059 | resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz" 1060 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 1061 | dependencies: 1062 | jws "^3.2.2" 1063 | lodash.includes "^4.3.0" 1064 | lodash.isboolean "^3.0.3" 1065 | lodash.isinteger "^4.0.4" 1066 | lodash.isnumber "^3.0.3" 1067 | lodash.isplainobject "^4.0.6" 1068 | lodash.isstring "^4.0.1" 1069 | lodash.once "^4.0.0" 1070 | ms "^2.1.1" 1071 | semver "^5.6.0" 1072 | 1073 | jwa@^1.4.1: 1074 | version "1.4.1" 1075 | resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" 1076 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 1077 | dependencies: 1078 | buffer-equal-constant-time "1.0.1" 1079 | ecdsa-sig-formatter "1.0.11" 1080 | safe-buffer "^5.0.1" 1081 | 1082 | jws@^3.2.2: 1083 | version "3.2.2" 1084 | resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" 1085 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1086 | dependencies: 1087 | jwa "^1.4.1" 1088 | safe-buffer "^5.0.1" 1089 | 1090 | lodash.includes@^4.3.0: 1091 | version "4.3.0" 1092 | resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" 1093 | integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= 1094 | 1095 | lodash.isboolean@^3.0.3: 1096 | version "3.0.3" 1097 | resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" 1098 | integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= 1099 | 1100 | lodash.isinteger@^4.0.4: 1101 | version "4.0.4" 1102 | resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" 1103 | integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= 1104 | 1105 | lodash.isnumber@^3.0.3: 1106 | version "3.0.3" 1107 | resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" 1108 | integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= 1109 | 1110 | lodash.isplainobject@^4.0.6: 1111 | version "4.0.6" 1112 | resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" 1113 | integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= 1114 | 1115 | lodash.isstring@^4.0.1: 1116 | version "4.0.1" 1117 | resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" 1118 | integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= 1119 | 1120 | lodash.once@^4.0.0: 1121 | version "4.1.1" 1122 | resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" 1123 | integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= 1124 | 1125 | lodash@^4.17.21: 1126 | version "4.17.21" 1127 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 1128 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1129 | 1130 | lru-cache@^10.2.0: 1131 | version "10.4.3" 1132 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" 1133 | integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== 1134 | 1135 | lru-cache@^6.0.0: 1136 | version "6.0.0" 1137 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" 1138 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1139 | dependencies: 1140 | yallist "^4.0.0" 1141 | 1142 | make-error@^1.1.1: 1143 | version "1.3.5" 1144 | resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz" 1145 | integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== 1146 | 1147 | make-fetch-happen@^9.1.0: 1148 | version "9.1.0" 1149 | resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz" 1150 | integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== 1151 | dependencies: 1152 | agentkeepalive "^4.1.3" 1153 | cacache "^15.2.0" 1154 | http-cache-semantics "^4.1.0" 1155 | http-proxy-agent "^4.0.1" 1156 | https-proxy-agent "^5.0.0" 1157 | is-lambda "^1.0.1" 1158 | lru-cache "^6.0.0" 1159 | minipass "^3.1.3" 1160 | minipass-collect "^1.0.2" 1161 | minipass-fetch "^1.3.2" 1162 | minipass-flush "^1.0.5" 1163 | minipass-pipeline "^1.2.4" 1164 | negotiator "^0.6.2" 1165 | promise-retry "^2.0.1" 1166 | socks-proxy-agent "^6.0.0" 1167 | ssri "^8.0.0" 1168 | 1169 | mariadb@^3.3.1: 1170 | version "3.3.1" 1171 | resolved "https://registry.yarnpkg.com/mariadb/-/mariadb-3.3.1.tgz#3ee361242411ba4cf4a80b06e304d1c68c97ad90" 1172 | integrity sha512-L8bh4iuZU3J8H7Co7rQ6OY9FDLItAN1rGy8kPA7Dyxo8AiHADuuONoypKKp1pE09drs6e5LR7UW9luLZ/A4znA== 1173 | dependencies: 1174 | "@types/geojson" "^7946.0.14" 1175 | "@types/node" "^20.11.17" 1176 | denque "^2.1.0" 1177 | iconv-lite "^0.6.3" 1178 | lru-cache "^10.2.0" 1179 | 1180 | media-typer@0.3.0: 1181 | version "0.3.0" 1182 | resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" 1183 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1184 | 1185 | merge-descriptors@1.0.1: 1186 | version "1.0.1" 1187 | resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" 1188 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1189 | 1190 | methods@~1.1.2: 1191 | version "1.1.2" 1192 | resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" 1193 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1194 | 1195 | mime-db@1.42.0: 1196 | version "1.42.0" 1197 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz" 1198 | integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== 1199 | 1200 | mime-db@1.52.0: 1201 | version "1.52.0" 1202 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" 1203 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1204 | 1205 | mime-types@~2.1.24: 1206 | version "2.1.25" 1207 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz" 1208 | integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== 1209 | dependencies: 1210 | mime-db "1.42.0" 1211 | 1212 | mime-types@~2.1.34: 1213 | version "2.1.35" 1214 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 1215 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1216 | dependencies: 1217 | mime-db "1.52.0" 1218 | 1219 | mime@1.6.0: 1220 | version "1.6.0" 1221 | resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" 1222 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1223 | 1224 | mimic-response@^3.1.0: 1225 | version "3.1.0" 1226 | resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" 1227 | integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== 1228 | 1229 | minimatch@^3.0.4: 1230 | version "3.0.4" 1231 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 1232 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1233 | dependencies: 1234 | brace-expansion "^1.1.7" 1235 | 1236 | minimatch@^3.1.1: 1237 | version "3.1.2" 1238 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 1239 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1240 | dependencies: 1241 | brace-expansion "^1.1.7" 1242 | 1243 | minimist@0.0.8: 1244 | version "0.0.8" 1245 | resolved "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" 1246 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 1247 | 1248 | minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: 1249 | version "1.2.8" 1250 | resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" 1251 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1252 | 1253 | minipass-collect@^1.0.2: 1254 | version "1.0.2" 1255 | resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz" 1256 | integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== 1257 | dependencies: 1258 | minipass "^3.0.0" 1259 | 1260 | minipass-fetch@^1.3.2: 1261 | version "1.4.1" 1262 | resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz" 1263 | integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== 1264 | dependencies: 1265 | minipass "^3.1.0" 1266 | minipass-sized "^1.0.3" 1267 | minizlib "^2.0.0" 1268 | optionalDependencies: 1269 | encoding "^0.1.12" 1270 | 1271 | minipass-flush@^1.0.5: 1272 | version "1.0.5" 1273 | resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" 1274 | integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== 1275 | dependencies: 1276 | minipass "^3.0.0" 1277 | 1278 | minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: 1279 | version "1.2.4" 1280 | resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" 1281 | integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== 1282 | dependencies: 1283 | minipass "^3.0.0" 1284 | 1285 | minipass-sized@^1.0.3: 1286 | version "1.0.3" 1287 | resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" 1288 | integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== 1289 | dependencies: 1290 | minipass "^3.0.0" 1291 | 1292 | minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: 1293 | version "3.3.6" 1294 | resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" 1295 | integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== 1296 | dependencies: 1297 | yallist "^4.0.0" 1298 | 1299 | minipass@^5.0.0: 1300 | version "5.0.0" 1301 | resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" 1302 | integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== 1303 | 1304 | minizlib@^2.0.0, minizlib@^2.1.1: 1305 | version "2.1.2" 1306 | resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" 1307 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 1308 | dependencies: 1309 | minipass "^3.0.0" 1310 | yallist "^4.0.0" 1311 | 1312 | mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: 1313 | version "0.5.3" 1314 | resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" 1315 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 1316 | 1317 | mkdirp@^0.5.1: 1318 | version "0.5.1" 1319 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" 1320 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1321 | dependencies: 1322 | minimist "0.0.8" 1323 | 1324 | mkdirp@^1.0.3, mkdirp@^1.0.4: 1325 | version "1.0.4" 1326 | resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" 1327 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1328 | 1329 | moment-timezone@^0.5.43: 1330 | version "0.5.45" 1331 | resolved "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz" 1332 | integrity sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ== 1333 | dependencies: 1334 | moment "^2.29.4" 1335 | 1336 | moment@^2.29.4: 1337 | version "2.30.1" 1338 | resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" 1339 | integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== 1340 | 1341 | ms@2.0.0: 1342 | version "2.0.0" 1343 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 1344 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1345 | 1346 | ms@2.1.2, ms@^2.1.1: 1347 | version "2.1.2" 1348 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1349 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1350 | 1351 | ms@2.1.3, ms@^2.0.0: 1352 | version "2.1.3" 1353 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 1354 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1355 | 1356 | napi-build-utils@^1.0.1: 1357 | version "1.0.2" 1358 | resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" 1359 | integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== 1360 | 1361 | negotiator@0.6.3, negotiator@^0.6.2: 1362 | version "0.6.3" 1363 | resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" 1364 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1365 | 1366 | node-abi@^3.3.0: 1367 | version "3.56.0" 1368 | resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.56.0.tgz" 1369 | integrity sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q== 1370 | dependencies: 1371 | semver "^7.3.5" 1372 | 1373 | node-addon-api@^7.0.0: 1374 | version "7.1.0" 1375 | resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz" 1376 | integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g== 1377 | 1378 | node-gyp@8.x: 1379 | version "8.4.1" 1380 | resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz" 1381 | integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== 1382 | dependencies: 1383 | env-paths "^2.2.0" 1384 | glob "^7.1.4" 1385 | graceful-fs "^4.2.6" 1386 | make-fetch-happen "^9.1.0" 1387 | nopt "^5.0.0" 1388 | npmlog "^6.0.0" 1389 | rimraf "^3.0.2" 1390 | semver "^7.3.5" 1391 | tar "^6.1.2" 1392 | which "^2.0.2" 1393 | 1394 | nopt@^5.0.0: 1395 | version "5.0.0" 1396 | resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" 1397 | integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== 1398 | dependencies: 1399 | abbrev "1" 1400 | 1401 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1402 | version "3.0.0" 1403 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 1404 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1405 | 1406 | npmlog@^6.0.0: 1407 | version "6.0.2" 1408 | resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz" 1409 | integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== 1410 | dependencies: 1411 | are-we-there-yet "^3.0.0" 1412 | console-control-strings "^1.1.0" 1413 | gauge "^4.0.3" 1414 | set-blocking "^2.0.0" 1415 | 1416 | object-inspect@^1.13.1: 1417 | version "1.13.2" 1418 | resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" 1419 | integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== 1420 | 1421 | on-finished@2.4.1: 1422 | version "2.4.1" 1423 | resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" 1424 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1425 | dependencies: 1426 | ee-first "1.1.1" 1427 | 1428 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1429 | version "1.4.0" 1430 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1431 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1432 | dependencies: 1433 | wrappy "1" 1434 | 1435 | p-map@^4.0.0: 1436 | version "4.0.0" 1437 | resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" 1438 | integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== 1439 | dependencies: 1440 | aggregate-error "^3.0.0" 1441 | 1442 | parseurl@~1.3.3: 1443 | version "1.3.3" 1444 | resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" 1445 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1446 | 1447 | path-is-absolute@^1.0.0: 1448 | version "1.0.1" 1449 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1450 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1451 | 1452 | path-parse@^1.0.6: 1453 | version "1.0.6" 1454 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" 1455 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1456 | 1457 | path-to-regexp@0.1.7: 1458 | version "0.1.7" 1459 | resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" 1460 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1461 | 1462 | pg-connection-string@^2.6.1: 1463 | version "2.6.2" 1464 | resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz" 1465 | integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== 1466 | 1467 | picomatch@^2.0.4, picomatch@^2.2.1: 1468 | version "2.3.1" 1469 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 1470 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1471 | 1472 | prebuild-install@^7.1.1: 1473 | version "7.1.2" 1474 | resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz" 1475 | integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== 1476 | dependencies: 1477 | detect-libc "^2.0.0" 1478 | expand-template "^2.0.3" 1479 | github-from-package "0.0.0" 1480 | minimist "^1.2.3" 1481 | mkdirp-classic "^0.5.3" 1482 | napi-build-utils "^1.0.1" 1483 | node-abi "^3.3.0" 1484 | pump "^3.0.0" 1485 | rc "^1.2.7" 1486 | simple-get "^4.0.0" 1487 | tar-fs "^2.0.0" 1488 | tunnel-agent "^0.6.0" 1489 | 1490 | prettier@^3.3.3: 1491 | version "3.3.3" 1492 | resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" 1493 | integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== 1494 | 1495 | promise-inflight@^1.0.1: 1496 | version "1.0.1" 1497 | resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" 1498 | integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== 1499 | 1500 | promise-retry@^2.0.1: 1501 | version "2.0.1" 1502 | resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" 1503 | integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== 1504 | dependencies: 1505 | err-code "^2.0.2" 1506 | retry "^0.12.0" 1507 | 1508 | proxy-addr@~2.0.7: 1509 | version "2.0.7" 1510 | resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" 1511 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 1512 | dependencies: 1513 | forwarded "0.2.0" 1514 | ipaddr.js "1.9.1" 1515 | 1516 | pump@^3.0.0: 1517 | version "3.0.0" 1518 | resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" 1519 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1520 | dependencies: 1521 | end-of-stream "^1.1.0" 1522 | once "^1.3.1" 1523 | 1524 | qs@6.11.0: 1525 | version "6.11.0" 1526 | resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" 1527 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 1528 | dependencies: 1529 | side-channel "^1.0.4" 1530 | 1531 | range-parser@~1.2.1: 1532 | version "1.2.1" 1533 | resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" 1534 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1535 | 1536 | raw-body@2.5.2: 1537 | version "2.5.2" 1538 | resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" 1539 | integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== 1540 | dependencies: 1541 | bytes "3.1.2" 1542 | http-errors "2.0.0" 1543 | iconv-lite "0.4.24" 1544 | unpipe "1.0.0" 1545 | 1546 | rc@^1.2.7: 1547 | version "1.2.8" 1548 | resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" 1549 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1550 | dependencies: 1551 | deep-extend "^0.6.0" 1552 | ini "~1.3.0" 1553 | minimist "^1.2.0" 1554 | strip-json-comments "~2.0.1" 1555 | 1556 | readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.5.0: 1557 | version "3.6.0" 1558 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" 1559 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1560 | dependencies: 1561 | inherits "^2.0.3" 1562 | string_decoder "^1.1.1" 1563 | util-deprecate "^1.0.1" 1564 | 1565 | readable-stream@^3.4.0, readable-stream@^3.6.0: 1566 | version "3.6.2" 1567 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" 1568 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 1569 | dependencies: 1570 | inherits "^2.0.3" 1571 | string_decoder "^1.1.1" 1572 | util-deprecate "^1.0.1" 1573 | 1574 | readdirp@~3.6.0: 1575 | version "3.6.0" 1576 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" 1577 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1578 | dependencies: 1579 | picomatch "^2.2.1" 1580 | 1581 | reflect-metadata@^0.1.13: 1582 | version "0.1.13" 1583 | resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" 1584 | integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 1585 | 1586 | resolve@^1.0.0: 1587 | version "1.15.1" 1588 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz" 1589 | integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== 1590 | dependencies: 1591 | path-parse "^1.0.6" 1592 | 1593 | retry-as-promised@^7.0.4: 1594 | version "7.0.4" 1595 | resolved "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz" 1596 | integrity sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA== 1597 | 1598 | retry@^0.12.0: 1599 | version "0.12.0" 1600 | resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" 1601 | integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== 1602 | 1603 | rimraf@^2.6.1: 1604 | version "2.7.1" 1605 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" 1606 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 1607 | dependencies: 1608 | glob "^7.1.3" 1609 | 1610 | rimraf@^3.0.2: 1611 | version "3.0.2" 1612 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 1613 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1614 | dependencies: 1615 | glob "^7.1.3" 1616 | 1617 | safe-buffer@5.2.1, safe-buffer@~5.2.0: 1618 | version "5.2.1" 1619 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 1620 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1621 | 1622 | safe-buffer@^5.0.1: 1623 | version "5.2.0" 1624 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz" 1625 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1626 | 1627 | "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: 1628 | version "2.1.2" 1629 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1630 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1631 | 1632 | semver@^5.6.0: 1633 | version "5.7.1" 1634 | resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" 1635 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1636 | 1637 | semver@^7.3.5, semver@^7.5.4: 1638 | version "7.6.0" 1639 | resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" 1640 | integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== 1641 | dependencies: 1642 | lru-cache "^6.0.0" 1643 | 1644 | send@0.18.0: 1645 | version "0.18.0" 1646 | resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" 1647 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1648 | dependencies: 1649 | debug "2.6.9" 1650 | depd "2.0.0" 1651 | destroy "1.2.0" 1652 | encodeurl "~1.0.2" 1653 | escape-html "~1.0.3" 1654 | etag "~1.8.1" 1655 | fresh "0.5.2" 1656 | http-errors "2.0.0" 1657 | mime "1.6.0" 1658 | ms "2.1.3" 1659 | on-finished "2.4.1" 1660 | range-parser "~1.2.1" 1661 | statuses "2.0.1" 1662 | 1663 | sequelize-pool@^7.1.0: 1664 | version "7.1.0" 1665 | resolved "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz" 1666 | integrity sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg== 1667 | 1668 | sequelize-typescript@^2.1.6: 1669 | version "2.1.6" 1670 | resolved "https://registry.npmjs.org/sequelize-typescript/-/sequelize-typescript-2.1.6.tgz" 1671 | integrity sha512-Vc2N++3en346RsbGjL3h7tgAl2Y7V+2liYTAOZ8XL0KTw3ahFHsyAUzOwct51n+g70I1TOUDgs06Oh6+XGcFkQ== 1672 | dependencies: 1673 | glob "7.2.0" 1674 | 1675 | sequelize@^6.37.3: 1676 | version "6.37.3" 1677 | resolved "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz" 1678 | integrity sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A== 1679 | dependencies: 1680 | "@types/debug" "^4.1.8" 1681 | "@types/validator" "^13.7.17" 1682 | debug "^4.3.4" 1683 | dottie "^2.0.6" 1684 | inflection "^1.13.4" 1685 | lodash "^4.17.21" 1686 | moment "^2.29.4" 1687 | moment-timezone "^0.5.43" 1688 | pg-connection-string "^2.6.1" 1689 | retry-as-promised "^7.0.4" 1690 | semver "^7.5.4" 1691 | sequelize-pool "^7.1.0" 1692 | toposort-class "^1.0.1" 1693 | uuid "^8.3.2" 1694 | validator "^13.9.0" 1695 | wkx "^0.5.0" 1696 | 1697 | serve-static@1.15.0: 1698 | version "1.15.0" 1699 | resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" 1700 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1701 | dependencies: 1702 | encodeurl "~1.0.2" 1703 | escape-html "~1.0.3" 1704 | parseurl "~1.3.3" 1705 | send "0.18.0" 1706 | 1707 | set-blocking@^2.0.0: 1708 | version "2.0.0" 1709 | resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" 1710 | integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== 1711 | 1712 | set-function-length@^1.2.1: 1713 | version "1.2.2" 1714 | resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" 1715 | integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== 1716 | dependencies: 1717 | define-data-property "^1.1.4" 1718 | es-errors "^1.3.0" 1719 | function-bind "^1.1.2" 1720 | get-intrinsic "^1.2.4" 1721 | gopd "^1.0.1" 1722 | has-property-descriptors "^1.0.2" 1723 | 1724 | setprototypeof@1.2.0: 1725 | version "1.2.0" 1726 | resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" 1727 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1728 | 1729 | side-channel@^1.0.4: 1730 | version "1.0.6" 1731 | resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" 1732 | integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== 1733 | dependencies: 1734 | call-bind "^1.0.7" 1735 | es-errors "^1.3.0" 1736 | get-intrinsic "^1.2.4" 1737 | object-inspect "^1.13.1" 1738 | 1739 | signal-exit@^3.0.7: 1740 | version "3.0.7" 1741 | resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" 1742 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1743 | 1744 | simple-concat@^1.0.0: 1745 | version "1.0.1" 1746 | resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" 1747 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 1748 | 1749 | simple-get@^4.0.0: 1750 | version "4.0.1" 1751 | resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" 1752 | integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== 1753 | dependencies: 1754 | decompress-response "^6.0.0" 1755 | once "^1.3.1" 1756 | simple-concat "^1.0.0" 1757 | 1758 | smart-buffer@^4.2.0: 1759 | version "4.2.0" 1760 | resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" 1761 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 1762 | 1763 | socks-proxy-agent@^6.0.0: 1764 | version "6.2.1" 1765 | resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz" 1766 | integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== 1767 | dependencies: 1768 | agent-base "^6.0.2" 1769 | debug "^4.3.3" 1770 | socks "^2.6.2" 1771 | 1772 | socks@^2.6.2: 1773 | version "2.8.1" 1774 | resolved "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz" 1775 | integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ== 1776 | dependencies: 1777 | ip-address "^9.0.5" 1778 | smart-buffer "^4.2.0" 1779 | 1780 | source-map-support@^0.5.12: 1781 | version "0.5.16" 1782 | resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz" 1783 | integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== 1784 | dependencies: 1785 | buffer-from "^1.0.0" 1786 | source-map "^0.6.0" 1787 | 1788 | source-map@^0.6.0: 1789 | version "0.6.1" 1790 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 1791 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1792 | 1793 | split-ca@^1.0.1: 1794 | version "1.0.1" 1795 | resolved "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz" 1796 | integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= 1797 | 1798 | sprintf-js@^1.1.3: 1799 | version "1.1.3" 1800 | resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" 1801 | integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== 1802 | 1803 | sqlite3@^5.1.7: 1804 | version "5.1.7" 1805 | resolved "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz" 1806 | integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog== 1807 | dependencies: 1808 | bindings "^1.5.0" 1809 | node-addon-api "^7.0.0" 1810 | prebuild-install "^7.1.1" 1811 | tar "^6.1.11" 1812 | optionalDependencies: 1813 | node-gyp "8.x" 1814 | 1815 | ssh2-streams@~0.4.8: 1816 | version "0.4.8" 1817 | resolved "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.4.8.tgz" 1818 | integrity sha512-auxXfgYySz2vYw7TMU7PK7vFI7EPvhvTH8/tZPgGaWocK4p/vwCMiV3icz9AEkb0R40kOKZtFtqYIxDJyJiytw== 1819 | dependencies: 1820 | asn1 "~0.2.0" 1821 | bcrypt-pbkdf "^1.0.2" 1822 | streamsearch "~0.1.2" 1823 | 1824 | ssh2@^0.8.7: 1825 | version "0.8.7" 1826 | resolved "https://registry.npmjs.org/ssh2/-/ssh2-0.8.7.tgz" 1827 | integrity sha512-/u1BO12kb0lDVxJXejWB9pxyF3/ncgRqI9vPCZuPzo05pdNDzqUeQRavScwSPsfMGK+5H/VRqp1IierIx0Bcxw== 1828 | dependencies: 1829 | ssh2-streams "~0.4.8" 1830 | 1831 | ssri@^8.0.0, ssri@^8.0.1: 1832 | version "8.0.1" 1833 | resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" 1834 | integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== 1835 | dependencies: 1836 | minipass "^3.1.1" 1837 | 1838 | statuses@2.0.1: 1839 | version "2.0.1" 1840 | resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" 1841 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1842 | 1843 | streamsearch@~0.1.2: 1844 | version "0.1.2" 1845 | resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" 1846 | integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= 1847 | 1848 | "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: 1849 | version "4.2.3" 1850 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 1851 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1852 | dependencies: 1853 | emoji-regex "^8.0.0" 1854 | is-fullwidth-code-point "^3.0.0" 1855 | strip-ansi "^6.0.1" 1856 | 1857 | string_decoder@^1.1.1: 1858 | version "1.3.0" 1859 | resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" 1860 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1861 | dependencies: 1862 | safe-buffer "~5.2.0" 1863 | 1864 | strip-ansi@^6.0.1: 1865 | version "6.0.1" 1866 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 1867 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1868 | dependencies: 1869 | ansi-regex "^5.0.1" 1870 | 1871 | strip-bom@^3.0.0: 1872 | version "3.0.0" 1873 | resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" 1874 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1875 | 1876 | strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: 1877 | version "2.0.1" 1878 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" 1879 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1880 | 1881 | tar-fs@^2.0.0: 1882 | version "2.1.1" 1883 | resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" 1884 | integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== 1885 | dependencies: 1886 | chownr "^1.1.1" 1887 | mkdirp-classic "^0.5.2" 1888 | pump "^3.0.0" 1889 | tar-stream "^2.1.4" 1890 | 1891 | tar-fs@~2.0.0: 1892 | version "2.0.0" 1893 | resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz" 1894 | integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== 1895 | dependencies: 1896 | chownr "^1.1.1" 1897 | mkdirp "^0.5.1" 1898 | pump "^3.0.0" 1899 | tar-stream "^2.0.0" 1900 | 1901 | tar-stream@^2.0.0: 1902 | version "2.1.0" 1903 | resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz" 1904 | integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== 1905 | dependencies: 1906 | bl "^3.0.0" 1907 | end-of-stream "^1.4.1" 1908 | fs-constants "^1.0.0" 1909 | inherits "^2.0.3" 1910 | readable-stream "^3.1.1" 1911 | 1912 | tar-stream@^2.1.4: 1913 | version "2.2.0" 1914 | resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" 1915 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 1916 | dependencies: 1917 | bl "^4.0.3" 1918 | end-of-stream "^1.4.1" 1919 | fs-constants "^1.0.0" 1920 | inherits "^2.0.3" 1921 | readable-stream "^3.1.1" 1922 | 1923 | tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: 1924 | version "6.2.0" 1925 | resolved "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz" 1926 | integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== 1927 | dependencies: 1928 | chownr "^2.0.0" 1929 | fs-minipass "^2.0.0" 1930 | minipass "^5.0.0" 1931 | minizlib "^2.1.1" 1932 | mkdirp "^1.0.3" 1933 | yallist "^4.0.0" 1934 | 1935 | to-regex-range@^5.0.1: 1936 | version "5.0.1" 1937 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1938 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1939 | dependencies: 1940 | is-number "^7.0.0" 1941 | 1942 | toidentifier@1.0.1: 1943 | version "1.0.1" 1944 | resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" 1945 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1946 | 1947 | toposort-class@^1.0.1: 1948 | version "1.0.1" 1949 | resolved "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz" 1950 | integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= 1951 | 1952 | tree-kill@^1.2.2: 1953 | version "1.2.2" 1954 | resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" 1955 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 1956 | 1957 | ts-node-dev@^2.0.0: 1958 | version "2.0.0" 1959 | resolved "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz" 1960 | integrity sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w== 1961 | dependencies: 1962 | chokidar "^3.5.1" 1963 | dynamic-dedupe "^0.3.0" 1964 | minimist "^1.2.6" 1965 | mkdirp "^1.0.4" 1966 | resolve "^1.0.0" 1967 | rimraf "^2.6.1" 1968 | source-map-support "^0.5.12" 1969 | tree-kill "^1.2.2" 1970 | ts-node "^10.4.0" 1971 | tsconfig "^7.0.0" 1972 | 1973 | ts-node@^10.4.0, ts-node@^10.9.2: 1974 | version "10.9.2" 1975 | resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" 1976 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 1977 | dependencies: 1978 | "@cspotcode/source-map-support" "^0.8.0" 1979 | "@tsconfig/node10" "^1.0.7" 1980 | "@tsconfig/node12" "^1.0.7" 1981 | "@tsconfig/node14" "^1.0.0" 1982 | "@tsconfig/node16" "^1.0.2" 1983 | acorn "^8.4.1" 1984 | acorn-walk "^8.1.1" 1985 | arg "^4.1.0" 1986 | create-require "^1.1.0" 1987 | diff "^4.0.1" 1988 | make-error "^1.1.1" 1989 | v8-compile-cache-lib "^3.0.1" 1990 | yn "3.1.1" 1991 | 1992 | tsconfig@^7.0.0: 1993 | version "7.0.0" 1994 | resolved "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz" 1995 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 1996 | dependencies: 1997 | "@types/strip-bom" "^3.0.0" 1998 | "@types/strip-json-comments" "0.0.30" 1999 | strip-bom "^3.0.0" 2000 | strip-json-comments "^2.0.0" 2001 | 2002 | tunnel-agent@^0.6.0: 2003 | version "0.6.0" 2004 | resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" 2005 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2006 | dependencies: 2007 | safe-buffer "^5.0.1" 2008 | 2009 | tweetnacl@^0.14.3: 2010 | version "0.14.5" 2011 | resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" 2012 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 2013 | 2014 | type-is@~1.6.18: 2015 | version "1.6.18" 2016 | resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" 2017 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2018 | dependencies: 2019 | media-typer "0.3.0" 2020 | mime-types "~2.1.24" 2021 | 2022 | typedarray@^0.0.6: 2023 | version "0.0.6" 2024 | resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" 2025 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 2026 | 2027 | typescript@^5.5.4: 2028 | version "5.5.4" 2029 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" 2030 | integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== 2031 | 2032 | undici-types@~5.26.4: 2033 | version "5.26.5" 2034 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 2035 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 2036 | 2037 | unique-filename@^1.1.1: 2038 | version "1.1.1" 2039 | resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz" 2040 | integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== 2041 | dependencies: 2042 | unique-slug "^2.0.0" 2043 | 2044 | unique-slug@^2.0.0: 2045 | version "2.0.2" 2046 | resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz" 2047 | integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== 2048 | dependencies: 2049 | imurmurhash "^0.1.4" 2050 | 2051 | unpipe@1.0.0, unpipe@~1.0.0: 2052 | version "1.0.0" 2053 | resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" 2054 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2055 | 2056 | util-deprecate@^1.0.1: 2057 | version "1.0.2" 2058 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 2059 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2060 | 2061 | utils-merge@1.0.1: 2062 | version "1.0.1" 2063 | resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" 2064 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 2065 | 2066 | uuid@^8.3.2: 2067 | version "8.3.2" 2068 | resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" 2069 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 2070 | 2071 | v8-compile-cache-lib@^3.0.1: 2072 | version "3.0.1" 2073 | resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" 2074 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 2075 | 2076 | validator@^13.9.0: 2077 | version "13.11.0" 2078 | resolved "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz" 2079 | integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== 2080 | 2081 | vary@~1.1.2: 2082 | version "1.1.2" 2083 | resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" 2084 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2085 | 2086 | which@^2.0.2: 2087 | version "2.0.2" 2088 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 2089 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2090 | dependencies: 2091 | isexe "^2.0.0" 2092 | 2093 | wide-align@^1.1.5: 2094 | version "1.1.5" 2095 | resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" 2096 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== 2097 | dependencies: 2098 | string-width "^1.0.2 || 2 || 3 || 4" 2099 | 2100 | wkx@^0.5.0: 2101 | version "0.5.0" 2102 | resolved "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz" 2103 | integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg== 2104 | dependencies: 2105 | "@types/node" "*" 2106 | 2107 | wrappy@1: 2108 | version "1.0.2" 2109 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 2110 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2111 | 2112 | xtend@^4.0.0: 2113 | version "4.0.2" 2114 | resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 2115 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 2116 | 2117 | yallist@^4.0.0: 2118 | version "4.0.0" 2119 | resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" 2120 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2121 | 2122 | yn@3.1.1: 2123 | version "3.1.1" 2124 | resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" 2125 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2126 | --------------------------------------------------------------------------------