├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── enhancement.md │ ├── feature.md │ ├── task-event.md │ ├── task.md │ ├── test.md │ └── use-case.md ├── .gitignore ├── .gitmodules ├── Dockerfile ├── LICENSE ├── README.md ├── babel.config.json ├── docker-compose.yml ├── package-lock.json ├── package.json ├── rollup.config.js ├── scripts ├── add-hg-module.sh ├── branch-all.sh ├── configure-all.sh ├── pull-all.sh ├── push-all.sh └── set-branch-main.sh ├── src ├── constants │ ├── build.ts │ └── runtime.ts ├── controllers │ └── HsBackendController.ts ├── hghs.ts └── main.ts └── tsconfig.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [heusalagroup] 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG] Subject" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | [Feature: TBD] 10 | 11 | ## Related tests, tasks & bugs 12 | 13 | * #N 14 | 15 | ## Describe the bug 16 | 17 | A clear and concise description of what the bug is. 18 | 19 | ## To Reproduce 20 | 21 | Steps to reproduce the behavior: 22 | 23 | 1. Go to '...' 24 | 2. Click on '....' 25 | 3. Scroll down to '....' 26 | 4. See error 27 | 28 | ## Expected behavior 29 | 30 | A clear and concise description of what you expected to happen. 31 | 32 | ## Screenshots 33 | 34 | If applicable, add screenshots to help explain your problem. 35 | 36 | ## Desktop (please complete the following information): 37 | 38 | - OS: [e.g. iOS] 39 | - Browser: [e.g. chrome, safari] 40 | - Version: [e.g. 22] 41 | 42 | ## Smartphone (please complete the following information): 43 | 44 | - Device: [e.g. iPhone6] 45 | - OS: [e.g. iOS8.1] 46 | - Browser: [e.g. stock browser, safari] 47 | - Version: [e.g. 22] 48 | 49 | ## Additional context 50 | 51 | Add any other context about the problem here, like links to related test cases, etc. 52 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: Subject 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | [Feature: TBD] 10 | 11 | ## Is your feature request related to a problem? Please describe. 12 | 13 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 14 | 15 | ## Describe the solution you'd like 16 | 17 | A clear and concise description of what you want to happen. 18 | 19 | ## Describe alternatives you've considered 20 | 21 | A clear and concise description of any alternative solutions or features you've considered. 22 | 23 | ## Additional context 24 | 25 | Add any other context or screenshots about the feature request here. 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature 3 | about: New feature 4 | title: "[FT] [TBD HTP] Subject" 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | [Index: TBD] 10 | 11 | ## Related tests, tasks & bugs 12 | 13 | * #N 14 | 15 | ## Description 16 | 17 | Description of the feature 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/task-event.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Event task 3 | about: New event task 4 | title: "[TASK] [TBD HTP] Event m.something" 5 | labels: task 6 | assignees: '' 7 | 8 | --- 9 | [Feature: TBD] 10 | 11 | * Event Name: `m.something` 12 | * Constant name: `MatrixType.M_SOMETHING` 13 | 14 | ## Related tests, tasks & bugs 15 | 16 | * #N 17 | 18 | ## Description 19 | 20 | Description of the feature 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/task.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Task 3 | about: New work item for feature 4 | title: "[TASK] [TBD HTP] Subject" 5 | labels: task 6 | assignees: '' 7 | 8 | --- 9 | [Feature: TBD] 10 | 11 | ## Related tests, tasks & bugs 12 | 13 | * #N 14 | 15 | ## Description 16 | 17 | Description of the work item 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/test.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Test 3 | about: Create a new test case 4 | title: "[TEST] Subject" 5 | labels: testcase 6 | assignees: '' 7 | 8 | --- 9 | [Feature: TBD] 10 | 11 | ## Initial state 12 | 13 | * [ ] User has no session on the server 14 | 15 | ## Steps 16 | 17 | 1. [ ] Step one 18 | 19 | ## End results 20 | 21 | * [ ] UI shows a thank you page 22 | 23 | ## Bugs related, if failed 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/use-case.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Use case 3 | about: Create a new use case 4 | title: "[UC] Subject" 5 | labels: usecase 6 | assignees: '' 7 | 8 | --- 9 | [Feature: TBD] 10 | 11 | ## Initial state 12 | 13 | * [ ] User has no session on the server 14 | 15 | ## Steps 16 | 17 | 1. [ ] Step one 18 | 19 | ## End results 20 | 21 | * [ ] UI shows a thank you page 22 | 23 | ## Tests related, if any 24 | 25 | ## Bugs related, if any 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # TypeScript v1 declaration files 47 | typings/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Microbundle cache 59 | .rpt2_cache/ 60 | .rts2_cache_cjs/ 61 | .rts2_cache_es/ 62 | .rts2_cache_umd/ 63 | 64 | # Optional REPL history 65 | .node_repl_history 66 | 67 | # Output of 'npm pack' 68 | *.tgz 69 | 70 | # Yarn Integrity file 71 | .yarn-integrity 72 | 73 | # dotenv environment variables file 74 | .env 75 | .env.test 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | 80 | # Next.js build output 81 | .next 82 | 83 | # Nuxt.js build / generate output 84 | .nuxt 85 | dist 86 | 87 | # Gatsby files 88 | .cache/ 89 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # public 92 | 93 | # vuepress build output 94 | .vuepress/dist 95 | 96 | # Serverless directories 97 | .serverless/ 98 | 99 | # FuseBox cache 100 | .fusebox/ 101 | 102 | # DynamoDB Local files 103 | .dynamodb/ 104 | 105 | # TernJS port file 106 | .tern-port 107 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "src/fi/hg/core"] 2 | url = git@github.com:heusalagroup/fi.hg.core.git 3 | path = src/fi/hg/core 4 | branch = main 5 | [submodule "src/fi/hg/matrix"] 6 | path = src/fi/hg/matrix 7 | url = git@github.com:heusalagroup/fi.hg.matrix.git 8 | branch = main 9 | [submodule "src/fi/hg/backend"] 10 | path = src/fi/hg/backend 11 | url = git@github.com:heusalagroup/fi.hg.backend.git 12 | branch = main 13 | [submodule "src/fi/hg/node"] 14 | path = src/fi/hg/node 15 | url = git@github.com:heusalagroup/fi.hg.node.git 16 | branch = main 17 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG NODE_IMAGE=node:20 2 | 3 | FROM $NODE_IMAGE as node-image 4 | 5 | FROM node-image 6 | 7 | ARG DEFAULT_NODE_ENV=production 8 | ARG DEFAULT_GENERATE_SOURCEMAP=false 9 | ARG DEFAULT_PUBLIC_URL=http://localhost:8008 10 | 11 | ENV PATH=/app/node_modules/.bin:$PATH 12 | ENV REACT_APP_PUBLIC_URL=$DEFAULT_PUBLIC_URL 13 | ENV NODE_ENV=$DEFAULT_NODE_ENV 14 | ENV GENERATE_SOURCEMAP=$DEFAULT_GENERATE_SOURCEMAP 15 | ENV BACKEND_LOG_LEVEL=DEBUG 16 | ENV BACKEND_URL='http://0.0.0.0:8008' 17 | ENV BACKEND_PUBLIC_URL='http://localhost:8008' 18 | ENV BACKEND_INITIAL_USERS='' 19 | ENV BACKEND_JWT_SECRET='' 20 | 21 | EXPOSE 8008 22 | EXPOSE 8448 23 | 24 | WORKDIR /app 25 | COPY ./package*.json ./ 26 | RUN [ "npm", "ci", "--silent", "--also=dev" ] 27 | COPY tsconfig.json ./tsconfig.json 28 | COPY rollup.config.js ./rollup.config.js 29 | COPY babel.config.json ./babel.config.json 30 | COPY src ./src 31 | RUN [ "npm", "run", "build" ] 32 | 33 | CMD [ "npm", "-s", "run", "start-prod" ] 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Heusala Group 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 | # @heusalagroup/hghs 2 | 3 | *HG HomeServer* ***will be*** a zero dep [Matrix.org](https://matrix.org) HomeServer 4 | written in pure TypeScript. 5 | 6 | It's intended for special use cases when Matrix protocol is used as a backbone 7 | for custom apps. For example, we use our 8 | [MatrixCrudRepository](https://github.com/heusalagroup/fi.hg.matrix/blob/main/MatrixCrudRepository.ts) 9 | as a persistent data store for our software. It's lightweight, minimal and for the moment isn't even planned to 10 | support full Matrix spec. We might make `hghs` run on browser later; the client already does. 11 | 12 | It compiles as a single standalone JavaScript file. The only runtime dependency 13 | is NodeJS. 14 | 15 | Our software is designed for scalable and fully managed serverless cloud 16 | environments, e.g. where the software must spin up fast, can run concurrently, 17 | and can be deployed without a downtime. 18 | 19 | Another intended use case for `hghs` is embedded devices (e.g. OpenWRT), for 20 | example. 21 | 22 | It will only support [a subset of Matrix.org protocol](https://github.com/heusalagroup/hghs/issues/16) 23 | that our software is using. However, we're happy to add more features for 24 | commercial clients. 25 | 26 | ### Test driven development 27 | 28 | See [@heusalagroup/hshs-test](https://github.com/heusalagroup/hghs-test) for our 29 | system tests. 30 | 31 | ### Fetching source code 32 | 33 | #### Fetching source code using SSH 34 | 35 | ```shell 36 | git clone git@github.com:heusalagroup/hghs.git hghs 37 | cd hghs 38 | git submodule update --init --recursive 39 | ``` 40 | 41 | #### Fetching source code using HTTP 42 | 43 | Our code leans heavily on git submodules configured over ssh URLs. For http 44 | access, you'll need to set up an override to use https instead: 45 | 46 | ```shell 47 | git config --global url.https://github.com/heusalagroup/.insteadOf git@github.com:heusalagroup/ 48 | ``` 49 | 50 | This will translate any use of `git@github.com:heusalagroup/REPO` to 51 | `https://github.com/heusalagroup/REPO`. 52 | 53 | This setting can be removed using: 54 | 55 | ```shell 56 | git config --unset --global url.https://github.com/heusalagroup/.insteadOf 57 | ``` 58 | 59 | ### Build docker containers 60 | 61 | This is the easiest way to use the backend. 62 | 63 | ``` 64 | docker-compose build 65 | ``` 66 | 67 | ### Start Docker environment 68 | 69 | ``` 70 | export BACKEND_JWT_SECRET='secretJwtString123' 71 | export BACKEND_INITIAL_USERS='app:p4sSw0rd123' 72 | docker-compose up 73 | ``` 74 | 75 | Once running, services will be available: 76 | 77 | * http://localhost:8008 -- `hghs` Matrix.org Server 78 | 79 | ### Start the server in development mode 80 | 81 | FIXME: This isn't working right now. Use production mode. 82 | 83 | ``` 84 | npm start 85 | ``` 86 | 87 | ### Build the server 88 | 89 | ``` 90 | npm run build 91 | ``` 92 | 93 | ### Start the server in production mode 94 | 95 | ``` 96 | npm run start-prod 97 | ``` 98 | 99 | ...and use `http://0.0.0.0:8008` 100 | -------------------------------------------------------------------------------- /babel.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["@babel/preset-env", { 4 | "targets": { 5 | "node": "8" 6 | } 7 | }] 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.1' 2 | 3 | services: 4 | 5 | hghs-backend: 6 | image: "hghs-backend" 7 | container_name: "hghs-backend" 8 | hostname: "hghs-backend" 9 | restart: "unless-stopped" 10 | build: . 11 | environment: 12 | PORT: "8008" 13 | BACKEND_LOG_LEVEL: "DEBUG" 14 | BACKEND_URL: "http://0.0.0.0:8008" 15 | BACKEND_PUBLIC_URL: "http://localhost:8008" 16 | BACKEND_INITIAL_USERS: "$BACKEND_INITIAL_USERS" 17 | BACKEND_EMAIL_CONFIG: "smtp://hghs-test-smtp:1025" 18 | BACKEND_JWT_SECRET: "$BACKEND_JWT_SECRET" 19 | ports: 20 | - "8008:8008" 21 | - "8443:8443" 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hghs", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "hghs", 9 | "version": "0.0.1", 10 | "license": "MIT", 11 | "bin": { 12 | "hghs": "dist/hghs.js" 13 | }, 14 | "devDependencies": { 15 | "@babel/cli": "^7.22.10", 16 | "@babel/core": "^7.22.10", 17 | "@babel/preset-env": "^7.22.10", 18 | "@babel/preset-typescript": "^7.22.5", 19 | "@rollup/plugin-babel": "^6.0.3", 20 | "@rollup/plugin-commonjs": "^25.0.3", 21 | "@rollup/plugin-inject": "^5.0.3", 22 | "@rollup/plugin-json": "^6.0.0", 23 | "@rollup/plugin-node-resolve": "^15.1.0", 24 | "@rollup/plugin-replace": "^5.0.2", 25 | "@rollup/plugin-typescript": "^11.1.2", 26 | "@rollup/plugin-url": "^8.0.1", 27 | "@types/i18next": "^13.0.0", 28 | "@types/jws": "^3.2.5", 29 | "@types/lodash": "^4.14.197", 30 | "@types/node": "^20.4.10", 31 | "@types/nodemailer": "^6.4.9", 32 | "i18next": "^23.4.4", 33 | "jws": "^4.0.0", 34 | "lodash": "^4.17.21", 35 | "nodemailer": "^6.9.4", 36 | "reflect-metadata": "^0.1.13", 37 | "rollup": "^3.26.3", 38 | "rollup-plugin-uglify": "github:heusalagroup/rollup-plugin-uglify", 39 | "ts-node": "^10.9.1", 40 | "tslib": "^2.6.1", 41 | "typescript": "^5.1.6" 42 | } 43 | }, 44 | "node_modules/@ampproject/remapping": { 45 | "version": "2.2.0", 46 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 47 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 48 | "dev": true, 49 | "dependencies": { 50 | "@jridgewell/gen-mapping": "^0.1.0", 51 | "@jridgewell/trace-mapping": "^0.3.9" 52 | }, 53 | "engines": { 54 | "node": ">=6.0.0" 55 | } 56 | }, 57 | "node_modules/@babel/cli": { 58 | "version": "7.22.10", 59 | "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.22.10.tgz", 60 | "integrity": "sha512-rM9ZMmaII630zGvtMtQ3P4GyHs28CHLYE9apLG7L8TgaSqcfoIGrlLSLsh4Q8kDTdZQQEXZm1M0nQtOvU/2heg==", 61 | "dev": true, 62 | "dependencies": { 63 | "@jridgewell/trace-mapping": "^0.3.17", 64 | "commander": "^4.0.1", 65 | "convert-source-map": "^1.1.0", 66 | "fs-readdir-recursive": "^1.1.0", 67 | "glob": "^7.2.0", 68 | "make-dir": "^2.1.0", 69 | "slash": "^2.0.0" 70 | }, 71 | "bin": { 72 | "babel": "bin/babel.js", 73 | "babel-external-helpers": "bin/babel-external-helpers.js" 74 | }, 75 | "engines": { 76 | "node": ">=6.9.0" 77 | }, 78 | "optionalDependencies": { 79 | "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", 80 | "chokidar": "^3.4.0" 81 | }, 82 | "peerDependencies": { 83 | "@babel/core": "^7.0.0-0" 84 | } 85 | }, 86 | "node_modules/@babel/code-frame": { 87 | "version": "7.22.10", 88 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", 89 | "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", 90 | "dev": true, 91 | "dependencies": { 92 | "@babel/highlight": "^7.22.10", 93 | "chalk": "^2.4.2" 94 | }, 95 | "engines": { 96 | "node": ">=6.9.0" 97 | } 98 | }, 99 | "node_modules/@babel/compat-data": { 100 | "version": "7.22.9", 101 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", 102 | "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", 103 | "dev": true, 104 | "engines": { 105 | "node": ">=6.9.0" 106 | } 107 | }, 108 | "node_modules/@babel/core": { 109 | "version": "7.22.10", 110 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", 111 | "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", 112 | "dev": true, 113 | "dependencies": { 114 | "@ampproject/remapping": "^2.2.0", 115 | "@babel/code-frame": "^7.22.10", 116 | "@babel/generator": "^7.22.10", 117 | "@babel/helper-compilation-targets": "^7.22.10", 118 | "@babel/helper-module-transforms": "^7.22.9", 119 | "@babel/helpers": "^7.22.10", 120 | "@babel/parser": "^7.22.10", 121 | "@babel/template": "^7.22.5", 122 | "@babel/traverse": "^7.22.10", 123 | "@babel/types": "^7.22.10", 124 | "convert-source-map": "^1.7.0", 125 | "debug": "^4.1.0", 126 | "gensync": "^1.0.0-beta.2", 127 | "json5": "^2.2.2", 128 | "semver": "^6.3.1" 129 | }, 130 | "engines": { 131 | "node": ">=6.9.0" 132 | }, 133 | "funding": { 134 | "type": "opencollective", 135 | "url": "https://opencollective.com/babel" 136 | } 137 | }, 138 | "node_modules/@babel/core/node_modules/semver": { 139 | "version": "6.3.1", 140 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 141 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 142 | "dev": true, 143 | "bin": { 144 | "semver": "bin/semver.js" 145 | } 146 | }, 147 | "node_modules/@babel/generator": { 148 | "version": "7.22.10", 149 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", 150 | "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", 151 | "dev": true, 152 | "dependencies": { 153 | "@babel/types": "^7.22.10", 154 | "@jridgewell/gen-mapping": "^0.3.2", 155 | "@jridgewell/trace-mapping": "^0.3.17", 156 | "jsesc": "^2.5.1" 157 | }, 158 | "engines": { 159 | "node": ">=6.9.0" 160 | } 161 | }, 162 | "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { 163 | "version": "0.3.3", 164 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 165 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 166 | "dev": true, 167 | "dependencies": { 168 | "@jridgewell/set-array": "^1.0.1", 169 | "@jridgewell/sourcemap-codec": "^1.4.10", 170 | "@jridgewell/trace-mapping": "^0.3.9" 171 | }, 172 | "engines": { 173 | "node": ">=6.0.0" 174 | } 175 | }, 176 | "node_modules/@babel/helper-annotate-as-pure": { 177 | "version": "7.22.5", 178 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", 179 | "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", 180 | "dev": true, 181 | "dependencies": { 182 | "@babel/types": "^7.22.5" 183 | }, 184 | "engines": { 185 | "node": ">=6.9.0" 186 | } 187 | }, 188 | "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { 189 | "version": "7.22.5", 190 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", 191 | "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", 192 | "dev": true, 193 | "dependencies": { 194 | "@babel/types": "^7.22.5" 195 | }, 196 | "engines": { 197 | "node": ">=6.9.0" 198 | } 199 | }, 200 | "node_modules/@babel/helper-compilation-targets": { 201 | "version": "7.22.10", 202 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", 203 | "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", 204 | "dev": true, 205 | "dependencies": { 206 | "@babel/compat-data": "^7.22.9", 207 | "@babel/helper-validator-option": "^7.22.5", 208 | "browserslist": "^4.21.9", 209 | "lru-cache": "^5.1.1", 210 | "semver": "^6.3.1" 211 | }, 212 | "engines": { 213 | "node": ">=6.9.0" 214 | } 215 | }, 216 | "node_modules/@babel/helper-compilation-targets/node_modules/semver": { 217 | "version": "6.3.1", 218 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 219 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 220 | "dev": true, 221 | "bin": { 222 | "semver": "bin/semver.js" 223 | } 224 | }, 225 | "node_modules/@babel/helper-create-class-features-plugin": { 226 | "version": "7.22.9", 227 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", 228 | "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", 229 | "dev": true, 230 | "dependencies": { 231 | "@babel/helper-annotate-as-pure": "^7.22.5", 232 | "@babel/helper-environment-visitor": "^7.22.5", 233 | "@babel/helper-function-name": "^7.22.5", 234 | "@babel/helper-member-expression-to-functions": "^7.22.5", 235 | "@babel/helper-optimise-call-expression": "^7.22.5", 236 | "@babel/helper-replace-supers": "^7.22.9", 237 | "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", 238 | "@babel/helper-split-export-declaration": "^7.22.6", 239 | "semver": "^6.3.1" 240 | }, 241 | "engines": { 242 | "node": ">=6.9.0" 243 | }, 244 | "peerDependencies": { 245 | "@babel/core": "^7.0.0" 246 | } 247 | }, 248 | "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { 249 | "version": "6.3.1", 250 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 251 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 252 | "dev": true, 253 | "bin": { 254 | "semver": "bin/semver.js" 255 | } 256 | }, 257 | "node_modules/@babel/helper-create-regexp-features-plugin": { 258 | "version": "7.22.9", 259 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", 260 | "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", 261 | "dev": true, 262 | "dependencies": { 263 | "@babel/helper-annotate-as-pure": "^7.22.5", 264 | "regexpu-core": "^5.3.1", 265 | "semver": "^6.3.1" 266 | }, 267 | "engines": { 268 | "node": ">=6.9.0" 269 | }, 270 | "peerDependencies": { 271 | "@babel/core": "^7.0.0" 272 | } 273 | }, 274 | "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { 275 | "version": "6.3.1", 276 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 277 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 278 | "dev": true, 279 | "bin": { 280 | "semver": "bin/semver.js" 281 | } 282 | }, 283 | "node_modules/@babel/helper-define-polyfill-provider": { 284 | "version": "0.4.2", 285 | "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", 286 | "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", 287 | "dev": true, 288 | "dependencies": { 289 | "@babel/helper-compilation-targets": "^7.22.6", 290 | "@babel/helper-plugin-utils": "^7.22.5", 291 | "debug": "^4.1.1", 292 | "lodash.debounce": "^4.0.8", 293 | "resolve": "^1.14.2" 294 | }, 295 | "peerDependencies": { 296 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 297 | } 298 | }, 299 | "node_modules/@babel/helper-environment-visitor": { 300 | "version": "7.22.5", 301 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", 302 | "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", 303 | "dev": true, 304 | "engines": { 305 | "node": ">=6.9.0" 306 | } 307 | }, 308 | "node_modules/@babel/helper-function-name": { 309 | "version": "7.22.5", 310 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", 311 | "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", 312 | "dev": true, 313 | "dependencies": { 314 | "@babel/template": "^7.22.5", 315 | "@babel/types": "^7.22.5" 316 | }, 317 | "engines": { 318 | "node": ">=6.9.0" 319 | } 320 | }, 321 | "node_modules/@babel/helper-hoist-variables": { 322 | "version": "7.22.5", 323 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", 324 | "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", 325 | "dev": true, 326 | "dependencies": { 327 | "@babel/types": "^7.22.5" 328 | }, 329 | "engines": { 330 | "node": ">=6.9.0" 331 | } 332 | }, 333 | "node_modules/@babel/helper-member-expression-to-functions": { 334 | "version": "7.22.5", 335 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", 336 | "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", 337 | "dev": true, 338 | "dependencies": { 339 | "@babel/types": "^7.22.5" 340 | }, 341 | "engines": { 342 | "node": ">=6.9.0" 343 | } 344 | }, 345 | "node_modules/@babel/helper-module-imports": { 346 | "version": "7.22.5", 347 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", 348 | "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", 349 | "dev": true, 350 | "dependencies": { 351 | "@babel/types": "^7.22.5" 352 | }, 353 | "engines": { 354 | "node": ">=6.9.0" 355 | } 356 | }, 357 | "node_modules/@babel/helper-module-transforms": { 358 | "version": "7.22.9", 359 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", 360 | "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", 361 | "dev": true, 362 | "dependencies": { 363 | "@babel/helper-environment-visitor": "^7.22.5", 364 | "@babel/helper-module-imports": "^7.22.5", 365 | "@babel/helper-simple-access": "^7.22.5", 366 | "@babel/helper-split-export-declaration": "^7.22.6", 367 | "@babel/helper-validator-identifier": "^7.22.5" 368 | }, 369 | "engines": { 370 | "node": ">=6.9.0" 371 | }, 372 | "peerDependencies": { 373 | "@babel/core": "^7.0.0" 374 | } 375 | }, 376 | "node_modules/@babel/helper-optimise-call-expression": { 377 | "version": "7.22.5", 378 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", 379 | "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", 380 | "dev": true, 381 | "dependencies": { 382 | "@babel/types": "^7.22.5" 383 | }, 384 | "engines": { 385 | "node": ">=6.9.0" 386 | } 387 | }, 388 | "node_modules/@babel/helper-plugin-utils": { 389 | "version": "7.22.5", 390 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", 391 | "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", 392 | "dev": true, 393 | "engines": { 394 | "node": ">=6.9.0" 395 | } 396 | }, 397 | "node_modules/@babel/helper-remap-async-to-generator": { 398 | "version": "7.22.9", 399 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", 400 | "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", 401 | "dev": true, 402 | "dependencies": { 403 | "@babel/helper-annotate-as-pure": "^7.22.5", 404 | "@babel/helper-environment-visitor": "^7.22.5", 405 | "@babel/helper-wrap-function": "^7.22.9" 406 | }, 407 | "engines": { 408 | "node": ">=6.9.0" 409 | }, 410 | "peerDependencies": { 411 | "@babel/core": "^7.0.0" 412 | } 413 | }, 414 | "node_modules/@babel/helper-replace-supers": { 415 | "version": "7.22.9", 416 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", 417 | "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", 418 | "dev": true, 419 | "dependencies": { 420 | "@babel/helper-environment-visitor": "^7.22.5", 421 | "@babel/helper-member-expression-to-functions": "^7.22.5", 422 | "@babel/helper-optimise-call-expression": "^7.22.5" 423 | }, 424 | "engines": { 425 | "node": ">=6.9.0" 426 | }, 427 | "peerDependencies": { 428 | "@babel/core": "^7.0.0" 429 | } 430 | }, 431 | "node_modules/@babel/helper-simple-access": { 432 | "version": "7.22.5", 433 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", 434 | "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", 435 | "dev": true, 436 | "dependencies": { 437 | "@babel/types": "^7.22.5" 438 | }, 439 | "engines": { 440 | "node": ">=6.9.0" 441 | } 442 | }, 443 | "node_modules/@babel/helper-skip-transparent-expression-wrappers": { 444 | "version": "7.22.5", 445 | "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", 446 | "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", 447 | "dev": true, 448 | "dependencies": { 449 | "@babel/types": "^7.22.5" 450 | }, 451 | "engines": { 452 | "node": ">=6.9.0" 453 | } 454 | }, 455 | "node_modules/@babel/helper-split-export-declaration": { 456 | "version": "7.22.6", 457 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", 458 | "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", 459 | "dev": true, 460 | "dependencies": { 461 | "@babel/types": "^7.22.5" 462 | }, 463 | "engines": { 464 | "node": ">=6.9.0" 465 | } 466 | }, 467 | "node_modules/@babel/helper-string-parser": { 468 | "version": "7.22.5", 469 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", 470 | "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", 471 | "dev": true, 472 | "engines": { 473 | "node": ">=6.9.0" 474 | } 475 | }, 476 | "node_modules/@babel/helper-validator-identifier": { 477 | "version": "7.22.5", 478 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", 479 | "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", 480 | "dev": true, 481 | "engines": { 482 | "node": ">=6.9.0" 483 | } 484 | }, 485 | "node_modules/@babel/helper-validator-option": { 486 | "version": "7.22.5", 487 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", 488 | "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", 489 | "dev": true, 490 | "engines": { 491 | "node": ">=6.9.0" 492 | } 493 | }, 494 | "node_modules/@babel/helper-wrap-function": { 495 | "version": "7.22.9", 496 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", 497 | "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", 498 | "dev": true, 499 | "dependencies": { 500 | "@babel/helper-function-name": "^7.22.5", 501 | "@babel/template": "^7.22.5", 502 | "@babel/types": "^7.22.5" 503 | }, 504 | "engines": { 505 | "node": ">=6.9.0" 506 | } 507 | }, 508 | "node_modules/@babel/helpers": { 509 | "version": "7.22.10", 510 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", 511 | "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", 512 | "dev": true, 513 | "dependencies": { 514 | "@babel/template": "^7.22.5", 515 | "@babel/traverse": "^7.22.10", 516 | "@babel/types": "^7.22.10" 517 | }, 518 | "engines": { 519 | "node": ">=6.9.0" 520 | } 521 | }, 522 | "node_modules/@babel/highlight": { 523 | "version": "7.22.10", 524 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", 525 | "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", 526 | "dev": true, 527 | "dependencies": { 528 | "@babel/helper-validator-identifier": "^7.22.5", 529 | "chalk": "^2.4.2", 530 | "js-tokens": "^4.0.0" 531 | }, 532 | "engines": { 533 | "node": ">=6.9.0" 534 | } 535 | }, 536 | "node_modules/@babel/parser": { 537 | "version": "7.22.10", 538 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", 539 | "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", 540 | "dev": true, 541 | "bin": { 542 | "parser": "bin/babel-parser.js" 543 | }, 544 | "engines": { 545 | "node": ">=6.0.0" 546 | } 547 | }, 548 | "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { 549 | "version": "7.22.5", 550 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", 551 | "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", 552 | "dev": true, 553 | "dependencies": { 554 | "@babel/helper-plugin-utils": "^7.22.5" 555 | }, 556 | "engines": { 557 | "node": ">=6.9.0" 558 | }, 559 | "peerDependencies": { 560 | "@babel/core": "^7.0.0" 561 | } 562 | }, 563 | "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { 564 | "version": "7.22.5", 565 | "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", 566 | "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", 567 | "dev": true, 568 | "dependencies": { 569 | "@babel/helper-plugin-utils": "^7.22.5", 570 | "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", 571 | "@babel/plugin-transform-optional-chaining": "^7.22.5" 572 | }, 573 | "engines": { 574 | "node": ">=6.9.0" 575 | }, 576 | "peerDependencies": { 577 | "@babel/core": "^7.13.0" 578 | } 579 | }, 580 | "node_modules/@babel/plugin-proposal-private-property-in-object": { 581 | "version": "7.21.0-placeholder-for-preset-env.2", 582 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", 583 | "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", 584 | "dev": true, 585 | "engines": { 586 | "node": ">=6.9.0" 587 | }, 588 | "peerDependencies": { 589 | "@babel/core": "^7.0.0-0" 590 | } 591 | }, 592 | "node_modules/@babel/plugin-syntax-async-generators": { 593 | "version": "7.8.4", 594 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 595 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 596 | "dev": true, 597 | "dependencies": { 598 | "@babel/helper-plugin-utils": "^7.8.0" 599 | }, 600 | "peerDependencies": { 601 | "@babel/core": "^7.0.0-0" 602 | } 603 | }, 604 | "node_modules/@babel/plugin-syntax-class-properties": { 605 | "version": "7.12.13", 606 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 607 | "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 608 | "dev": true, 609 | "dependencies": { 610 | "@babel/helper-plugin-utils": "^7.12.13" 611 | }, 612 | "peerDependencies": { 613 | "@babel/core": "^7.0.0-0" 614 | } 615 | }, 616 | "node_modules/@babel/plugin-syntax-class-static-block": { 617 | "version": "7.14.5", 618 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", 619 | "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", 620 | "dev": true, 621 | "dependencies": { 622 | "@babel/helper-plugin-utils": "^7.14.5" 623 | }, 624 | "engines": { 625 | "node": ">=6.9.0" 626 | }, 627 | "peerDependencies": { 628 | "@babel/core": "^7.0.0-0" 629 | } 630 | }, 631 | "node_modules/@babel/plugin-syntax-dynamic-import": { 632 | "version": "7.8.3", 633 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 634 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 635 | "dev": true, 636 | "dependencies": { 637 | "@babel/helper-plugin-utils": "^7.8.0" 638 | }, 639 | "peerDependencies": { 640 | "@babel/core": "^7.0.0-0" 641 | } 642 | }, 643 | "node_modules/@babel/plugin-syntax-export-namespace-from": { 644 | "version": "7.8.3", 645 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", 646 | "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", 647 | "dev": true, 648 | "dependencies": { 649 | "@babel/helper-plugin-utils": "^7.8.3" 650 | }, 651 | "peerDependencies": { 652 | "@babel/core": "^7.0.0-0" 653 | } 654 | }, 655 | "node_modules/@babel/plugin-syntax-import-assertions": { 656 | "version": "7.22.5", 657 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", 658 | "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", 659 | "dev": true, 660 | "dependencies": { 661 | "@babel/helper-plugin-utils": "^7.22.5" 662 | }, 663 | "engines": { 664 | "node": ">=6.9.0" 665 | }, 666 | "peerDependencies": { 667 | "@babel/core": "^7.0.0-0" 668 | } 669 | }, 670 | "node_modules/@babel/plugin-syntax-import-attributes": { 671 | "version": "7.22.5", 672 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", 673 | "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", 674 | "dev": true, 675 | "dependencies": { 676 | "@babel/helper-plugin-utils": "^7.22.5" 677 | }, 678 | "engines": { 679 | "node": ">=6.9.0" 680 | }, 681 | "peerDependencies": { 682 | "@babel/core": "^7.0.0-0" 683 | } 684 | }, 685 | "node_modules/@babel/plugin-syntax-import-meta": { 686 | "version": "7.10.4", 687 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", 688 | "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", 689 | "dev": true, 690 | "dependencies": { 691 | "@babel/helper-plugin-utils": "^7.10.4" 692 | }, 693 | "peerDependencies": { 694 | "@babel/core": "^7.0.0-0" 695 | } 696 | }, 697 | "node_modules/@babel/plugin-syntax-json-strings": { 698 | "version": "7.8.3", 699 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 700 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 701 | "dev": true, 702 | "dependencies": { 703 | "@babel/helper-plugin-utils": "^7.8.0" 704 | }, 705 | "peerDependencies": { 706 | "@babel/core": "^7.0.0-0" 707 | } 708 | }, 709 | "node_modules/@babel/plugin-syntax-jsx": { 710 | "version": "7.22.5", 711 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", 712 | "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", 713 | "dev": true, 714 | "dependencies": { 715 | "@babel/helper-plugin-utils": "^7.22.5" 716 | }, 717 | "engines": { 718 | "node": ">=6.9.0" 719 | }, 720 | "peerDependencies": { 721 | "@babel/core": "^7.0.0-0" 722 | } 723 | }, 724 | "node_modules/@babel/plugin-syntax-logical-assignment-operators": { 725 | "version": "7.10.4", 726 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 727 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 728 | "dev": true, 729 | "dependencies": { 730 | "@babel/helper-plugin-utils": "^7.10.4" 731 | }, 732 | "peerDependencies": { 733 | "@babel/core": "^7.0.0-0" 734 | } 735 | }, 736 | "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { 737 | "version": "7.8.3", 738 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 739 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 740 | "dev": true, 741 | "dependencies": { 742 | "@babel/helper-plugin-utils": "^7.8.0" 743 | }, 744 | "peerDependencies": { 745 | "@babel/core": "^7.0.0-0" 746 | } 747 | }, 748 | "node_modules/@babel/plugin-syntax-numeric-separator": { 749 | "version": "7.10.4", 750 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 751 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 752 | "dev": true, 753 | "dependencies": { 754 | "@babel/helper-plugin-utils": "^7.10.4" 755 | }, 756 | "peerDependencies": { 757 | "@babel/core": "^7.0.0-0" 758 | } 759 | }, 760 | "node_modules/@babel/plugin-syntax-object-rest-spread": { 761 | "version": "7.8.3", 762 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 763 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 764 | "dev": true, 765 | "dependencies": { 766 | "@babel/helper-plugin-utils": "^7.8.0" 767 | }, 768 | "peerDependencies": { 769 | "@babel/core": "^7.0.0-0" 770 | } 771 | }, 772 | "node_modules/@babel/plugin-syntax-optional-catch-binding": { 773 | "version": "7.8.3", 774 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 775 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 776 | "dev": true, 777 | "dependencies": { 778 | "@babel/helper-plugin-utils": "^7.8.0" 779 | }, 780 | "peerDependencies": { 781 | "@babel/core": "^7.0.0-0" 782 | } 783 | }, 784 | "node_modules/@babel/plugin-syntax-optional-chaining": { 785 | "version": "7.8.3", 786 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 787 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 788 | "dev": true, 789 | "dependencies": { 790 | "@babel/helper-plugin-utils": "^7.8.0" 791 | }, 792 | "peerDependencies": { 793 | "@babel/core": "^7.0.0-0" 794 | } 795 | }, 796 | "node_modules/@babel/plugin-syntax-private-property-in-object": { 797 | "version": "7.14.5", 798 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", 799 | "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", 800 | "dev": true, 801 | "dependencies": { 802 | "@babel/helper-plugin-utils": "^7.14.5" 803 | }, 804 | "engines": { 805 | "node": ">=6.9.0" 806 | }, 807 | "peerDependencies": { 808 | "@babel/core": "^7.0.0-0" 809 | } 810 | }, 811 | "node_modules/@babel/plugin-syntax-top-level-await": { 812 | "version": "7.14.5", 813 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", 814 | "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", 815 | "dev": true, 816 | "dependencies": { 817 | "@babel/helper-plugin-utils": "^7.14.5" 818 | }, 819 | "engines": { 820 | "node": ">=6.9.0" 821 | }, 822 | "peerDependencies": { 823 | "@babel/core": "^7.0.0-0" 824 | } 825 | }, 826 | "node_modules/@babel/plugin-syntax-typescript": { 827 | "version": "7.22.5", 828 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", 829 | "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", 830 | "dev": true, 831 | "dependencies": { 832 | "@babel/helper-plugin-utils": "^7.22.5" 833 | }, 834 | "engines": { 835 | "node": ">=6.9.0" 836 | }, 837 | "peerDependencies": { 838 | "@babel/core": "^7.0.0-0" 839 | } 840 | }, 841 | "node_modules/@babel/plugin-syntax-unicode-sets-regex": { 842 | "version": "7.18.6", 843 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", 844 | "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", 845 | "dev": true, 846 | "dependencies": { 847 | "@babel/helper-create-regexp-features-plugin": "^7.18.6", 848 | "@babel/helper-plugin-utils": "^7.18.6" 849 | }, 850 | "engines": { 851 | "node": ">=6.9.0" 852 | }, 853 | "peerDependencies": { 854 | "@babel/core": "^7.0.0" 855 | } 856 | }, 857 | "node_modules/@babel/plugin-transform-arrow-functions": { 858 | "version": "7.22.5", 859 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", 860 | "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", 861 | "dev": true, 862 | "dependencies": { 863 | "@babel/helper-plugin-utils": "^7.22.5" 864 | }, 865 | "engines": { 866 | "node": ">=6.9.0" 867 | }, 868 | "peerDependencies": { 869 | "@babel/core": "^7.0.0-0" 870 | } 871 | }, 872 | "node_modules/@babel/plugin-transform-async-generator-functions": { 873 | "version": "7.22.10", 874 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", 875 | "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", 876 | "dev": true, 877 | "dependencies": { 878 | "@babel/helper-environment-visitor": "^7.22.5", 879 | "@babel/helper-plugin-utils": "^7.22.5", 880 | "@babel/helper-remap-async-to-generator": "^7.22.9", 881 | "@babel/plugin-syntax-async-generators": "^7.8.4" 882 | }, 883 | "engines": { 884 | "node": ">=6.9.0" 885 | }, 886 | "peerDependencies": { 887 | "@babel/core": "^7.0.0-0" 888 | } 889 | }, 890 | "node_modules/@babel/plugin-transform-async-to-generator": { 891 | "version": "7.22.5", 892 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", 893 | "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", 894 | "dev": true, 895 | "dependencies": { 896 | "@babel/helper-module-imports": "^7.22.5", 897 | "@babel/helper-plugin-utils": "^7.22.5", 898 | "@babel/helper-remap-async-to-generator": "^7.22.5" 899 | }, 900 | "engines": { 901 | "node": ">=6.9.0" 902 | }, 903 | "peerDependencies": { 904 | "@babel/core": "^7.0.0-0" 905 | } 906 | }, 907 | "node_modules/@babel/plugin-transform-block-scoped-functions": { 908 | "version": "7.22.5", 909 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", 910 | "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", 911 | "dev": true, 912 | "dependencies": { 913 | "@babel/helper-plugin-utils": "^7.22.5" 914 | }, 915 | "engines": { 916 | "node": ">=6.9.0" 917 | }, 918 | "peerDependencies": { 919 | "@babel/core": "^7.0.0-0" 920 | } 921 | }, 922 | "node_modules/@babel/plugin-transform-block-scoping": { 923 | "version": "7.22.10", 924 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", 925 | "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", 926 | "dev": true, 927 | "dependencies": { 928 | "@babel/helper-plugin-utils": "^7.22.5" 929 | }, 930 | "engines": { 931 | "node": ">=6.9.0" 932 | }, 933 | "peerDependencies": { 934 | "@babel/core": "^7.0.0-0" 935 | } 936 | }, 937 | "node_modules/@babel/plugin-transform-class-properties": { 938 | "version": "7.22.5", 939 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", 940 | "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", 941 | "dev": true, 942 | "dependencies": { 943 | "@babel/helper-create-class-features-plugin": "^7.22.5", 944 | "@babel/helper-plugin-utils": "^7.22.5" 945 | }, 946 | "engines": { 947 | "node": ">=6.9.0" 948 | }, 949 | "peerDependencies": { 950 | "@babel/core": "^7.0.0-0" 951 | } 952 | }, 953 | "node_modules/@babel/plugin-transform-class-static-block": { 954 | "version": "7.22.5", 955 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", 956 | "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", 957 | "dev": true, 958 | "dependencies": { 959 | "@babel/helper-create-class-features-plugin": "^7.22.5", 960 | "@babel/helper-plugin-utils": "^7.22.5", 961 | "@babel/plugin-syntax-class-static-block": "^7.14.5" 962 | }, 963 | "engines": { 964 | "node": ">=6.9.0" 965 | }, 966 | "peerDependencies": { 967 | "@babel/core": "^7.12.0" 968 | } 969 | }, 970 | "node_modules/@babel/plugin-transform-classes": { 971 | "version": "7.22.6", 972 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", 973 | "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", 974 | "dev": true, 975 | "dependencies": { 976 | "@babel/helper-annotate-as-pure": "^7.22.5", 977 | "@babel/helper-compilation-targets": "^7.22.6", 978 | "@babel/helper-environment-visitor": "^7.22.5", 979 | "@babel/helper-function-name": "^7.22.5", 980 | "@babel/helper-optimise-call-expression": "^7.22.5", 981 | "@babel/helper-plugin-utils": "^7.22.5", 982 | "@babel/helper-replace-supers": "^7.22.5", 983 | "@babel/helper-split-export-declaration": "^7.22.6", 984 | "globals": "^11.1.0" 985 | }, 986 | "engines": { 987 | "node": ">=6.9.0" 988 | }, 989 | "peerDependencies": { 990 | "@babel/core": "^7.0.0-0" 991 | } 992 | }, 993 | "node_modules/@babel/plugin-transform-computed-properties": { 994 | "version": "7.22.5", 995 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", 996 | "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", 997 | "dev": true, 998 | "dependencies": { 999 | "@babel/helper-plugin-utils": "^7.22.5", 1000 | "@babel/template": "^7.22.5" 1001 | }, 1002 | "engines": { 1003 | "node": ">=6.9.0" 1004 | }, 1005 | "peerDependencies": { 1006 | "@babel/core": "^7.0.0-0" 1007 | } 1008 | }, 1009 | "node_modules/@babel/plugin-transform-destructuring": { 1010 | "version": "7.22.10", 1011 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", 1012 | "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", 1013 | "dev": true, 1014 | "dependencies": { 1015 | "@babel/helper-plugin-utils": "^7.22.5" 1016 | }, 1017 | "engines": { 1018 | "node": ">=6.9.0" 1019 | }, 1020 | "peerDependencies": { 1021 | "@babel/core": "^7.0.0-0" 1022 | } 1023 | }, 1024 | "node_modules/@babel/plugin-transform-dotall-regex": { 1025 | "version": "7.22.5", 1026 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", 1027 | "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", 1028 | "dev": true, 1029 | "dependencies": { 1030 | "@babel/helper-create-regexp-features-plugin": "^7.22.5", 1031 | "@babel/helper-plugin-utils": "^7.22.5" 1032 | }, 1033 | "engines": { 1034 | "node": ">=6.9.0" 1035 | }, 1036 | "peerDependencies": { 1037 | "@babel/core": "^7.0.0-0" 1038 | } 1039 | }, 1040 | "node_modules/@babel/plugin-transform-duplicate-keys": { 1041 | "version": "7.22.5", 1042 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", 1043 | "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", 1044 | "dev": true, 1045 | "dependencies": { 1046 | "@babel/helper-plugin-utils": "^7.22.5" 1047 | }, 1048 | "engines": { 1049 | "node": ">=6.9.0" 1050 | }, 1051 | "peerDependencies": { 1052 | "@babel/core": "^7.0.0-0" 1053 | } 1054 | }, 1055 | "node_modules/@babel/plugin-transform-dynamic-import": { 1056 | "version": "7.22.5", 1057 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", 1058 | "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", 1059 | "dev": true, 1060 | "dependencies": { 1061 | "@babel/helper-plugin-utils": "^7.22.5", 1062 | "@babel/plugin-syntax-dynamic-import": "^7.8.3" 1063 | }, 1064 | "engines": { 1065 | "node": ">=6.9.0" 1066 | }, 1067 | "peerDependencies": { 1068 | "@babel/core": "^7.0.0-0" 1069 | } 1070 | }, 1071 | "node_modules/@babel/plugin-transform-exponentiation-operator": { 1072 | "version": "7.22.5", 1073 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", 1074 | "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", 1075 | "dev": true, 1076 | "dependencies": { 1077 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", 1078 | "@babel/helper-plugin-utils": "^7.22.5" 1079 | }, 1080 | "engines": { 1081 | "node": ">=6.9.0" 1082 | }, 1083 | "peerDependencies": { 1084 | "@babel/core": "^7.0.0-0" 1085 | } 1086 | }, 1087 | "node_modules/@babel/plugin-transform-export-namespace-from": { 1088 | "version": "7.22.5", 1089 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", 1090 | "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", 1091 | "dev": true, 1092 | "dependencies": { 1093 | "@babel/helper-plugin-utils": "^7.22.5", 1094 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3" 1095 | }, 1096 | "engines": { 1097 | "node": ">=6.9.0" 1098 | }, 1099 | "peerDependencies": { 1100 | "@babel/core": "^7.0.0-0" 1101 | } 1102 | }, 1103 | "node_modules/@babel/plugin-transform-for-of": { 1104 | "version": "7.22.5", 1105 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", 1106 | "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", 1107 | "dev": true, 1108 | "dependencies": { 1109 | "@babel/helper-plugin-utils": "^7.22.5" 1110 | }, 1111 | "engines": { 1112 | "node": ">=6.9.0" 1113 | }, 1114 | "peerDependencies": { 1115 | "@babel/core": "^7.0.0-0" 1116 | } 1117 | }, 1118 | "node_modules/@babel/plugin-transform-function-name": { 1119 | "version": "7.22.5", 1120 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", 1121 | "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", 1122 | "dev": true, 1123 | "dependencies": { 1124 | "@babel/helper-compilation-targets": "^7.22.5", 1125 | "@babel/helper-function-name": "^7.22.5", 1126 | "@babel/helper-plugin-utils": "^7.22.5" 1127 | }, 1128 | "engines": { 1129 | "node": ">=6.9.0" 1130 | }, 1131 | "peerDependencies": { 1132 | "@babel/core": "^7.0.0-0" 1133 | } 1134 | }, 1135 | "node_modules/@babel/plugin-transform-json-strings": { 1136 | "version": "7.22.5", 1137 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", 1138 | "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", 1139 | "dev": true, 1140 | "dependencies": { 1141 | "@babel/helper-plugin-utils": "^7.22.5", 1142 | "@babel/plugin-syntax-json-strings": "^7.8.3" 1143 | }, 1144 | "engines": { 1145 | "node": ">=6.9.0" 1146 | }, 1147 | "peerDependencies": { 1148 | "@babel/core": "^7.0.0-0" 1149 | } 1150 | }, 1151 | "node_modules/@babel/plugin-transform-literals": { 1152 | "version": "7.22.5", 1153 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", 1154 | "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", 1155 | "dev": true, 1156 | "dependencies": { 1157 | "@babel/helper-plugin-utils": "^7.22.5" 1158 | }, 1159 | "engines": { 1160 | "node": ">=6.9.0" 1161 | }, 1162 | "peerDependencies": { 1163 | "@babel/core": "^7.0.0-0" 1164 | } 1165 | }, 1166 | "node_modules/@babel/plugin-transform-logical-assignment-operators": { 1167 | "version": "7.22.5", 1168 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", 1169 | "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", 1170 | "dev": true, 1171 | "dependencies": { 1172 | "@babel/helper-plugin-utils": "^7.22.5", 1173 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" 1174 | }, 1175 | "engines": { 1176 | "node": ">=6.9.0" 1177 | }, 1178 | "peerDependencies": { 1179 | "@babel/core": "^7.0.0-0" 1180 | } 1181 | }, 1182 | "node_modules/@babel/plugin-transform-member-expression-literals": { 1183 | "version": "7.22.5", 1184 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", 1185 | "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", 1186 | "dev": true, 1187 | "dependencies": { 1188 | "@babel/helper-plugin-utils": "^7.22.5" 1189 | }, 1190 | "engines": { 1191 | "node": ">=6.9.0" 1192 | }, 1193 | "peerDependencies": { 1194 | "@babel/core": "^7.0.0-0" 1195 | } 1196 | }, 1197 | "node_modules/@babel/plugin-transform-modules-amd": { 1198 | "version": "7.22.5", 1199 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", 1200 | "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", 1201 | "dev": true, 1202 | "dependencies": { 1203 | "@babel/helper-module-transforms": "^7.22.5", 1204 | "@babel/helper-plugin-utils": "^7.22.5" 1205 | }, 1206 | "engines": { 1207 | "node": ">=6.9.0" 1208 | }, 1209 | "peerDependencies": { 1210 | "@babel/core": "^7.0.0-0" 1211 | } 1212 | }, 1213 | "node_modules/@babel/plugin-transform-modules-commonjs": { 1214 | "version": "7.22.5", 1215 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", 1216 | "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", 1217 | "dev": true, 1218 | "dependencies": { 1219 | "@babel/helper-module-transforms": "^7.22.5", 1220 | "@babel/helper-plugin-utils": "^7.22.5", 1221 | "@babel/helper-simple-access": "^7.22.5" 1222 | }, 1223 | "engines": { 1224 | "node": ">=6.9.0" 1225 | }, 1226 | "peerDependencies": { 1227 | "@babel/core": "^7.0.0-0" 1228 | } 1229 | }, 1230 | "node_modules/@babel/plugin-transform-modules-systemjs": { 1231 | "version": "7.22.5", 1232 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", 1233 | "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", 1234 | "dev": true, 1235 | "dependencies": { 1236 | "@babel/helper-hoist-variables": "^7.22.5", 1237 | "@babel/helper-module-transforms": "^7.22.5", 1238 | "@babel/helper-plugin-utils": "^7.22.5", 1239 | "@babel/helper-validator-identifier": "^7.22.5" 1240 | }, 1241 | "engines": { 1242 | "node": ">=6.9.0" 1243 | }, 1244 | "peerDependencies": { 1245 | "@babel/core": "^7.0.0-0" 1246 | } 1247 | }, 1248 | "node_modules/@babel/plugin-transform-modules-umd": { 1249 | "version": "7.22.5", 1250 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", 1251 | "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", 1252 | "dev": true, 1253 | "dependencies": { 1254 | "@babel/helper-module-transforms": "^7.22.5", 1255 | "@babel/helper-plugin-utils": "^7.22.5" 1256 | }, 1257 | "engines": { 1258 | "node": ">=6.9.0" 1259 | }, 1260 | "peerDependencies": { 1261 | "@babel/core": "^7.0.0-0" 1262 | } 1263 | }, 1264 | "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { 1265 | "version": "7.22.5", 1266 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", 1267 | "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", 1268 | "dev": true, 1269 | "dependencies": { 1270 | "@babel/helper-create-regexp-features-plugin": "^7.22.5", 1271 | "@babel/helper-plugin-utils": "^7.22.5" 1272 | }, 1273 | "engines": { 1274 | "node": ">=6.9.0" 1275 | }, 1276 | "peerDependencies": { 1277 | "@babel/core": "^7.0.0" 1278 | } 1279 | }, 1280 | "node_modules/@babel/plugin-transform-new-target": { 1281 | "version": "7.22.5", 1282 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", 1283 | "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", 1284 | "dev": true, 1285 | "dependencies": { 1286 | "@babel/helper-plugin-utils": "^7.22.5" 1287 | }, 1288 | "engines": { 1289 | "node": ">=6.9.0" 1290 | }, 1291 | "peerDependencies": { 1292 | "@babel/core": "^7.0.0-0" 1293 | } 1294 | }, 1295 | "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { 1296 | "version": "7.22.5", 1297 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", 1298 | "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", 1299 | "dev": true, 1300 | "dependencies": { 1301 | "@babel/helper-plugin-utils": "^7.22.5", 1302 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" 1303 | }, 1304 | "engines": { 1305 | "node": ">=6.9.0" 1306 | }, 1307 | "peerDependencies": { 1308 | "@babel/core": "^7.0.0-0" 1309 | } 1310 | }, 1311 | "node_modules/@babel/plugin-transform-numeric-separator": { 1312 | "version": "7.22.5", 1313 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", 1314 | "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", 1315 | "dev": true, 1316 | "dependencies": { 1317 | "@babel/helper-plugin-utils": "^7.22.5", 1318 | "@babel/plugin-syntax-numeric-separator": "^7.10.4" 1319 | }, 1320 | "engines": { 1321 | "node": ">=6.9.0" 1322 | }, 1323 | "peerDependencies": { 1324 | "@babel/core": "^7.0.0-0" 1325 | } 1326 | }, 1327 | "node_modules/@babel/plugin-transform-object-rest-spread": { 1328 | "version": "7.22.5", 1329 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", 1330 | "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", 1331 | "dev": true, 1332 | "dependencies": { 1333 | "@babel/compat-data": "^7.22.5", 1334 | "@babel/helper-compilation-targets": "^7.22.5", 1335 | "@babel/helper-plugin-utils": "^7.22.5", 1336 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1337 | "@babel/plugin-transform-parameters": "^7.22.5" 1338 | }, 1339 | "engines": { 1340 | "node": ">=6.9.0" 1341 | }, 1342 | "peerDependencies": { 1343 | "@babel/core": "^7.0.0-0" 1344 | } 1345 | }, 1346 | "node_modules/@babel/plugin-transform-object-super": { 1347 | "version": "7.22.5", 1348 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", 1349 | "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", 1350 | "dev": true, 1351 | "dependencies": { 1352 | "@babel/helper-plugin-utils": "^7.22.5", 1353 | "@babel/helper-replace-supers": "^7.22.5" 1354 | }, 1355 | "engines": { 1356 | "node": ">=6.9.0" 1357 | }, 1358 | "peerDependencies": { 1359 | "@babel/core": "^7.0.0-0" 1360 | } 1361 | }, 1362 | "node_modules/@babel/plugin-transform-optional-catch-binding": { 1363 | "version": "7.22.5", 1364 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", 1365 | "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", 1366 | "dev": true, 1367 | "dependencies": { 1368 | "@babel/helper-plugin-utils": "^7.22.5", 1369 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" 1370 | }, 1371 | "engines": { 1372 | "node": ">=6.9.0" 1373 | }, 1374 | "peerDependencies": { 1375 | "@babel/core": "^7.0.0-0" 1376 | } 1377 | }, 1378 | "node_modules/@babel/plugin-transform-optional-chaining": { 1379 | "version": "7.22.10", 1380 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", 1381 | "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", 1382 | "dev": true, 1383 | "dependencies": { 1384 | "@babel/helper-plugin-utils": "^7.22.5", 1385 | "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", 1386 | "@babel/plugin-syntax-optional-chaining": "^7.8.3" 1387 | }, 1388 | "engines": { 1389 | "node": ">=6.9.0" 1390 | }, 1391 | "peerDependencies": { 1392 | "@babel/core": "^7.0.0-0" 1393 | } 1394 | }, 1395 | "node_modules/@babel/plugin-transform-parameters": { 1396 | "version": "7.22.5", 1397 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", 1398 | "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", 1399 | "dev": true, 1400 | "dependencies": { 1401 | "@babel/helper-plugin-utils": "^7.22.5" 1402 | }, 1403 | "engines": { 1404 | "node": ">=6.9.0" 1405 | }, 1406 | "peerDependencies": { 1407 | "@babel/core": "^7.0.0-0" 1408 | } 1409 | }, 1410 | "node_modules/@babel/plugin-transform-private-methods": { 1411 | "version": "7.22.5", 1412 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", 1413 | "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", 1414 | "dev": true, 1415 | "dependencies": { 1416 | "@babel/helper-create-class-features-plugin": "^7.22.5", 1417 | "@babel/helper-plugin-utils": "^7.22.5" 1418 | }, 1419 | "engines": { 1420 | "node": ">=6.9.0" 1421 | }, 1422 | "peerDependencies": { 1423 | "@babel/core": "^7.0.0-0" 1424 | } 1425 | }, 1426 | "node_modules/@babel/plugin-transform-private-property-in-object": { 1427 | "version": "7.22.5", 1428 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", 1429 | "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", 1430 | "dev": true, 1431 | "dependencies": { 1432 | "@babel/helper-annotate-as-pure": "^7.22.5", 1433 | "@babel/helper-create-class-features-plugin": "^7.22.5", 1434 | "@babel/helper-plugin-utils": "^7.22.5", 1435 | "@babel/plugin-syntax-private-property-in-object": "^7.14.5" 1436 | }, 1437 | "engines": { 1438 | "node": ">=6.9.0" 1439 | }, 1440 | "peerDependencies": { 1441 | "@babel/core": "^7.0.0-0" 1442 | } 1443 | }, 1444 | "node_modules/@babel/plugin-transform-property-literals": { 1445 | "version": "7.22.5", 1446 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", 1447 | "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", 1448 | "dev": true, 1449 | "dependencies": { 1450 | "@babel/helper-plugin-utils": "^7.22.5" 1451 | }, 1452 | "engines": { 1453 | "node": ">=6.9.0" 1454 | }, 1455 | "peerDependencies": { 1456 | "@babel/core": "^7.0.0-0" 1457 | } 1458 | }, 1459 | "node_modules/@babel/plugin-transform-regenerator": { 1460 | "version": "7.22.10", 1461 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", 1462 | "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", 1463 | "dev": true, 1464 | "dependencies": { 1465 | "@babel/helper-plugin-utils": "^7.22.5", 1466 | "regenerator-transform": "^0.15.2" 1467 | }, 1468 | "engines": { 1469 | "node": ">=6.9.0" 1470 | }, 1471 | "peerDependencies": { 1472 | "@babel/core": "^7.0.0-0" 1473 | } 1474 | }, 1475 | "node_modules/@babel/plugin-transform-reserved-words": { 1476 | "version": "7.22.5", 1477 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", 1478 | "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", 1479 | "dev": true, 1480 | "dependencies": { 1481 | "@babel/helper-plugin-utils": "^7.22.5" 1482 | }, 1483 | "engines": { 1484 | "node": ">=6.9.0" 1485 | }, 1486 | "peerDependencies": { 1487 | "@babel/core": "^7.0.0-0" 1488 | } 1489 | }, 1490 | "node_modules/@babel/plugin-transform-shorthand-properties": { 1491 | "version": "7.22.5", 1492 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", 1493 | "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", 1494 | "dev": true, 1495 | "dependencies": { 1496 | "@babel/helper-plugin-utils": "^7.22.5" 1497 | }, 1498 | "engines": { 1499 | "node": ">=6.9.0" 1500 | }, 1501 | "peerDependencies": { 1502 | "@babel/core": "^7.0.0-0" 1503 | } 1504 | }, 1505 | "node_modules/@babel/plugin-transform-spread": { 1506 | "version": "7.22.5", 1507 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", 1508 | "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", 1509 | "dev": true, 1510 | "dependencies": { 1511 | "@babel/helper-plugin-utils": "^7.22.5", 1512 | "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" 1513 | }, 1514 | "engines": { 1515 | "node": ">=6.9.0" 1516 | }, 1517 | "peerDependencies": { 1518 | "@babel/core": "^7.0.0-0" 1519 | } 1520 | }, 1521 | "node_modules/@babel/plugin-transform-sticky-regex": { 1522 | "version": "7.22.5", 1523 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", 1524 | "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", 1525 | "dev": true, 1526 | "dependencies": { 1527 | "@babel/helper-plugin-utils": "^7.22.5" 1528 | }, 1529 | "engines": { 1530 | "node": ">=6.9.0" 1531 | }, 1532 | "peerDependencies": { 1533 | "@babel/core": "^7.0.0-0" 1534 | } 1535 | }, 1536 | "node_modules/@babel/plugin-transform-template-literals": { 1537 | "version": "7.22.5", 1538 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", 1539 | "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", 1540 | "dev": true, 1541 | "dependencies": { 1542 | "@babel/helper-plugin-utils": "^7.22.5" 1543 | }, 1544 | "engines": { 1545 | "node": ">=6.9.0" 1546 | }, 1547 | "peerDependencies": { 1548 | "@babel/core": "^7.0.0-0" 1549 | } 1550 | }, 1551 | "node_modules/@babel/plugin-transform-typeof-symbol": { 1552 | "version": "7.22.5", 1553 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", 1554 | "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", 1555 | "dev": true, 1556 | "dependencies": { 1557 | "@babel/helper-plugin-utils": "^7.22.5" 1558 | }, 1559 | "engines": { 1560 | "node": ">=6.9.0" 1561 | }, 1562 | "peerDependencies": { 1563 | "@babel/core": "^7.0.0-0" 1564 | } 1565 | }, 1566 | "node_modules/@babel/plugin-transform-typescript": { 1567 | "version": "7.22.9", 1568 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", 1569 | "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", 1570 | "dev": true, 1571 | "dependencies": { 1572 | "@babel/helper-annotate-as-pure": "^7.22.5", 1573 | "@babel/helper-create-class-features-plugin": "^7.22.9", 1574 | "@babel/helper-plugin-utils": "^7.22.5", 1575 | "@babel/plugin-syntax-typescript": "^7.22.5" 1576 | }, 1577 | "engines": { 1578 | "node": ">=6.9.0" 1579 | }, 1580 | "peerDependencies": { 1581 | "@babel/core": "^7.0.0-0" 1582 | } 1583 | }, 1584 | "node_modules/@babel/plugin-transform-unicode-escapes": { 1585 | "version": "7.22.10", 1586 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", 1587 | "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", 1588 | "dev": true, 1589 | "dependencies": { 1590 | "@babel/helper-plugin-utils": "^7.22.5" 1591 | }, 1592 | "engines": { 1593 | "node": ">=6.9.0" 1594 | }, 1595 | "peerDependencies": { 1596 | "@babel/core": "^7.0.0-0" 1597 | } 1598 | }, 1599 | "node_modules/@babel/plugin-transform-unicode-property-regex": { 1600 | "version": "7.22.5", 1601 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", 1602 | "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", 1603 | "dev": true, 1604 | "dependencies": { 1605 | "@babel/helper-create-regexp-features-plugin": "^7.22.5", 1606 | "@babel/helper-plugin-utils": "^7.22.5" 1607 | }, 1608 | "engines": { 1609 | "node": ">=6.9.0" 1610 | }, 1611 | "peerDependencies": { 1612 | "@babel/core": "^7.0.0-0" 1613 | } 1614 | }, 1615 | "node_modules/@babel/plugin-transform-unicode-regex": { 1616 | "version": "7.22.5", 1617 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", 1618 | "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", 1619 | "dev": true, 1620 | "dependencies": { 1621 | "@babel/helper-create-regexp-features-plugin": "^7.22.5", 1622 | "@babel/helper-plugin-utils": "^7.22.5" 1623 | }, 1624 | "engines": { 1625 | "node": ">=6.9.0" 1626 | }, 1627 | "peerDependencies": { 1628 | "@babel/core": "^7.0.0-0" 1629 | } 1630 | }, 1631 | "node_modules/@babel/plugin-transform-unicode-sets-regex": { 1632 | "version": "7.22.5", 1633 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", 1634 | "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", 1635 | "dev": true, 1636 | "dependencies": { 1637 | "@babel/helper-create-regexp-features-plugin": "^7.22.5", 1638 | "@babel/helper-plugin-utils": "^7.22.5" 1639 | }, 1640 | "engines": { 1641 | "node": ">=6.9.0" 1642 | }, 1643 | "peerDependencies": { 1644 | "@babel/core": "^7.0.0" 1645 | } 1646 | }, 1647 | "node_modules/@babel/preset-env": { 1648 | "version": "7.22.10", 1649 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", 1650 | "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", 1651 | "dev": true, 1652 | "dependencies": { 1653 | "@babel/compat-data": "^7.22.9", 1654 | "@babel/helper-compilation-targets": "^7.22.10", 1655 | "@babel/helper-plugin-utils": "^7.22.5", 1656 | "@babel/helper-validator-option": "^7.22.5", 1657 | "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", 1658 | "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", 1659 | "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", 1660 | "@babel/plugin-syntax-async-generators": "^7.8.4", 1661 | "@babel/plugin-syntax-class-properties": "^7.12.13", 1662 | "@babel/plugin-syntax-class-static-block": "^7.14.5", 1663 | "@babel/plugin-syntax-dynamic-import": "^7.8.3", 1664 | "@babel/plugin-syntax-export-namespace-from": "^7.8.3", 1665 | "@babel/plugin-syntax-import-assertions": "^7.22.5", 1666 | "@babel/plugin-syntax-import-attributes": "^7.22.5", 1667 | "@babel/plugin-syntax-import-meta": "^7.10.4", 1668 | "@babel/plugin-syntax-json-strings": "^7.8.3", 1669 | "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", 1670 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 1671 | "@babel/plugin-syntax-numeric-separator": "^7.10.4", 1672 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1673 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 1674 | "@babel/plugin-syntax-optional-chaining": "^7.8.3", 1675 | "@babel/plugin-syntax-private-property-in-object": "^7.14.5", 1676 | "@babel/plugin-syntax-top-level-await": "^7.14.5", 1677 | "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", 1678 | "@babel/plugin-transform-arrow-functions": "^7.22.5", 1679 | "@babel/plugin-transform-async-generator-functions": "^7.22.10", 1680 | "@babel/plugin-transform-async-to-generator": "^7.22.5", 1681 | "@babel/plugin-transform-block-scoped-functions": "^7.22.5", 1682 | "@babel/plugin-transform-block-scoping": "^7.22.10", 1683 | "@babel/plugin-transform-class-properties": "^7.22.5", 1684 | "@babel/plugin-transform-class-static-block": "^7.22.5", 1685 | "@babel/plugin-transform-classes": "^7.22.6", 1686 | "@babel/plugin-transform-computed-properties": "^7.22.5", 1687 | "@babel/plugin-transform-destructuring": "^7.22.10", 1688 | "@babel/plugin-transform-dotall-regex": "^7.22.5", 1689 | "@babel/plugin-transform-duplicate-keys": "^7.22.5", 1690 | "@babel/plugin-transform-dynamic-import": "^7.22.5", 1691 | "@babel/plugin-transform-exponentiation-operator": "^7.22.5", 1692 | "@babel/plugin-transform-export-namespace-from": "^7.22.5", 1693 | "@babel/plugin-transform-for-of": "^7.22.5", 1694 | "@babel/plugin-transform-function-name": "^7.22.5", 1695 | "@babel/plugin-transform-json-strings": "^7.22.5", 1696 | "@babel/plugin-transform-literals": "^7.22.5", 1697 | "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", 1698 | "@babel/plugin-transform-member-expression-literals": "^7.22.5", 1699 | "@babel/plugin-transform-modules-amd": "^7.22.5", 1700 | "@babel/plugin-transform-modules-commonjs": "^7.22.5", 1701 | "@babel/plugin-transform-modules-systemjs": "^7.22.5", 1702 | "@babel/plugin-transform-modules-umd": "^7.22.5", 1703 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", 1704 | "@babel/plugin-transform-new-target": "^7.22.5", 1705 | "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", 1706 | "@babel/plugin-transform-numeric-separator": "^7.22.5", 1707 | "@babel/plugin-transform-object-rest-spread": "^7.22.5", 1708 | "@babel/plugin-transform-object-super": "^7.22.5", 1709 | "@babel/plugin-transform-optional-catch-binding": "^7.22.5", 1710 | "@babel/plugin-transform-optional-chaining": "^7.22.10", 1711 | "@babel/plugin-transform-parameters": "^7.22.5", 1712 | "@babel/plugin-transform-private-methods": "^7.22.5", 1713 | "@babel/plugin-transform-private-property-in-object": "^7.22.5", 1714 | "@babel/plugin-transform-property-literals": "^7.22.5", 1715 | "@babel/plugin-transform-regenerator": "^7.22.10", 1716 | "@babel/plugin-transform-reserved-words": "^7.22.5", 1717 | "@babel/plugin-transform-shorthand-properties": "^7.22.5", 1718 | "@babel/plugin-transform-spread": "^7.22.5", 1719 | "@babel/plugin-transform-sticky-regex": "^7.22.5", 1720 | "@babel/plugin-transform-template-literals": "^7.22.5", 1721 | "@babel/plugin-transform-typeof-symbol": "^7.22.5", 1722 | "@babel/plugin-transform-unicode-escapes": "^7.22.10", 1723 | "@babel/plugin-transform-unicode-property-regex": "^7.22.5", 1724 | "@babel/plugin-transform-unicode-regex": "^7.22.5", 1725 | "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", 1726 | "@babel/preset-modules": "0.1.6-no-external-plugins", 1727 | "@babel/types": "^7.22.10", 1728 | "babel-plugin-polyfill-corejs2": "^0.4.5", 1729 | "babel-plugin-polyfill-corejs3": "^0.8.3", 1730 | "babel-plugin-polyfill-regenerator": "^0.5.2", 1731 | "core-js-compat": "^3.31.0", 1732 | "semver": "^6.3.1" 1733 | }, 1734 | "engines": { 1735 | "node": ">=6.9.0" 1736 | }, 1737 | "peerDependencies": { 1738 | "@babel/core": "^7.0.0-0" 1739 | } 1740 | }, 1741 | "node_modules/@babel/preset-env/node_modules/semver": { 1742 | "version": "6.3.1", 1743 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1744 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1745 | "dev": true, 1746 | "bin": { 1747 | "semver": "bin/semver.js" 1748 | } 1749 | }, 1750 | "node_modules/@babel/preset-modules": { 1751 | "version": "0.1.6-no-external-plugins", 1752 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", 1753 | "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", 1754 | "dev": true, 1755 | "dependencies": { 1756 | "@babel/helper-plugin-utils": "^7.0.0", 1757 | "@babel/types": "^7.4.4", 1758 | "esutils": "^2.0.2" 1759 | }, 1760 | "peerDependencies": { 1761 | "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" 1762 | } 1763 | }, 1764 | "node_modules/@babel/preset-typescript": { 1765 | "version": "7.22.5", 1766 | "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", 1767 | "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", 1768 | "dev": true, 1769 | "dependencies": { 1770 | "@babel/helper-plugin-utils": "^7.22.5", 1771 | "@babel/helper-validator-option": "^7.22.5", 1772 | "@babel/plugin-syntax-jsx": "^7.22.5", 1773 | "@babel/plugin-transform-modules-commonjs": "^7.22.5", 1774 | "@babel/plugin-transform-typescript": "^7.22.5" 1775 | }, 1776 | "engines": { 1777 | "node": ">=6.9.0" 1778 | }, 1779 | "peerDependencies": { 1780 | "@babel/core": "^7.0.0-0" 1781 | } 1782 | }, 1783 | "node_modules/@babel/regjsgen": { 1784 | "version": "0.8.0", 1785 | "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", 1786 | "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", 1787 | "dev": true 1788 | }, 1789 | "node_modules/@babel/runtime": { 1790 | "version": "7.22.6", 1791 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", 1792 | "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", 1793 | "dev": true, 1794 | "dependencies": { 1795 | "regenerator-runtime": "^0.13.11" 1796 | }, 1797 | "engines": { 1798 | "node": ">=6.9.0" 1799 | } 1800 | }, 1801 | "node_modules/@babel/template": { 1802 | "version": "7.22.5", 1803 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", 1804 | "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", 1805 | "dev": true, 1806 | "dependencies": { 1807 | "@babel/code-frame": "^7.22.5", 1808 | "@babel/parser": "^7.22.5", 1809 | "@babel/types": "^7.22.5" 1810 | }, 1811 | "engines": { 1812 | "node": ">=6.9.0" 1813 | } 1814 | }, 1815 | "node_modules/@babel/traverse": { 1816 | "version": "7.22.10", 1817 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", 1818 | "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", 1819 | "dev": true, 1820 | "dependencies": { 1821 | "@babel/code-frame": "^7.22.10", 1822 | "@babel/generator": "^7.22.10", 1823 | "@babel/helper-environment-visitor": "^7.22.5", 1824 | "@babel/helper-function-name": "^7.22.5", 1825 | "@babel/helper-hoist-variables": "^7.22.5", 1826 | "@babel/helper-split-export-declaration": "^7.22.6", 1827 | "@babel/parser": "^7.22.10", 1828 | "@babel/types": "^7.22.10", 1829 | "debug": "^4.1.0", 1830 | "globals": "^11.1.0" 1831 | }, 1832 | "engines": { 1833 | "node": ">=6.9.0" 1834 | } 1835 | }, 1836 | "node_modules/@babel/types": { 1837 | "version": "7.22.10", 1838 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", 1839 | "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", 1840 | "dev": true, 1841 | "dependencies": { 1842 | "@babel/helper-string-parser": "^7.22.5", 1843 | "@babel/helper-validator-identifier": "^7.22.5", 1844 | "to-fast-properties": "^2.0.0" 1845 | }, 1846 | "engines": { 1847 | "node": ">=6.9.0" 1848 | } 1849 | }, 1850 | "node_modules/@cspotcode/source-map-support": { 1851 | "version": "0.8.1", 1852 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 1853 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 1854 | "dev": true, 1855 | "dependencies": { 1856 | "@jridgewell/trace-mapping": "0.3.9" 1857 | }, 1858 | "engines": { 1859 | "node": ">=12" 1860 | } 1861 | }, 1862 | "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { 1863 | "version": "0.3.9", 1864 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 1865 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 1866 | "dev": true, 1867 | "dependencies": { 1868 | "@jridgewell/resolve-uri": "^3.0.3", 1869 | "@jridgewell/sourcemap-codec": "^1.4.10" 1870 | } 1871 | }, 1872 | "node_modules/@jridgewell/gen-mapping": { 1873 | "version": "0.1.1", 1874 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 1875 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 1876 | "dev": true, 1877 | "dependencies": { 1878 | "@jridgewell/set-array": "^1.0.0", 1879 | "@jridgewell/sourcemap-codec": "^1.4.10" 1880 | }, 1881 | "engines": { 1882 | "node": ">=6.0.0" 1883 | } 1884 | }, 1885 | "node_modules/@jridgewell/resolve-uri": { 1886 | "version": "3.1.0", 1887 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 1888 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 1889 | "dev": true, 1890 | "engines": { 1891 | "node": ">=6.0.0" 1892 | } 1893 | }, 1894 | "node_modules/@jridgewell/set-array": { 1895 | "version": "1.1.2", 1896 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 1897 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 1898 | "dev": true, 1899 | "engines": { 1900 | "node": ">=6.0.0" 1901 | } 1902 | }, 1903 | "node_modules/@jridgewell/sourcemap-codec": { 1904 | "version": "1.4.14", 1905 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 1906 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 1907 | "dev": true 1908 | }, 1909 | "node_modules/@jridgewell/trace-mapping": { 1910 | "version": "0.3.18", 1911 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", 1912 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", 1913 | "dev": true, 1914 | "dependencies": { 1915 | "@jridgewell/resolve-uri": "3.1.0", 1916 | "@jridgewell/sourcemap-codec": "1.4.14" 1917 | } 1918 | }, 1919 | "node_modules/@nicolo-ribaudo/chokidar-2": { 1920 | "version": "2.1.8-no-fsevents.3", 1921 | "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", 1922 | "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", 1923 | "dev": true, 1924 | "optional": true 1925 | }, 1926 | "node_modules/@rollup/plugin-babel": { 1927 | "version": "6.0.3", 1928 | "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", 1929 | "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==", 1930 | "dev": true, 1931 | "dependencies": { 1932 | "@babel/helper-module-imports": "^7.18.6", 1933 | "@rollup/pluginutils": "^5.0.1" 1934 | }, 1935 | "engines": { 1936 | "node": ">=14.0.0" 1937 | }, 1938 | "peerDependencies": { 1939 | "@babel/core": "^7.0.0", 1940 | "@types/babel__core": "^7.1.9", 1941 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 1942 | }, 1943 | "peerDependenciesMeta": { 1944 | "@types/babel__core": { 1945 | "optional": true 1946 | }, 1947 | "rollup": { 1948 | "optional": true 1949 | } 1950 | } 1951 | }, 1952 | "node_modules/@rollup/plugin-commonjs": { 1953 | "version": "25.0.3", 1954 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.3.tgz", 1955 | "integrity": "sha512-uBdtWr/H3BVcgm97MUdq2oJmqBR23ny1hOrWe2PKo9FTbjsGqg32jfasJUKYAI5ouqacjRnj65mBB/S79F+GQA==", 1956 | "dev": true, 1957 | "dependencies": { 1958 | "@rollup/pluginutils": "^5.0.1", 1959 | "commondir": "^1.0.1", 1960 | "estree-walker": "^2.0.2", 1961 | "glob": "^8.0.3", 1962 | "is-reference": "1.2.1", 1963 | "magic-string": "^0.27.0" 1964 | }, 1965 | "engines": { 1966 | "node": ">=14.0.0" 1967 | }, 1968 | "peerDependencies": { 1969 | "rollup": "^2.68.0||^3.0.0" 1970 | }, 1971 | "peerDependenciesMeta": { 1972 | "rollup": { 1973 | "optional": true 1974 | } 1975 | } 1976 | }, 1977 | "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { 1978 | "version": "2.0.1", 1979 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1980 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1981 | "dev": true, 1982 | "dependencies": { 1983 | "balanced-match": "^1.0.0" 1984 | } 1985 | }, 1986 | "node_modules/@rollup/plugin-commonjs/node_modules/glob": { 1987 | "version": "8.1.0", 1988 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1989 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1990 | "dev": true, 1991 | "dependencies": { 1992 | "fs.realpath": "^1.0.0", 1993 | "inflight": "^1.0.4", 1994 | "inherits": "2", 1995 | "minimatch": "^5.0.1", 1996 | "once": "^1.3.0" 1997 | }, 1998 | "engines": { 1999 | "node": ">=12" 2000 | }, 2001 | "funding": { 2002 | "url": "https://github.com/sponsors/isaacs" 2003 | } 2004 | }, 2005 | "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { 2006 | "version": "5.1.6", 2007 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 2008 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 2009 | "dev": true, 2010 | "dependencies": { 2011 | "brace-expansion": "^2.0.1" 2012 | }, 2013 | "engines": { 2014 | "node": ">=10" 2015 | } 2016 | }, 2017 | "node_modules/@rollup/plugin-inject": { 2018 | "version": "5.0.3", 2019 | "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", 2020 | "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", 2021 | "dev": true, 2022 | "dependencies": { 2023 | "@rollup/pluginutils": "^5.0.1", 2024 | "estree-walker": "^2.0.2", 2025 | "magic-string": "^0.27.0" 2026 | }, 2027 | "engines": { 2028 | "node": ">=14.0.0" 2029 | }, 2030 | "peerDependencies": { 2031 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 2032 | }, 2033 | "peerDependenciesMeta": { 2034 | "rollup": { 2035 | "optional": true 2036 | } 2037 | } 2038 | }, 2039 | "node_modules/@rollup/plugin-json": { 2040 | "version": "6.0.0", 2041 | "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", 2042 | "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", 2043 | "dev": true, 2044 | "dependencies": { 2045 | "@rollup/pluginutils": "^5.0.1" 2046 | }, 2047 | "engines": { 2048 | "node": ">=14.0.0" 2049 | }, 2050 | "peerDependencies": { 2051 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 2052 | }, 2053 | "peerDependenciesMeta": { 2054 | "rollup": { 2055 | "optional": true 2056 | } 2057 | } 2058 | }, 2059 | "node_modules/@rollup/plugin-node-resolve": { 2060 | "version": "15.1.0", 2061 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.1.0.tgz", 2062 | "integrity": "sha512-xeZHCgsiZ9pzYVgAo9580eCGqwh/XCEUM9q6iQfGNocjgkufHAqC3exA+45URvhiYV8sBF9RlBai650eNs7AsA==", 2063 | "dev": true, 2064 | "dependencies": { 2065 | "@rollup/pluginutils": "^5.0.1", 2066 | "@types/resolve": "1.20.2", 2067 | "deepmerge": "^4.2.2", 2068 | "is-builtin-module": "^3.2.1", 2069 | "is-module": "^1.0.0", 2070 | "resolve": "^1.22.1" 2071 | }, 2072 | "engines": { 2073 | "node": ">=14.0.0" 2074 | }, 2075 | "peerDependencies": { 2076 | "rollup": "^2.78.0||^3.0.0" 2077 | }, 2078 | "peerDependenciesMeta": { 2079 | "rollup": { 2080 | "optional": true 2081 | } 2082 | } 2083 | }, 2084 | "node_modules/@rollup/plugin-replace": { 2085 | "version": "5.0.2", 2086 | "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz", 2087 | "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==", 2088 | "dev": true, 2089 | "dependencies": { 2090 | "@rollup/pluginutils": "^5.0.1", 2091 | "magic-string": "^0.27.0" 2092 | }, 2093 | "engines": { 2094 | "node": ">=14.0.0" 2095 | }, 2096 | "peerDependencies": { 2097 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 2098 | }, 2099 | "peerDependenciesMeta": { 2100 | "rollup": { 2101 | "optional": true 2102 | } 2103 | } 2104 | }, 2105 | "node_modules/@rollup/plugin-typescript": { 2106 | "version": "11.1.2", 2107 | "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.2.tgz", 2108 | "integrity": "sha512-0ghSOCMcA7fl1JM+0gYRf+Q/HWyg+zg7/gDSc+fRLmlJWcW5K1I+CLRzaRhXf4Y3DRyPnnDo4M2ktw+a6JcDEg==", 2109 | "dev": true, 2110 | "dependencies": { 2111 | "@rollup/pluginutils": "^5.0.1", 2112 | "resolve": "^1.22.1" 2113 | }, 2114 | "engines": { 2115 | "node": ">=14.0.0" 2116 | }, 2117 | "peerDependencies": { 2118 | "rollup": "^2.14.0||^3.0.0", 2119 | "tslib": "*", 2120 | "typescript": ">=3.7.0" 2121 | }, 2122 | "peerDependenciesMeta": { 2123 | "rollup": { 2124 | "optional": true 2125 | }, 2126 | "tslib": { 2127 | "optional": true 2128 | } 2129 | } 2130 | }, 2131 | "node_modules/@rollup/plugin-url": { 2132 | "version": "8.0.1", 2133 | "resolved": "https://registry.npmjs.org/@rollup/plugin-url/-/plugin-url-8.0.1.tgz", 2134 | "integrity": "sha512-8ajztphXb5e19dk3Iwjtm2eSYJR8jFQubZ8pJ1GG2MBMM7/qUedLnZAN+Vt4jqbcT/m27jfjIBocvrzV0giNRw==", 2135 | "dev": true, 2136 | "dependencies": { 2137 | "@rollup/pluginutils": "^5.0.1", 2138 | "make-dir": "^3.1.0", 2139 | "mime": "^3.0.0" 2140 | }, 2141 | "engines": { 2142 | "node": ">=14.0.0" 2143 | }, 2144 | "peerDependencies": { 2145 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 2146 | }, 2147 | "peerDependenciesMeta": { 2148 | "rollup": { 2149 | "optional": true 2150 | } 2151 | } 2152 | }, 2153 | "node_modules/@rollup/plugin-url/node_modules/make-dir": { 2154 | "version": "3.1.0", 2155 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2156 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2157 | "dev": true, 2158 | "dependencies": { 2159 | "semver": "^6.0.0" 2160 | }, 2161 | "engines": { 2162 | "node": ">=8" 2163 | }, 2164 | "funding": { 2165 | "url": "https://github.com/sponsors/sindresorhus" 2166 | } 2167 | }, 2168 | "node_modules/@rollup/plugin-url/node_modules/semver": { 2169 | "version": "6.3.1", 2170 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2171 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2172 | "dev": true, 2173 | "bin": { 2174 | "semver": "bin/semver.js" 2175 | } 2176 | }, 2177 | "node_modules/@rollup/pluginutils": { 2178 | "version": "5.0.2", 2179 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", 2180 | "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", 2181 | "dev": true, 2182 | "dependencies": { 2183 | "@types/estree": "^1.0.0", 2184 | "estree-walker": "^2.0.2", 2185 | "picomatch": "^2.3.1" 2186 | }, 2187 | "engines": { 2188 | "node": ">=14.0.0" 2189 | }, 2190 | "peerDependencies": { 2191 | "rollup": "^1.20.0||^2.0.0||^3.0.0" 2192 | }, 2193 | "peerDependenciesMeta": { 2194 | "rollup": { 2195 | "optional": true 2196 | } 2197 | } 2198 | }, 2199 | "node_modules/@tsconfig/node10": { 2200 | "version": "1.0.9", 2201 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", 2202 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", 2203 | "dev": true 2204 | }, 2205 | "node_modules/@tsconfig/node12": { 2206 | "version": "1.0.11", 2207 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 2208 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 2209 | "dev": true 2210 | }, 2211 | "node_modules/@tsconfig/node14": { 2212 | "version": "1.0.3", 2213 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 2214 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 2215 | "dev": true 2216 | }, 2217 | "node_modules/@tsconfig/node16": { 2218 | "version": "1.0.3", 2219 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", 2220 | "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", 2221 | "dev": true 2222 | }, 2223 | "node_modules/@types/estree": { 2224 | "version": "1.0.1", 2225 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", 2226 | "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", 2227 | "dev": true 2228 | }, 2229 | "node_modules/@types/i18next": { 2230 | "version": "13.0.0", 2231 | "resolved": "https://registry.npmjs.org/@types/i18next/-/i18next-13.0.0.tgz", 2232 | "integrity": "sha512-gp/SIShAuf4WOqi8ey0nuI7qfWaVpMNCcs/xLygrh/QTQIXmlDC1E0TtVejweNW+7SGDY7g0lyxyKZIJuCKIJw==", 2233 | "deprecated": "This is a stub types definition. i18next provides its own type definitions, so you do not need this installed.", 2234 | "dev": true, 2235 | "dependencies": { 2236 | "i18next": "*" 2237 | } 2238 | }, 2239 | "node_modules/@types/jws": { 2240 | "version": "3.2.5", 2241 | "resolved": "https://registry.npmjs.org/@types/jws/-/jws-3.2.5.tgz", 2242 | "integrity": "sha512-xGTxZH34xOryaTN8CMsvhh9lfNqFuHiMoRvsLYWQdBJHqiECyfInXVl2eK8Jz2emxZWMIn5RBlmr3oDVPeWujw==", 2243 | "dev": true, 2244 | "dependencies": { 2245 | "@types/node": "*" 2246 | } 2247 | }, 2248 | "node_modules/@types/lodash": { 2249 | "version": "4.14.197", 2250 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", 2251 | "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==", 2252 | "dev": true 2253 | }, 2254 | "node_modules/@types/node": { 2255 | "version": "20.4.10", 2256 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.10.tgz", 2257 | "integrity": "sha512-vwzFiiy8Rn6E0MtA13/Cxxgpan/N6UeNYR9oUu6kuJWxu6zCk98trcDp8CBhbtaeuq9SykCmXkFr2lWLoPcvLg==", 2258 | "dev": true 2259 | }, 2260 | "node_modules/@types/nodemailer": { 2261 | "version": "6.4.9", 2262 | "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.9.tgz", 2263 | "integrity": "sha512-XYG8Gv+sHjaOtUpiuytahMy2mM3rectgroNbs6R3djZEKmPNiIJwe9KqOJBGzKKnNZNKvnuvmugBgpq3w/S0ig==", 2264 | "dev": true, 2265 | "dependencies": { 2266 | "@types/node": "*" 2267 | } 2268 | }, 2269 | "node_modules/@types/resolve": { 2270 | "version": "1.20.2", 2271 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 2272 | "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", 2273 | "dev": true 2274 | }, 2275 | "node_modules/acorn": { 2276 | "version": "8.8.0", 2277 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 2278 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 2279 | "dev": true, 2280 | "bin": { 2281 | "acorn": "bin/acorn" 2282 | }, 2283 | "engines": { 2284 | "node": ">=0.4.0" 2285 | } 2286 | }, 2287 | "node_modules/acorn-walk": { 2288 | "version": "8.2.0", 2289 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 2290 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 2291 | "dev": true, 2292 | "engines": { 2293 | "node": ">=0.4.0" 2294 | } 2295 | }, 2296 | "node_modules/ansi-styles": { 2297 | "version": "3.2.1", 2298 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2299 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2300 | "dev": true, 2301 | "dependencies": { 2302 | "color-convert": "^1.9.0" 2303 | }, 2304 | "engines": { 2305 | "node": ">=4" 2306 | } 2307 | }, 2308 | "node_modules/anymatch": { 2309 | "version": "3.1.2", 2310 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 2311 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 2312 | "dev": true, 2313 | "optional": true, 2314 | "dependencies": { 2315 | "normalize-path": "^3.0.0", 2316 | "picomatch": "^2.0.4" 2317 | }, 2318 | "engines": { 2319 | "node": ">= 8" 2320 | } 2321 | }, 2322 | "node_modules/arg": { 2323 | "version": "4.1.3", 2324 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 2325 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 2326 | "dev": true 2327 | }, 2328 | "node_modules/babel-plugin-polyfill-corejs2": { 2329 | "version": "0.4.5", 2330 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", 2331 | "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", 2332 | "dev": true, 2333 | "dependencies": { 2334 | "@babel/compat-data": "^7.22.6", 2335 | "@babel/helper-define-polyfill-provider": "^0.4.2", 2336 | "semver": "^6.3.1" 2337 | }, 2338 | "peerDependencies": { 2339 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 2340 | } 2341 | }, 2342 | "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { 2343 | "version": "6.3.1", 2344 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2345 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2346 | "dev": true, 2347 | "bin": { 2348 | "semver": "bin/semver.js" 2349 | } 2350 | }, 2351 | "node_modules/babel-plugin-polyfill-corejs3": { 2352 | "version": "0.8.3", 2353 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", 2354 | "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", 2355 | "dev": true, 2356 | "dependencies": { 2357 | "@babel/helper-define-polyfill-provider": "^0.4.2", 2358 | "core-js-compat": "^3.31.0" 2359 | }, 2360 | "peerDependencies": { 2361 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 2362 | } 2363 | }, 2364 | "node_modules/babel-plugin-polyfill-regenerator": { 2365 | "version": "0.5.2", 2366 | "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", 2367 | "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", 2368 | "dev": true, 2369 | "dependencies": { 2370 | "@babel/helper-define-polyfill-provider": "^0.4.2" 2371 | }, 2372 | "peerDependencies": { 2373 | "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" 2374 | } 2375 | }, 2376 | "node_modules/balanced-match": { 2377 | "version": "1.0.2", 2378 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2379 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2380 | "dev": true 2381 | }, 2382 | "node_modules/binary-extensions": { 2383 | "version": "2.2.0", 2384 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 2385 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2386 | "dev": true, 2387 | "optional": true, 2388 | "engines": { 2389 | "node": ">=8" 2390 | } 2391 | }, 2392 | "node_modules/brace-expansion": { 2393 | "version": "1.1.11", 2394 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2395 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2396 | "dev": true, 2397 | "dependencies": { 2398 | "balanced-match": "^1.0.0", 2399 | "concat-map": "0.0.1" 2400 | } 2401 | }, 2402 | "node_modules/braces": { 2403 | "version": "3.0.2", 2404 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2405 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2406 | "dev": true, 2407 | "optional": true, 2408 | "dependencies": { 2409 | "fill-range": "^7.0.1" 2410 | }, 2411 | "engines": { 2412 | "node": ">=8" 2413 | } 2414 | }, 2415 | "node_modules/browserslist": { 2416 | "version": "4.21.10", 2417 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", 2418 | "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", 2419 | "dev": true, 2420 | "funding": [ 2421 | { 2422 | "type": "opencollective", 2423 | "url": "https://opencollective.com/browserslist" 2424 | }, 2425 | { 2426 | "type": "tidelift", 2427 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2428 | }, 2429 | { 2430 | "type": "github", 2431 | "url": "https://github.com/sponsors/ai" 2432 | } 2433 | ], 2434 | "dependencies": { 2435 | "caniuse-lite": "^1.0.30001517", 2436 | "electron-to-chromium": "^1.4.477", 2437 | "node-releases": "^2.0.13", 2438 | "update-browserslist-db": "^1.0.11" 2439 | }, 2440 | "bin": { 2441 | "browserslist": "cli.js" 2442 | }, 2443 | "engines": { 2444 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2445 | } 2446 | }, 2447 | "node_modules/buffer-equal-constant-time": { 2448 | "version": "1.0.1", 2449 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 2450 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", 2451 | "dev": true 2452 | }, 2453 | "node_modules/builtin-modules": { 2454 | "version": "3.3.0", 2455 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 2456 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 2457 | "dev": true, 2458 | "engines": { 2459 | "node": ">=6" 2460 | }, 2461 | "funding": { 2462 | "url": "https://github.com/sponsors/sindresorhus" 2463 | } 2464 | }, 2465 | "node_modules/caniuse-lite": { 2466 | "version": "1.0.30001518", 2467 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001518.tgz", 2468 | "integrity": "sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==", 2469 | "dev": true, 2470 | "funding": [ 2471 | { 2472 | "type": "opencollective", 2473 | "url": "https://opencollective.com/browserslist" 2474 | }, 2475 | { 2476 | "type": "tidelift", 2477 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 2478 | }, 2479 | { 2480 | "type": "github", 2481 | "url": "https://github.com/sponsors/ai" 2482 | } 2483 | ] 2484 | }, 2485 | "node_modules/chalk": { 2486 | "version": "2.4.2", 2487 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2488 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2489 | "dev": true, 2490 | "dependencies": { 2491 | "ansi-styles": "^3.2.1", 2492 | "escape-string-regexp": "^1.0.5", 2493 | "supports-color": "^5.3.0" 2494 | }, 2495 | "engines": { 2496 | "node": ">=4" 2497 | } 2498 | }, 2499 | "node_modules/chokidar": { 2500 | "version": "3.5.3", 2501 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2502 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2503 | "dev": true, 2504 | "funding": [ 2505 | { 2506 | "type": "individual", 2507 | "url": "https://paulmillr.com/funding/" 2508 | } 2509 | ], 2510 | "optional": true, 2511 | "dependencies": { 2512 | "anymatch": "~3.1.2", 2513 | "braces": "~3.0.2", 2514 | "glob-parent": "~5.1.2", 2515 | "is-binary-path": "~2.1.0", 2516 | "is-glob": "~4.0.1", 2517 | "normalize-path": "~3.0.0", 2518 | "readdirp": "~3.6.0" 2519 | }, 2520 | "engines": { 2521 | "node": ">= 8.10.0" 2522 | }, 2523 | "optionalDependencies": { 2524 | "fsevents": "~2.3.2" 2525 | } 2526 | }, 2527 | "node_modules/color-convert": { 2528 | "version": "1.9.3", 2529 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2530 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2531 | "dev": true, 2532 | "dependencies": { 2533 | "color-name": "1.1.3" 2534 | } 2535 | }, 2536 | "node_modules/color-name": { 2537 | "version": "1.1.3", 2538 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2539 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 2540 | "dev": true 2541 | }, 2542 | "node_modules/commander": { 2543 | "version": "4.1.1", 2544 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 2545 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 2546 | "dev": true, 2547 | "engines": { 2548 | "node": ">= 6" 2549 | } 2550 | }, 2551 | "node_modules/commondir": { 2552 | "version": "1.0.1", 2553 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 2554 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", 2555 | "dev": true 2556 | }, 2557 | "node_modules/concat-map": { 2558 | "version": "0.0.1", 2559 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2560 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2561 | "dev": true 2562 | }, 2563 | "node_modules/convert-source-map": { 2564 | "version": "1.8.0", 2565 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 2566 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 2567 | "dev": true, 2568 | "dependencies": { 2569 | "safe-buffer": "~5.1.1" 2570 | } 2571 | }, 2572 | "node_modules/core-js-compat": { 2573 | "version": "3.32.0", 2574 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", 2575 | "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", 2576 | "dev": true, 2577 | "dependencies": { 2578 | "browserslist": "^4.21.9" 2579 | }, 2580 | "funding": { 2581 | "type": "opencollective", 2582 | "url": "https://opencollective.com/core-js" 2583 | } 2584 | }, 2585 | "node_modules/create-require": { 2586 | "version": "1.1.1", 2587 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 2588 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 2589 | "dev": true 2590 | }, 2591 | "node_modules/debug": { 2592 | "version": "4.3.4", 2593 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2594 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2595 | "dev": true, 2596 | "dependencies": { 2597 | "ms": "2.1.2" 2598 | }, 2599 | "engines": { 2600 | "node": ">=6.0" 2601 | }, 2602 | "peerDependenciesMeta": { 2603 | "supports-color": { 2604 | "optional": true 2605 | } 2606 | } 2607 | }, 2608 | "node_modules/deepmerge": { 2609 | "version": "4.3.1", 2610 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 2611 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 2612 | "dev": true, 2613 | "engines": { 2614 | "node": ">=0.10.0" 2615 | } 2616 | }, 2617 | "node_modules/diff": { 2618 | "version": "4.0.2", 2619 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 2620 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 2621 | "dev": true, 2622 | "engines": { 2623 | "node": ">=0.3.1" 2624 | } 2625 | }, 2626 | "node_modules/ecdsa-sig-formatter": { 2627 | "version": "1.0.11", 2628 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 2629 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 2630 | "dev": true, 2631 | "dependencies": { 2632 | "safe-buffer": "^5.0.1" 2633 | } 2634 | }, 2635 | "node_modules/electron-to-chromium": { 2636 | "version": "1.4.479", 2637 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.479.tgz", 2638 | "integrity": "sha512-ABv1nHMIR8I5n3O3Een0gr6i0mfM+YcTZqjHy3pAYaOjgFG+BMquuKrSyfYf5CbEkLr9uM05RA3pOk4udNB/aQ==", 2639 | "dev": true 2640 | }, 2641 | "node_modules/escalade": { 2642 | "version": "3.1.1", 2643 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2644 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2645 | "dev": true, 2646 | "engines": { 2647 | "node": ">=6" 2648 | } 2649 | }, 2650 | "node_modules/escape-string-regexp": { 2651 | "version": "1.0.5", 2652 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 2653 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 2654 | "dev": true, 2655 | "engines": { 2656 | "node": ">=0.8.0" 2657 | } 2658 | }, 2659 | "node_modules/estree-walker": { 2660 | "version": "2.0.2", 2661 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 2662 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 2663 | "dev": true 2664 | }, 2665 | "node_modules/esutils": { 2666 | "version": "2.0.3", 2667 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2668 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2669 | "dev": true, 2670 | "engines": { 2671 | "node": ">=0.10.0" 2672 | } 2673 | }, 2674 | "node_modules/fill-range": { 2675 | "version": "7.0.1", 2676 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2677 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2678 | "dev": true, 2679 | "optional": true, 2680 | "dependencies": { 2681 | "to-regex-range": "^5.0.1" 2682 | }, 2683 | "engines": { 2684 | "node": ">=8" 2685 | } 2686 | }, 2687 | "node_modules/fs-readdir-recursive": { 2688 | "version": "1.1.0", 2689 | "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", 2690 | "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", 2691 | "dev": true 2692 | }, 2693 | "node_modules/fs.realpath": { 2694 | "version": "1.0.0", 2695 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2696 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 2697 | "dev": true 2698 | }, 2699 | "node_modules/fsevents": { 2700 | "version": "2.3.2", 2701 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2702 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2703 | "dev": true, 2704 | "hasInstallScript": true, 2705 | "optional": true, 2706 | "os": [ 2707 | "darwin" 2708 | ], 2709 | "engines": { 2710 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2711 | } 2712 | }, 2713 | "node_modules/function-bind": { 2714 | "version": "1.1.1", 2715 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2716 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2717 | "dev": true 2718 | }, 2719 | "node_modules/gensync": { 2720 | "version": "1.0.0-beta.2", 2721 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 2722 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 2723 | "dev": true, 2724 | "engines": { 2725 | "node": ">=6.9.0" 2726 | } 2727 | }, 2728 | "node_modules/glob": { 2729 | "version": "7.2.3", 2730 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2731 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2732 | "dev": true, 2733 | "dependencies": { 2734 | "fs.realpath": "^1.0.0", 2735 | "inflight": "^1.0.4", 2736 | "inherits": "2", 2737 | "minimatch": "^3.1.1", 2738 | "once": "^1.3.0", 2739 | "path-is-absolute": "^1.0.0" 2740 | }, 2741 | "engines": { 2742 | "node": "*" 2743 | }, 2744 | "funding": { 2745 | "url": "https://github.com/sponsors/isaacs" 2746 | } 2747 | }, 2748 | "node_modules/glob-parent": { 2749 | "version": "5.1.2", 2750 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2751 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2752 | "dev": true, 2753 | "optional": true, 2754 | "dependencies": { 2755 | "is-glob": "^4.0.1" 2756 | }, 2757 | "engines": { 2758 | "node": ">= 6" 2759 | } 2760 | }, 2761 | "node_modules/globals": { 2762 | "version": "11.12.0", 2763 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 2764 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 2765 | "dev": true, 2766 | "engines": { 2767 | "node": ">=4" 2768 | } 2769 | }, 2770 | "node_modules/has": { 2771 | "version": "1.0.3", 2772 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2773 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2774 | "dev": true, 2775 | "dependencies": { 2776 | "function-bind": "^1.1.1" 2777 | }, 2778 | "engines": { 2779 | "node": ">= 0.4.0" 2780 | } 2781 | }, 2782 | "node_modules/has-flag": { 2783 | "version": "3.0.0", 2784 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2785 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 2786 | "dev": true, 2787 | "engines": { 2788 | "node": ">=4" 2789 | } 2790 | }, 2791 | "node_modules/i18next": { 2792 | "version": "23.4.4", 2793 | "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.4.4.tgz", 2794 | "integrity": "sha512-+c9B0txp/x1m5zn+QlwHaCS9vyFtmIAEXbVSFzwCX7vupm5V7va8F9cJGNJZ46X9ZtoGzhIiRC7eTIIh93TxPA==", 2795 | "dev": true, 2796 | "funding": [ 2797 | { 2798 | "type": "individual", 2799 | "url": "https://locize.com" 2800 | }, 2801 | { 2802 | "type": "individual", 2803 | "url": "https://locize.com/i18next.html" 2804 | }, 2805 | { 2806 | "type": "individual", 2807 | "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" 2808 | } 2809 | ], 2810 | "dependencies": { 2811 | "@babel/runtime": "^7.22.5" 2812 | } 2813 | }, 2814 | "node_modules/inflight": { 2815 | "version": "1.0.6", 2816 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2817 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2818 | "dev": true, 2819 | "dependencies": { 2820 | "once": "^1.3.0", 2821 | "wrappy": "1" 2822 | } 2823 | }, 2824 | "node_modules/inherits": { 2825 | "version": "2.0.4", 2826 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2827 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2828 | "dev": true 2829 | }, 2830 | "node_modules/is-binary-path": { 2831 | "version": "2.1.0", 2832 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2833 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2834 | "dev": true, 2835 | "optional": true, 2836 | "dependencies": { 2837 | "binary-extensions": "^2.0.0" 2838 | }, 2839 | "engines": { 2840 | "node": ">=8" 2841 | } 2842 | }, 2843 | "node_modules/is-builtin-module": { 2844 | "version": "3.2.1", 2845 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", 2846 | "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", 2847 | "dev": true, 2848 | "dependencies": { 2849 | "builtin-modules": "^3.3.0" 2850 | }, 2851 | "engines": { 2852 | "node": ">=6" 2853 | }, 2854 | "funding": { 2855 | "url": "https://github.com/sponsors/sindresorhus" 2856 | } 2857 | }, 2858 | "node_modules/is-core-module": { 2859 | "version": "2.10.0", 2860 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 2861 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 2862 | "dev": true, 2863 | "dependencies": { 2864 | "has": "^1.0.3" 2865 | }, 2866 | "funding": { 2867 | "url": "https://github.com/sponsors/ljharb" 2868 | } 2869 | }, 2870 | "node_modules/is-extglob": { 2871 | "version": "2.1.1", 2872 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2873 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2874 | "dev": true, 2875 | "optional": true, 2876 | "engines": { 2877 | "node": ">=0.10.0" 2878 | } 2879 | }, 2880 | "node_modules/is-glob": { 2881 | "version": "4.0.3", 2882 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2883 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2884 | "dev": true, 2885 | "optional": true, 2886 | "dependencies": { 2887 | "is-extglob": "^2.1.1" 2888 | }, 2889 | "engines": { 2890 | "node": ">=0.10.0" 2891 | } 2892 | }, 2893 | "node_modules/is-module": { 2894 | "version": "1.0.0", 2895 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 2896 | "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", 2897 | "dev": true 2898 | }, 2899 | "node_modules/is-number": { 2900 | "version": "7.0.0", 2901 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2902 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2903 | "dev": true, 2904 | "optional": true, 2905 | "engines": { 2906 | "node": ">=0.12.0" 2907 | } 2908 | }, 2909 | "node_modules/is-reference": { 2910 | "version": "1.2.1", 2911 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", 2912 | "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", 2913 | "dev": true, 2914 | "dependencies": { 2915 | "@types/estree": "*" 2916 | } 2917 | }, 2918 | "node_modules/jest-worker": { 2919 | "version": "24.9.0", 2920 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", 2921 | "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", 2922 | "dev": true, 2923 | "dependencies": { 2924 | "merge-stream": "^2.0.0", 2925 | "supports-color": "^6.1.0" 2926 | }, 2927 | "engines": { 2928 | "node": ">= 6" 2929 | } 2930 | }, 2931 | "node_modules/jest-worker/node_modules/supports-color": { 2932 | "version": "6.1.0", 2933 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 2934 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 2935 | "dev": true, 2936 | "dependencies": { 2937 | "has-flag": "^3.0.0" 2938 | }, 2939 | "engines": { 2940 | "node": ">=6" 2941 | } 2942 | }, 2943 | "node_modules/js-tokens": { 2944 | "version": "4.0.0", 2945 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2946 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2947 | "dev": true 2948 | }, 2949 | "node_modules/jsesc": { 2950 | "version": "2.5.2", 2951 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2952 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2953 | "dev": true, 2954 | "bin": { 2955 | "jsesc": "bin/jsesc" 2956 | }, 2957 | "engines": { 2958 | "node": ">=4" 2959 | } 2960 | }, 2961 | "node_modules/json5": { 2962 | "version": "2.2.3", 2963 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2964 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2965 | "dev": true, 2966 | "bin": { 2967 | "json5": "lib/cli.js" 2968 | }, 2969 | "engines": { 2970 | "node": ">=6" 2971 | } 2972 | }, 2973 | "node_modules/jwa": { 2974 | "version": "2.0.0", 2975 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 2976 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 2977 | "dev": true, 2978 | "dependencies": { 2979 | "buffer-equal-constant-time": "1.0.1", 2980 | "ecdsa-sig-formatter": "1.0.11", 2981 | "safe-buffer": "^5.0.1" 2982 | } 2983 | }, 2984 | "node_modules/jws": { 2985 | "version": "4.0.0", 2986 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 2987 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 2988 | "dev": true, 2989 | "dependencies": { 2990 | "jwa": "^2.0.0", 2991 | "safe-buffer": "^5.0.1" 2992 | } 2993 | }, 2994 | "node_modules/lodash": { 2995 | "version": "4.17.21", 2996 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2997 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2998 | "dev": true 2999 | }, 3000 | "node_modules/lodash.debounce": { 3001 | "version": "4.0.8", 3002 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 3003 | "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", 3004 | "dev": true 3005 | }, 3006 | "node_modules/lru-cache": { 3007 | "version": "5.1.1", 3008 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 3009 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 3010 | "dev": true, 3011 | "dependencies": { 3012 | "yallist": "^3.0.2" 3013 | } 3014 | }, 3015 | "node_modules/magic-string": { 3016 | "version": "0.27.0", 3017 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", 3018 | "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", 3019 | "dev": true, 3020 | "dependencies": { 3021 | "@jridgewell/sourcemap-codec": "^1.4.13" 3022 | }, 3023 | "engines": { 3024 | "node": ">=12" 3025 | } 3026 | }, 3027 | "node_modules/make-dir": { 3028 | "version": "2.1.0", 3029 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", 3030 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", 3031 | "dev": true, 3032 | "dependencies": { 3033 | "pify": "^4.0.1", 3034 | "semver": "^5.6.0" 3035 | }, 3036 | "engines": { 3037 | "node": ">=6" 3038 | } 3039 | }, 3040 | "node_modules/make-error": { 3041 | "version": "1.3.6", 3042 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 3043 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 3044 | "dev": true 3045 | }, 3046 | "node_modules/merge-stream": { 3047 | "version": "2.0.0", 3048 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 3049 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 3050 | "dev": true 3051 | }, 3052 | "node_modules/mime": { 3053 | "version": "3.0.0", 3054 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 3055 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 3056 | "dev": true, 3057 | "bin": { 3058 | "mime": "cli.js" 3059 | }, 3060 | "engines": { 3061 | "node": ">=10.0.0" 3062 | } 3063 | }, 3064 | "node_modules/minimatch": { 3065 | "version": "3.1.2", 3066 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3067 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3068 | "dev": true, 3069 | "dependencies": { 3070 | "brace-expansion": "^1.1.7" 3071 | }, 3072 | "engines": { 3073 | "node": "*" 3074 | } 3075 | }, 3076 | "node_modules/ms": { 3077 | "version": "2.1.2", 3078 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3079 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 3080 | "dev": true 3081 | }, 3082 | "node_modules/node-releases": { 3083 | "version": "2.0.13", 3084 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", 3085 | "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", 3086 | "dev": true 3087 | }, 3088 | "node_modules/nodemailer": { 3089 | "version": "6.9.4", 3090 | "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.4.tgz", 3091 | "integrity": "sha512-CXjQvrQZV4+6X5wP6ZIgdehJamI63MFoYFGGPtHudWym9qaEHDNdPzaj5bfMCvxG1vhAileSWW90q7nL0N36mA==", 3092 | "dev": true, 3093 | "engines": { 3094 | "node": ">=6.0.0" 3095 | } 3096 | }, 3097 | "node_modules/normalize-path": { 3098 | "version": "3.0.0", 3099 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 3100 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 3101 | "dev": true, 3102 | "optional": true, 3103 | "engines": { 3104 | "node": ">=0.10.0" 3105 | } 3106 | }, 3107 | "node_modules/once": { 3108 | "version": "1.4.0", 3109 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3110 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 3111 | "dev": true, 3112 | "dependencies": { 3113 | "wrappy": "1" 3114 | } 3115 | }, 3116 | "node_modules/path-is-absolute": { 3117 | "version": "1.0.1", 3118 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3119 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 3120 | "dev": true, 3121 | "engines": { 3122 | "node": ">=0.10.0" 3123 | } 3124 | }, 3125 | "node_modules/path-parse": { 3126 | "version": "1.0.7", 3127 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3128 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 3129 | "dev": true 3130 | }, 3131 | "node_modules/picocolors": { 3132 | "version": "1.0.0", 3133 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 3134 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 3135 | "dev": true 3136 | }, 3137 | "node_modules/picomatch": { 3138 | "version": "2.3.1", 3139 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3140 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3141 | "dev": true, 3142 | "engines": { 3143 | "node": ">=8.6" 3144 | }, 3145 | "funding": { 3146 | "url": "https://github.com/sponsors/jonschlinkert" 3147 | } 3148 | }, 3149 | "node_modules/pify": { 3150 | "version": "4.0.1", 3151 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 3152 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 3153 | "dev": true, 3154 | "engines": { 3155 | "node": ">=6" 3156 | } 3157 | }, 3158 | "node_modules/readdirp": { 3159 | "version": "3.6.0", 3160 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 3161 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 3162 | "dev": true, 3163 | "optional": true, 3164 | "dependencies": { 3165 | "picomatch": "^2.2.1" 3166 | }, 3167 | "engines": { 3168 | "node": ">=8.10.0" 3169 | } 3170 | }, 3171 | "node_modules/reflect-metadata": { 3172 | "version": "0.1.13", 3173 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 3174 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", 3175 | "dev": true 3176 | }, 3177 | "node_modules/regenerate": { 3178 | "version": "1.4.2", 3179 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", 3180 | "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", 3181 | "dev": true 3182 | }, 3183 | "node_modules/regenerate-unicode-properties": { 3184 | "version": "10.1.0", 3185 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", 3186 | "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", 3187 | "dev": true, 3188 | "dependencies": { 3189 | "regenerate": "^1.4.2" 3190 | }, 3191 | "engines": { 3192 | "node": ">=4" 3193 | } 3194 | }, 3195 | "node_modules/regenerator-runtime": { 3196 | "version": "0.13.11", 3197 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", 3198 | "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", 3199 | "dev": true 3200 | }, 3201 | "node_modules/regenerator-transform": { 3202 | "version": "0.15.2", 3203 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", 3204 | "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", 3205 | "dev": true, 3206 | "dependencies": { 3207 | "@babel/runtime": "^7.8.4" 3208 | } 3209 | }, 3210 | "node_modules/regexpu-core": { 3211 | "version": "5.3.2", 3212 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", 3213 | "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", 3214 | "dev": true, 3215 | "dependencies": { 3216 | "@babel/regjsgen": "^0.8.0", 3217 | "regenerate": "^1.4.2", 3218 | "regenerate-unicode-properties": "^10.1.0", 3219 | "regjsparser": "^0.9.1", 3220 | "unicode-match-property-ecmascript": "^2.0.0", 3221 | "unicode-match-property-value-ecmascript": "^2.1.0" 3222 | }, 3223 | "engines": { 3224 | "node": ">=4" 3225 | } 3226 | }, 3227 | "node_modules/regjsparser": { 3228 | "version": "0.9.1", 3229 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", 3230 | "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", 3231 | "dev": true, 3232 | "dependencies": { 3233 | "jsesc": "~0.5.0" 3234 | }, 3235 | "bin": { 3236 | "regjsparser": "bin/parser" 3237 | } 3238 | }, 3239 | "node_modules/regjsparser/node_modules/jsesc": { 3240 | "version": "0.5.0", 3241 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 3242 | "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", 3243 | "dev": true, 3244 | "bin": { 3245 | "jsesc": "bin/jsesc" 3246 | } 3247 | }, 3248 | "node_modules/resolve": { 3249 | "version": "1.22.1", 3250 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 3251 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 3252 | "dev": true, 3253 | "dependencies": { 3254 | "is-core-module": "^2.9.0", 3255 | "path-parse": "^1.0.7", 3256 | "supports-preserve-symlinks-flag": "^1.0.0" 3257 | }, 3258 | "bin": { 3259 | "resolve": "bin/resolve" 3260 | }, 3261 | "funding": { 3262 | "url": "https://github.com/sponsors/ljharb" 3263 | } 3264 | }, 3265 | "node_modules/rollup": { 3266 | "version": "3.27.0", 3267 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.0.tgz", 3268 | "integrity": "sha512-aOltLCrYZ0FhJDm7fCqwTjIUEVjWjcydKBV/Zeid6Mn8BWgDCUBBWT5beM5ieForYNo/1ZHuGJdka26kvQ3Gzg==", 3269 | "dev": true, 3270 | "bin": { 3271 | "rollup": "dist/bin/rollup" 3272 | }, 3273 | "engines": { 3274 | "node": ">=14.18.0", 3275 | "npm": ">=8.0.0" 3276 | }, 3277 | "optionalDependencies": { 3278 | "fsevents": "~2.3.2" 3279 | } 3280 | }, 3281 | "node_modules/rollup-plugin-uglify": { 3282 | "version": "6.0.4", 3283 | "resolved": "git+ssh://git@github.com/heusalagroup/rollup-plugin-uglify.git#0a511f779dec2e0b6fcd53ad7ea04f64ac3f1b5d", 3284 | "dev": true, 3285 | "license": "MIT", 3286 | "dependencies": { 3287 | "@babel/code-frame": "^7.0.0", 3288 | "jest-worker": "^24.0.0", 3289 | "serialize-javascript": "^2.1.2", 3290 | "uglify-js": "^3.17.4" 3291 | }, 3292 | "peerDependencies": { 3293 | "rollup": ">=0.66.0 <4" 3294 | } 3295 | }, 3296 | "node_modules/safe-buffer": { 3297 | "version": "5.1.2", 3298 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3299 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 3300 | "dev": true 3301 | }, 3302 | "node_modules/semver": { 3303 | "version": "5.7.2", 3304 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 3305 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 3306 | "dev": true, 3307 | "bin": { 3308 | "semver": "bin/semver" 3309 | } 3310 | }, 3311 | "node_modules/serialize-javascript": { 3312 | "version": "2.1.2", 3313 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", 3314 | "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", 3315 | "dev": true 3316 | }, 3317 | "node_modules/slash": { 3318 | "version": "2.0.0", 3319 | "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", 3320 | "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", 3321 | "dev": true, 3322 | "engines": { 3323 | "node": ">=6" 3324 | } 3325 | }, 3326 | "node_modules/supports-color": { 3327 | "version": "5.5.0", 3328 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3329 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3330 | "dev": true, 3331 | "dependencies": { 3332 | "has-flag": "^3.0.0" 3333 | }, 3334 | "engines": { 3335 | "node": ">=4" 3336 | } 3337 | }, 3338 | "node_modules/supports-preserve-symlinks-flag": { 3339 | "version": "1.0.0", 3340 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3341 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3342 | "dev": true, 3343 | "engines": { 3344 | "node": ">= 0.4" 3345 | }, 3346 | "funding": { 3347 | "url": "https://github.com/sponsors/ljharb" 3348 | } 3349 | }, 3350 | "node_modules/to-fast-properties": { 3351 | "version": "2.0.0", 3352 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3353 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 3354 | "dev": true, 3355 | "engines": { 3356 | "node": ">=4" 3357 | } 3358 | }, 3359 | "node_modules/to-regex-range": { 3360 | "version": "5.0.1", 3361 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3362 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3363 | "dev": true, 3364 | "optional": true, 3365 | "dependencies": { 3366 | "is-number": "^7.0.0" 3367 | }, 3368 | "engines": { 3369 | "node": ">=8.0" 3370 | } 3371 | }, 3372 | "node_modules/ts-node": { 3373 | "version": "10.9.1", 3374 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", 3375 | "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", 3376 | "dev": true, 3377 | "dependencies": { 3378 | "@cspotcode/source-map-support": "^0.8.0", 3379 | "@tsconfig/node10": "^1.0.7", 3380 | "@tsconfig/node12": "^1.0.7", 3381 | "@tsconfig/node14": "^1.0.0", 3382 | "@tsconfig/node16": "^1.0.2", 3383 | "acorn": "^8.4.1", 3384 | "acorn-walk": "^8.1.1", 3385 | "arg": "^4.1.0", 3386 | "create-require": "^1.1.0", 3387 | "diff": "^4.0.1", 3388 | "make-error": "^1.1.1", 3389 | "v8-compile-cache-lib": "^3.0.1", 3390 | "yn": "3.1.1" 3391 | }, 3392 | "bin": { 3393 | "ts-node": "dist/bin.js", 3394 | "ts-node-cwd": "dist/bin-cwd.js", 3395 | "ts-node-esm": "dist/bin-esm.js", 3396 | "ts-node-script": "dist/bin-script.js", 3397 | "ts-node-transpile-only": "dist/bin-transpile.js", 3398 | "ts-script": "dist/bin-script-deprecated.js" 3399 | }, 3400 | "peerDependencies": { 3401 | "@swc/core": ">=1.2.50", 3402 | "@swc/wasm": ">=1.2.50", 3403 | "@types/node": "*", 3404 | "typescript": ">=2.7" 3405 | }, 3406 | "peerDependenciesMeta": { 3407 | "@swc/core": { 3408 | "optional": true 3409 | }, 3410 | "@swc/wasm": { 3411 | "optional": true 3412 | } 3413 | } 3414 | }, 3415 | "node_modules/tslib": { 3416 | "version": "2.6.1", 3417 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", 3418 | "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", 3419 | "dev": true 3420 | }, 3421 | "node_modules/typescript": { 3422 | "version": "5.1.6", 3423 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", 3424 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", 3425 | "dev": true, 3426 | "bin": { 3427 | "tsc": "bin/tsc", 3428 | "tsserver": "bin/tsserver" 3429 | }, 3430 | "engines": { 3431 | "node": ">=14.17" 3432 | } 3433 | }, 3434 | "node_modules/uglify-js": { 3435 | "version": "3.17.4", 3436 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", 3437 | "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", 3438 | "dev": true, 3439 | "bin": { 3440 | "uglifyjs": "bin/uglifyjs" 3441 | }, 3442 | "engines": { 3443 | "node": ">=0.8.0" 3444 | } 3445 | }, 3446 | "node_modules/unicode-canonical-property-names-ecmascript": { 3447 | "version": "2.0.0", 3448 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", 3449 | "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", 3450 | "dev": true, 3451 | "engines": { 3452 | "node": ">=4" 3453 | } 3454 | }, 3455 | "node_modules/unicode-match-property-ecmascript": { 3456 | "version": "2.0.0", 3457 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", 3458 | "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", 3459 | "dev": true, 3460 | "dependencies": { 3461 | "unicode-canonical-property-names-ecmascript": "^2.0.0", 3462 | "unicode-property-aliases-ecmascript": "^2.0.0" 3463 | }, 3464 | "engines": { 3465 | "node": ">=4" 3466 | } 3467 | }, 3468 | "node_modules/unicode-match-property-value-ecmascript": { 3469 | "version": "2.1.0", 3470 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", 3471 | "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", 3472 | "dev": true, 3473 | "engines": { 3474 | "node": ">=4" 3475 | } 3476 | }, 3477 | "node_modules/unicode-property-aliases-ecmascript": { 3478 | "version": "2.1.0", 3479 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", 3480 | "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", 3481 | "dev": true, 3482 | "engines": { 3483 | "node": ">=4" 3484 | } 3485 | }, 3486 | "node_modules/update-browserslist-db": { 3487 | "version": "1.0.11", 3488 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", 3489 | "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", 3490 | "dev": true, 3491 | "funding": [ 3492 | { 3493 | "type": "opencollective", 3494 | "url": "https://opencollective.com/browserslist" 3495 | }, 3496 | { 3497 | "type": "tidelift", 3498 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3499 | }, 3500 | { 3501 | "type": "github", 3502 | "url": "https://github.com/sponsors/ai" 3503 | } 3504 | ], 3505 | "dependencies": { 3506 | "escalade": "^3.1.1", 3507 | "picocolors": "^1.0.0" 3508 | }, 3509 | "bin": { 3510 | "update-browserslist-db": "cli.js" 3511 | }, 3512 | "peerDependencies": { 3513 | "browserslist": ">= 4.21.0" 3514 | } 3515 | }, 3516 | "node_modules/v8-compile-cache-lib": { 3517 | "version": "3.0.1", 3518 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 3519 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 3520 | "dev": true 3521 | }, 3522 | "node_modules/wrappy": { 3523 | "version": "1.0.2", 3524 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3525 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3526 | "dev": true 3527 | }, 3528 | "node_modules/yallist": { 3529 | "version": "3.1.1", 3530 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3531 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3532 | "dev": true 3533 | }, 3534 | "node_modules/yn": { 3535 | "version": "3.1.1", 3536 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 3537 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 3538 | "dev": true, 3539 | "engines": { 3540 | "node": ">=6" 3541 | } 3542 | } 3543 | } 3544 | } 3545 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hghs", 3 | "version": "0.0.1", 4 | "description": "HG HomeServer", 5 | "main": "dist/hghs.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start-prod": "node dist/hghs.js", 9 | "start": "ts-node src/hghs.ts", 10 | "build": "rollup -c" 11 | }, 12 | "author": "Jaakko Heusala ", 13 | "license": "MIT", 14 | "private": true, 15 | "bin": { 16 | "hghs": "dist/hghs.js" 17 | }, 18 | "keywords": [ 19 | "typescript", 20 | "backend", 21 | "rest", 22 | "nodejs", 23 | "spring", 24 | "spring-boot" 25 | ], 26 | "devDependencies": { 27 | "@babel/cli": "^7.22.10", 28 | "@babel/core": "^7.22.10", 29 | "@babel/preset-env": "^7.22.10", 30 | "@babel/preset-typescript": "^7.22.5", 31 | "@rollup/plugin-babel": "^6.0.3", 32 | "@rollup/plugin-commonjs": "^25.0.3", 33 | "@rollup/plugin-inject": "^5.0.3", 34 | "@rollup/plugin-json": "^6.0.0", 35 | "@rollup/plugin-node-resolve": "^15.1.0", 36 | "@rollup/plugin-replace": "^5.0.2", 37 | "@rollup/plugin-typescript": "^11.1.2", 38 | "@rollup/plugin-url": "^8.0.1", 39 | "@types/jws": "^3.2.5", 40 | "@types/lodash": "^4.14.197", 41 | "@types/node": "^20.4.10", 42 | "@types/nodemailer": "^6.4.9", 43 | "i18next": "^23.4.4", 44 | "jws": "^4.0.0", 45 | "lodash": "^4.17.21", 46 | "nodemailer": "^6.9.4", 47 | "rollup": "^3.26.3", 48 | "rollup-plugin-uglify": "github:heusalagroup/rollup-plugin-uglify", 49 | "ts-node": "^10.9.1", 50 | "tslib": "^2.6.1", 51 | "typescript": "^5.1.6", 52 | "reflect-metadata": "^0.1.13" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2021-2023. Heusala Group Oy . All rights reserved. 2 | 3 | const pkg = require('./package.json'); 4 | const resolve = require('@rollup/plugin-node-resolve'); 5 | const commonjs = require('@rollup/plugin-commonjs'); 6 | const typescript = require('@rollup/plugin-typescript'); 7 | const json = require('@rollup/plugin-json'); 8 | const { babel, getBabelOutputPlugin } = require('@rollup/plugin-babel'); 9 | const { uglify } = require("rollup-plugin-uglify"); 10 | const PATH = require('path'); 11 | const replace = require('@rollup/plugin-replace'); 12 | // const externalGlobals = require("rollup-plugin-external-globals"); 13 | // const inject = require('@rollup/plugin-inject'); 14 | 15 | const BUILD_VERSION = process?.env?.BUILD_VERSION ?? pkg?.version ?? ''; 16 | const BUILD_NODE_ENV = process?.env?.BUILD_NODE_ENV ?? process?.env?.NODE_ENV ?? 'production'; 17 | const BUILD_DATE = new Date().toISOString() ?? ''; 18 | const BUILD_WITH_FULL_USAGE = process?.env?.BUILD_WITH_FULL_USAGE ?? ''; 19 | const BUILD_COMMAND_NAME = process?.env?.BUILD_COMMAND_NAME ?? ''; 20 | const BUILD_LOG_LEVEL = process?.env?.BUILD_LOG_LEVEL ?? ''; 21 | 22 | console.log(`Building with options: 23 | 24 | BUILD_VERSION = '${BUILD_VERSION}' 25 | BUILD_NODE_ENV = '${BUILD_NODE_ENV}' 26 | BUILD_DATE = '${BUILD_DATE}' 27 | BUILD_COMMAND_NAME = '${BUILD_COMMAND_NAME}' 28 | BUILD_LOG_LEVEL = '${BUILD_LOG_LEVEL}' 29 | BUILD_WITH_FULL_USAGE = '${BUILD_WITH_FULL_USAGE}'`); 30 | 31 | module.exports = { 32 | input: 'src/hghs.ts', 33 | external: [ 34 | 'node:buffer', 35 | 'node:path', 36 | 'node:child_process', 37 | 'node:process', 38 | 'node:os', 39 | 'node:url' 40 | ], 41 | plugins: [ 42 | 43 | // See also ./src/runtime-constants.ts 44 | replace({ 45 | exclude: 'node_modules/**', 46 | // include: './src/build-constants.ts', 47 | values: { 48 | 'BUILD_VERSION' : BUILD_VERSION, 49 | 'BUILD_NODE_ENV' : BUILD_NODE_ENV, 50 | 'BUILD_DATE' : BUILD_DATE, 51 | 'BUILD_COMMAND_NAME' : BUILD_COMMAND_NAME, 52 | 'BUILD_LOG_LEVEL' : BUILD_LOG_LEVEL, 53 | 'BUILD_WITH_FULL_USAGE' : BUILD_WITH_FULL_USAGE 54 | }, 55 | preventAssignment: true, 56 | delimiters: ['%{', '}'] 57 | }), 58 | 59 | typescript(), 60 | 61 | json(), 62 | 63 | resolve(), 64 | 65 | commonjs({ 66 | sourceMap: false, 67 | include: /node_modules/ 68 | }), 69 | 70 | babel({ babelHelpers: 'bundled' }), 71 | 72 | // externalGlobals({ 73 | // intl: 'IntlPolyfill' 74 | // }), 75 | 76 | // See also https://github.com/mishoo/UglifyJS/blob/master/README.md#minify-options 77 | uglify({ 78 | annotations: true, 79 | toplevel: true, 80 | sourcemap: false, 81 | compress: { 82 | collapse_vars: true, 83 | imports: true, 84 | booleans: true, 85 | annotations: true, 86 | unused: true, 87 | dead_code: true, 88 | passes: 10, 89 | hoist_funs: true, 90 | hoist_vars: true, 91 | merge_vars: true, 92 | toplevel: true, 93 | unsafe_math: true 94 | }, 95 | output: { 96 | annotations: false, 97 | shebang: true, 98 | max_line_len: 120, 99 | indent_level: 2 100 | } 101 | }) 102 | 103 | ], 104 | output: { 105 | dir: 'dist', 106 | format: 'cjs', 107 | banner: '#!/usr/bin/env node', 108 | plugins: [ 109 | getBabelOutputPlugin({ 110 | configFile: PATH.resolve(__dirname, 'babel.config.json') 111 | }) 112 | ] 113 | // globals: { 114 | // intl: 'Intl' 115 | // } 116 | } 117 | }; 118 | -------------------------------------------------------------------------------- /scripts/add-hg-module.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")/.." 3 | set -e 4 | #set -x 5 | 6 | NAME="$1" 7 | 8 | if test "x$NAME" = x; then 9 | echo 'USAGE: ./scripts/add-hg-module.sh NAME' >&2 10 | exit 1 11 | fi 12 | 13 | ORG='heusalagroup' 14 | BRANCH='main' 15 | DIR="src/fi/hg/$NAME" 16 | REPO_NAME="$ORG/fi.hg.$NAME" 17 | REPO_URL="git@github.com:$REPO_NAME.git" 18 | 19 | if test -d "$DIR"; then 20 | git config -f .gitmodules "submodule.$DIR.path" "$DIR" 21 | git config -f .gitmodules "submodule.$DIR.url" "$REPO_URL" 22 | else 23 | git submodule add "$REPO_URL" "$DIR" 24 | fi 25 | git config -f .gitmodules "submodule.$DIR.branch" "$BRANCH" 26 | -------------------------------------------------------------------------------- /scripts/branch-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")/.." 3 | #set -x 4 | 5 | FORMAT='%-15s %-22s %-20s %s\n' 6 | 7 | ROOT_BRANCH="$( 8 | git branch \ 9 | | grep -E '^\*' \ 10 | | sed -re 's/^\* *//' \ 11 | | tr -d '\n' 12 | )" 13 | 14 | printf "$FORMAT" "$ROOT_BRANCH" "." "." "." "." 15 | 16 | cat .gitmodules |grep -F path|awk '{print $3}'|while read DIR; do 17 | ( 18 | cd $DIR 19 | MODULE=$(echo $DIR|sed -re 's@^.*/src/@@'|tr '/' '.') 20 | TAG=$((git describe --tags 2>/dev/null)|sort -n|tail -n1) 21 | if test "x$TAG" = x; then 22 | TAG="$(git rev-parse --short HEAD)" 23 | fi 24 | BRANCH="$( 25 | git branch \ 26 | | grep -E '^\*' \ 27 | | sed -re 's/^\* *//' \ 28 | | tr -d '\n' 29 | )" 30 | 31 | printf "$FORMAT" "$BRANCH" "$MODULE" "$TAG" "$DIR" 32 | ); 33 | done 34 | -------------------------------------------------------------------------------- /scripts/configure-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")/.." 3 | set -x 4 | git config pull.rebase false 5 | cat .gitmodules |grep -F path|awk '{print $3}'|while read DIR; do 6 | (cd $DIR && git config pull.rebase false); 7 | done 8 | -------------------------------------------------------------------------------- /scripts/pull-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")/.." 3 | set -x 4 | git pull 5 | cat .gitmodules |grep -F path|awk '{print $3}'|while read DIR; do 6 | (cd $DIR && git pull)& 7 | done|cat 8 | -------------------------------------------------------------------------------- /scripts/push-all.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")/.." 3 | set -x 4 | git push 5 | cat .gitmodules |grep -F path|awk '{print $3}'|while read DIR; do 6 | (cd $DIR && git push)& 7 | done|cat 8 | -------------------------------------------------------------------------------- /scripts/set-branch-main.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd "$(dirname "$0")/.." 3 | set -x 4 | #git checkout main 5 | cat .gitmodules |grep -F path|awk '{print $3}'|while read DIR; do 6 | (cd $DIR && git checkout main); 7 | done 8 | -------------------------------------------------------------------------------- /src/constants/build.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022. Heusala Group . All rights reserved. 2 | // 3 | // See also rollup.config.js 4 | // 5 | 6 | import { 7 | parseBoolean as _parseBoolean, 8 | } from "../fi/hg/core/types/Boolean"; 9 | 10 | import { 11 | parseNonEmptyString as _parseNonEmptyString 12 | } from "../fi/hg/core/types/String"; 13 | 14 | function parseBoolean (value : any) : boolean | undefined { 15 | if (value.startsWith('%'+'{') && value.endsWith('}')) return undefined; 16 | return _parseBoolean(value); 17 | } 18 | 19 | function parseNonEmptyString (value : any) : string | undefined { 20 | if (value.startsWith('%'+'{') && value.endsWith('}')) return undefined; 21 | return _parseNonEmptyString(value); 22 | } 23 | 24 | /** 25 | * @__PURE__ 26 | */ 27 | export const BUILD_USAGE_URL = 'https://github.com/heusalagroup'; 28 | 29 | /** 30 | * @__PURE__ 31 | */ 32 | export const BUILD_VERSION : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_VERSION}') ?? '?'; 33 | 34 | /** 35 | * @__PURE__ 36 | */ 37 | export const BUILD_BACKEND_URL : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_BACKEND_URL}') ?? `http://0.0.0.0:8008`; 38 | 39 | /** 40 | * @__PURE__ 41 | */ 42 | export const BUILD_FEDERATION_URL : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_FEDERATION_URL}') ?? `http://0.0.0.0:8443`; 43 | 44 | /** 45 | * @__PURE__ 46 | */ 47 | export const BUILD_BACKEND_HOSTNAME : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_BACKEND_HOSTNAME}') ?? 'localhost'; 48 | 49 | /** 50 | * @__PURE__ 51 | */ 52 | export const BUILD_JWT_SECRET : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_JWT_SECRET}') ?? ''; 53 | 54 | /** 55 | * @__PURE__ 56 | */ 57 | export const BUILD_JWT_ALG : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_JWT_ALG}') ?? 'HS256'; 58 | 59 | /** 60 | * @__PURE__ 61 | */ 62 | export const BUILD_DEFAULT_LANGUAGE : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_DEFAULT_LANGUAGE}') ?? 'en'; 63 | 64 | /** 65 | * @__PURE__ 66 | */ 67 | export const BUILD_COMMAND_NAME : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_COMMAND_NAME}') ?? 'nor-backend'; 68 | 69 | /** 70 | * @__PURE__ 71 | */ 72 | export const BUILD_LOG_LEVEL : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_LOG_LEVEL}') ?? ''; 73 | 74 | /** 75 | * @__PURE__ 76 | */ 77 | export const BUILD_NODE_ENV : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_NODE_ENV}') ?? 'development'; 78 | 79 | /** 80 | * @__PURE__ 81 | */ 82 | export const BUILD_DATE : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_DATE}') ?? ''; 83 | 84 | /** 85 | * @__PURE__ 86 | */ 87 | export const BUILD_WITH_FULL_USAGE : boolean = /* @__PURE__ */parseBoolean('%{BUILD_WITH_FULL_USAGE}') ?? true; 88 | 89 | /** 90 | * @__PURE__ 91 | */ 92 | export const IS_PRODUCTION : boolean = BUILD_NODE_ENV === 'production'; 93 | 94 | /** 95 | * @__PURE__ 96 | */ 97 | export const IS_TEST : boolean = BUILD_NODE_ENV === 'test'; 98 | 99 | /** 100 | * @__PURE__ 101 | */ 102 | export const IS_DEVELOPMENT : boolean = !IS_PRODUCTION && !IS_TEST; 103 | 104 | /** 105 | * @__PURE__ 106 | */ 107 | export const BUILD_EMAIL_FROM : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_EMAIL_FROM}') ?? 'Procure Node '; 108 | 109 | /** 110 | * @__PURE__ 111 | */ 112 | export const BUILD_EMAIL_CONFIG : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_EMAIL_CONFIG}') ?? 'smtp://localhost:25'; 113 | 114 | /** 115 | * Minutes 116 | * @__PURE__ 117 | */ 118 | export const BUILD_ACCESS_TOKEN_EXPIRATION_TIME : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_ACCESS_TOKEN_EXPIRATION_TIME}') ?? '3600'; 119 | 120 | /** 121 | * @__PURE__ 122 | */ 123 | export const BUILD_BACKEND_PUBLIC_URL : string = /* @__PURE__ */parseNonEmptyString('%{BUILD_BACKEND_PUBLIC_URL}') ?? 'http://localhost:3000'; 124 | -------------------------------------------------------------------------------- /src/constants/runtime.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022-2023. Heusala Group . All rights reserved. 2 | 3 | import { parseNonEmptyString } from "../fi/hg/core/types/String"; 4 | import { LogLevel, parseLogLevel } from "../fi/hg/core/types/LogLevel"; 5 | import { 6 | BUILD_COMMAND_NAME, 7 | BUILD_LOG_LEVEL, 8 | BUILD_BACKEND_URL, 9 | BUILD_BACKEND_HOSTNAME, 10 | BUILD_JWT_SECRET, 11 | BUILD_JWT_ALG, 12 | BUILD_DEFAULT_LANGUAGE, 13 | BUILD_EMAIL_CONFIG, 14 | BUILD_EMAIL_FROM, 15 | BUILD_ACCESS_TOKEN_EXPIRATION_TIME, 16 | BUILD_BACKEND_PUBLIC_URL, 17 | BUILD_FEDERATION_URL 18 | } from "./build"; 19 | 20 | export const BACKEND_LOG_LEVEL : LogLevel = parseLogLevel(parseNonEmptyString(process?.env?.BACKEND_LOG_LEVEL) ?? parseNonEmptyString(BUILD_LOG_LEVEL)) ?? LogLevel.INFO ; 21 | export const BACKEND_SCRIPT_NAME : string = parseNonEmptyString(process?.env?.BACKEND_SCRIPT_NAME) ?? BUILD_COMMAND_NAME; 22 | export const BACKEND_URL : string = parseNonEmptyString(process?.env?.BACKEND_URL) ?? BUILD_BACKEND_URL; 23 | export const FEDERATION_URL : string = parseNonEmptyString(process?.env?.FEDERATION_URL) ?? BUILD_FEDERATION_URL; 24 | export const BACKEND_PUBLIC_URL : string = parseNonEmptyString(process?.env?.BACKEND_PUBLIC_URL) ?? BUILD_BACKEND_PUBLIC_URL; 25 | export const BACKEND_HOSTNAME : string = parseNonEmptyString(process?.env?.BACKEND_HOSTNAME) ?? BUILD_BACKEND_HOSTNAME; 26 | export const BACKEND_JWT_SECRET : string = parseNonEmptyString(process?.env?.BACKEND_JWT_SECRET) ?? BUILD_JWT_SECRET; 27 | export const BACKEND_JWT_ALG : string = parseNonEmptyString(process?.env?.BACKEND_JWT_ALG) ?? BUILD_JWT_ALG; 28 | export const BACKEND_DEFAULT_LANGUAGE : string = parseNonEmptyString(process?.env?.BACKEND_DEFAULT_LANGUAGE) ?? BUILD_DEFAULT_LANGUAGE; 29 | export const BACKEND_EMAIL_CONFIG : string = parseNonEmptyString(process?.env?.BACKEND_EMAIL_CONFIG) ?? BUILD_EMAIL_CONFIG; 30 | export const BACKEND_EMAIL_FROM : string = parseNonEmptyString(process?.env?.BACKEND_EMAIL_FROM) ?? BUILD_EMAIL_FROM; 31 | export const BACKEND_INITIAL_USERS : string | undefined = parseNonEmptyString(process?.env?.BACKEND_INITIAL_USERS); 32 | 33 | /** 34 | * Expiration time in minutes 35 | */ 36 | export const BACKEND_ACCESS_TOKEN_EXPIRATION_TIME : string = parseNonEmptyString(process?.env?.BACKEND_ACCESS_TOKEN_EXPIRATION_TIME) ?? BUILD_ACCESS_TOKEN_EXPIRATION_TIME; 37 | -------------------------------------------------------------------------------- /src/controllers/HsBackendController.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022-2023. Heusala Group . All rights reserved. 2 | 3 | import { ReadonlyJsonObject } from "../fi/hg/core/Json"; 4 | import { LogService } from "../fi/hg/core/LogService"; 5 | import { GetMapping } from "../fi/hg/core/request/GetMapping"; 6 | import { PathVariable } from "../fi/hg/core/request/PathVariable"; 7 | import { PostMapping } from "../fi/hg/core/request/PostMapping"; 8 | import { PutMapping } from "../fi/hg/core/request/PutMapping"; 9 | import { RequestBody } from "../fi/hg/core/request/RequestBody"; 10 | import { RequestHeader } from "../fi/hg/core/request/RequestHeader"; 11 | import { RequestMapping } from "../fi/hg/core/request/RequestMapping"; 12 | import { RequestParam } from "../fi/hg/core/request/RequestParam"; 13 | import { ResponseEntity } from "../fi/hg/core/request/types/ResponseEntity"; 14 | import { MATRIX_AUTHORIZATION_HEADER_NAME } from "../fi/hg/matrix/constants/matrix-routes"; 15 | import { RequestParamValueType } from "../fi/hg/core/request/types/RequestParamValueType"; 16 | import { parseMatrixRegisterKind } from "../fi/hg/matrix/types/request/register/types/MatrixRegisterKind"; 17 | import { createSynapsePreRegisterResponseDTO } from "../fi/hg/matrix/types/synapse/SynapsePreRegisterResponseDTO"; 18 | import { isSynapseRegisterRequestDTO } from "../fi/hg/matrix/types/synapse/SynapseRegisterRequestDTO"; 19 | import { createSynapseRegisterResponseDTO, SynapseRegisterResponseDTO } from "../fi/hg/matrix/types/synapse/SynapseRegisterResponseDTO"; 20 | import { createMatrixWhoAmIResponseDTO } from "../fi/hg/matrix/types/response/whoami/MatrixWhoAmIResponseDTO"; 21 | import { isMatrixLoginRequestDTO } from "../fi/hg/matrix/types/request/login/MatrixLoginRequestDTO"; 22 | import { createMatrixLoginResponseDTO, MatrixLoginResponseDTO } from "../fi/hg/matrix/types/response/login/MatrixLoginResponseDTO"; 23 | import { createMatrixDiscoveryInformationDTO } from "../fi/hg/matrix/types/response/login/types/MatrixDiscoveryInformationDTO"; 24 | import { createMatrixHomeServerDTO } from "../fi/hg/matrix/types/response/login/types/MatrixHomeServerDTO"; 25 | import { createMatrixIdentityServerInformationDTO } from "../fi/hg/matrix/types/response/login/types/MatrixIdentityServerInformationDTO"; 26 | import { createGetDirectoryRoomAliasResponseDTO, GetDirectoryRoomAliasResponseDTO } from "../fi/hg/matrix/types/response/directoryRoomAlias/GetDirectoryRoomAliasResponseDTO"; 27 | import { createMatrixRoomJoinedMembersDTO, MatrixRoomJoinedMembersDTO } from "../fi/hg/matrix/types/response/roomJoinedMembers/MatrixRoomJoinedMembersDTO"; 28 | import { createMatrixRoomJoinedMembersRoomMemberDTO } from "../fi/hg/matrix/types/response/roomJoinedMembers/types/MatrixRoomJoinedMembersRoomMemberDTO"; 29 | import { isMatrixMatrixRegisterRequestDTO } from "../fi/hg/matrix/types/request/register/MatrixRegisterRequestDTO"; 30 | import { createMatrixRegisterResponseDTO } from "../fi/hg/matrix/types/response/register/MatrixRegisterResponseDTO"; 31 | import { createGetRoomStateByTypeResponseDTO } from "../fi/hg/matrix/types/response/getRoomStateByType/GetRoomStateByTypeResponseDTO"; 32 | import { isSetRoomStateByTypeRequestDTO } from "../fi/hg/matrix/types/request/setRoomStateByType/SetRoomStateByTypeRequestDTO"; 33 | import { createPutRoomStateWithEventTypeResponseDTO, PutRoomStateWithEventTypeResponseDTO } from "../fi/hg/matrix/types/response/setRoomStateByType/PutRoomStateWithEventTypeResponseDTO"; 34 | import { isMatrixLeaveRoomRequestDTO } from "../fi/hg/matrix/types/request/leaveRoom/MatrixLeaveRoomRequestDTO"; 35 | import { createMatrixLeaveRoomResponseDTO } from "../fi/hg/matrix/types/response/leaveRoom/MatrixLeaveRoomResponseDTO"; 36 | import { isMatrixInviteToRoomRequestDTO } from "../fi/hg/matrix/types/request/inviteToRoom/MatrixInviteToRoomRequestDTO"; 37 | import { createMatrixInviteToRoomResponseDTO } from "../fi/hg/matrix/types/response/inviteToRoom/MatrixInviteToRoomResponseDTO"; 38 | import { isMatrixTextMessageDTO } from "../fi/hg/matrix/types/message/textMessage/MatrixTextMessageDTO"; 39 | import { createSendEventToRoomWithTnxIdResponseDTO } from "../fi/hg/matrix/types/response/sendEventToRoomWithTnxId/SendEventToRoomWithTnxIdResponseDTO"; 40 | import { explainMatrixCreateRoomDTO, isMatrixCreateRoomDTO, MatrixCreateRoomDTO } from "../fi/hg/matrix/types/request/createRoom/MatrixCreateRoomDTO"; 41 | import { createMatrixCreateRoomResponseDTO, MatrixCreateRoomResponseDTO } from "../fi/hg/matrix/types/response/createRoom/MatrixCreateRoomResponseDTO"; 42 | import { isMatrixJoinRoomRequestDTO } from "../fi/hg/matrix/types/request/joinRoom/MatrixJoinRoomRequestDTO"; 43 | import { createMatrixJoinRoomResponseDTO } from "../fi/hg/matrix/types/response/joinRoom/MatrixJoinRoomResponseDTO"; 44 | import { createMatrixSyncResponseDTO, MatrixSyncResponseDTO } from "../fi/hg/matrix/types/response/sync/MatrixSyncResponseDTO"; 45 | import { MatrixServerService } from "../fi/hg/matrix/server/MatrixServerService"; 46 | import { MatrixLoginType } from "../fi/hg/matrix/types/request/login/MatrixLoginType"; 47 | import { createMatrixErrorDTO, isMatrixErrorDTO, MatrixErrorDTO } from "../fi/hg/matrix/types/response/error/MatrixErrorDTO"; 48 | import { MatrixErrorCode } from "../fi/hg/matrix/types/response/error/types/MatrixErrorCode"; 49 | import { MatrixType } from "../fi/hg/matrix/types/core/MatrixType"; 50 | import { AuthorizationUtils } from "../fi/hg/core/AuthorizationUtils"; 51 | import { LogLevel } from "../fi/hg/core/types/LogLevel"; 52 | import { MatrixUtils } from "../fi/hg/matrix/MatrixUtils"; 53 | import { UserRepositoryItem } from "../fi/hg/matrix/server/types/repository/user/UserRepositoryItem"; 54 | import { DeviceRepositoryItem } from "../fi/hg/matrix/server/types/repository/device/DeviceRepositoryItem"; 55 | import { MatrixRoomId } from "../fi/hg/matrix/types/core/MatrixRoomId"; 56 | import { parseMatrixRoomVersion } from "../fi/hg/matrix/types/MatrixRoomVersion"; 57 | import { MatrixVisibility, parseMatrixVisibility } from "../fi/hg/matrix/types/request/createRoom/types/MatrixVisibility"; 58 | import { MatrixRoomCreateEventDTO } from "../fi/hg/matrix/types/event/roomCreate/MatrixRoomCreateEventDTO"; 59 | import { MatrixStateEvent } from "../fi/hg/matrix/types/core/MatrixStateEvent"; 60 | import { MatrixCreateRoomPreset } from "../fi/hg/matrix/types/request/createRoom/types/MatrixCreateRoomPreset"; 61 | import { RoomMembershipState } from "../fi/hg/matrix/types/event/roomMember/RoomMembershipState"; 62 | 63 | const LOG = LogService.createLogger('HsBackendController'); 64 | 65 | export interface WhoAmIResult { 66 | readonly accessToken: string; 67 | readonly userId: string; 68 | readonly deviceId: string; 69 | readonly device: DeviceRepositoryItem; 70 | } 71 | 72 | /** 73 | * Client facing REST backend controller 74 | */ 75 | @RequestMapping("/") 76 | export class HsBackendController { 77 | 78 | private static _matrixServer : MatrixServerService | undefined; 79 | 80 | public static setLogLevel (level: LogLevel) { 81 | LOG.setLogLevel(level); 82 | } 83 | 84 | public static setMatrixServer (value: MatrixServerService) { 85 | this._matrixServer = value; 86 | } 87 | 88 | @GetMapping("/") 89 | public static async getIndex ( 90 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 91 | required: false, 92 | defaultValue: '' 93 | }) 94 | accessHeader: string 95 | ): Promise> { 96 | try { 97 | return ResponseEntity.ok( 98 | { 99 | hello: 'world' 100 | } as unknown as ReadonlyJsonObject 101 | ); 102 | } catch (err) { 103 | return this._handleException('getIndex', err); 104 | } 105 | } 106 | 107 | /** 108 | * @param accessHeader 109 | * @see https://github.com/heusalagroup/hghs/issues/1 110 | */ 111 | @GetMapping("/_synapse/admin/v1/register") 112 | public static async getSynapseAdminRegister ( 113 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 114 | required: false, 115 | defaultValue: '' 116 | }) 117 | accessHeader: string 118 | ): Promise> { 119 | try { 120 | const nonce = await this._matrixServer.createAdminRegisterNonce(); 121 | const response = createSynapsePreRegisterResponseDTO( nonce ); 122 | return ResponseEntity.ok( response as unknown as ReadonlyJsonObject ); 123 | } catch (err) { 124 | return this._handleException('getSynapseAdminRegister', err); 125 | } 126 | } 127 | 128 | /** 129 | * 130 | * @param accessHeader 131 | * @param body 132 | * @see https://github.com/heusalagroup/hghs/issues/1 133 | */ 134 | @PostMapping("/_synapse/admin/v1/register") 135 | public static async postSynapseAdminRegister ( 136 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 137 | required: false, 138 | defaultValue: '' 139 | }) 140 | accessHeader: string, 141 | @RequestBody 142 | body: ReadonlyJsonObject 143 | ): Promise> { 144 | try { 145 | if ( !isSynapseRegisterRequestDTO(body) ) { 146 | return ResponseEntity.badRequest().body( 147 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not AuthenticateEmailDTO`) 148 | ).status(400); 149 | } 150 | // @FIXME: Implement the end point 151 | const response : SynapseRegisterResponseDTO = createSynapseRegisterResponseDTO( 152 | 'access_token', 153 | 'user_id', 154 | 'home_server', 155 | 'device_id' 156 | ); 157 | return ResponseEntity.ok( response as unknown as ReadonlyJsonObject ); 158 | } catch (err) { 159 | return this._handleException('postSynapseAdminRegister', err); 160 | } 161 | } 162 | 163 | /** 164 | * 165 | * @param accessHeader 166 | * @see https://github.com/heusalagroup/hghs/issues/2 167 | */ 168 | @GetMapping("/_matrix/client/r0/account/whoami") 169 | public static async accountWhoAmI ( 170 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 171 | required: false, 172 | defaultValue: '' 173 | }) 174 | accessHeader: string 175 | ): Promise> { 176 | try { 177 | LOG.debug(`accountWhoAmI: accessHeader = `, accessHeader); 178 | 179 | const {userId, deviceId, device} = await this._whoAmIFromAccessHeader(accessHeader); 180 | 181 | const user : UserRepositoryItem | undefined = await this._matrixServer.findUserById(userId); 182 | LOG.debug(`whoAmI: user = `, user); 183 | if (!user) { 184 | LOG.warn(`whoAmI: User not found: `, user, userId, deviceId); 185 | return ResponseEntity.badRequest().body( 186 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN_TOKEN,'Unrecognised access token.') 187 | ).status(401); 188 | } 189 | 190 | const username = user?.username; 191 | LOG.debug(`whoAmI: username = `, username); 192 | 193 | const deviceIdentifier = device?.deviceId ?? device?.id; 194 | 195 | const dto = createMatrixWhoAmIResponseDTO( 196 | MatrixUtils.getUserId(username, this._matrixServer.getHostName()), 197 | deviceIdentifier ? deviceIdentifier : undefined, 198 | false 199 | ); 200 | 201 | LOG.debug(`accountWhoAmI: response = `, dto); 202 | return ResponseEntity.ok( dto as unknown as ReadonlyJsonObject ); 203 | 204 | } catch (err) { 205 | return this._handleException('accountWhoAmI', err); 206 | } 207 | } 208 | 209 | /** 210 | * 211 | * @param accessHeader 212 | * @param body 213 | * @see https://github.com/heusalagroup/hghs/issues/3 214 | */ 215 | @PostMapping("/_matrix/client/r0/login") 216 | public static async login ( 217 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 218 | required: false, 219 | defaultValue: '' 220 | }) 221 | accessHeader: string, 222 | @RequestBody 223 | body: ReadonlyJsonObject 224 | ): Promise> { 225 | try { 226 | 227 | if (!isMatrixLoginRequestDTO(body)) { 228 | return ResponseEntity.badRequest().body( 229 | createMatrixErrorDTO(MatrixErrorCode.M_FORBIDDEN, `Body not MatrixLoginRequestDTO`) 230 | ).status(400); 231 | } 232 | 233 | if (body?.type !== MatrixLoginType.M_LOGIN_PASSWORD) { 234 | return ResponseEntity.badRequest().body( 235 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Only type ${MatrixLoginType.M_LOGIN_PASSWORD} supported`) 236 | ).status(400); 237 | } 238 | 239 | if ( body?.identifier && body?.identifier?.type !== MatrixType.M_ID_USER ) { 240 | return ResponseEntity.badRequest().body( 241 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Only identifier type ${MatrixType.M_ID_USER} supported`) 242 | ).status(400); 243 | } 244 | 245 | const user = body?.user ?? body?.identifier?.user; 246 | const password = body?.password; 247 | 248 | if ( !user || !password ) { 249 | return ResponseEntity.badRequest().body( 250 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`User or password property not defined`) 251 | ).status(400); 252 | } 253 | 254 | const deviceId = body?.device_id; 255 | 256 | const accessToken = await this._matrixServer.loginWithPassword(user, password, deviceId); 257 | if (!accessToken) { 258 | return ResponseEntity.badRequest().body( 259 | createMatrixErrorDTO(MatrixErrorCode.M_FORBIDDEN, `Access denied`) 260 | ).status(403); 261 | } 262 | 263 | const backendHostname = this._matrixServer.getHostName(); 264 | const backendUrl = this._matrixServer.getURL(); 265 | 266 | // @FIXME: Implement https://github.com/heusalagroup/hghs/issues/3 267 | const responseDto : MatrixLoginResponseDTO = createMatrixLoginResponseDTO( 268 | MatrixUtils.getUserId(user, backendHostname), 269 | accessToken, 270 | backendUrl, 271 | deviceId, 272 | createMatrixDiscoveryInformationDTO( 273 | createMatrixHomeServerDTO(backendUrl), 274 | createMatrixIdentityServerInformationDTO(backendUrl) 275 | ) 276 | ); 277 | 278 | return ResponseEntity.ok( responseDto as unknown as ReadonlyJsonObject ); 279 | 280 | } catch (err) { 281 | return this._handleException('login', err); 282 | } 283 | } 284 | 285 | /** 286 | * 287 | * @param accessHeader 288 | * @param roomAlias 289 | * @see https://github.com/heusalagroup/hghs/issues/4 290 | */ 291 | @GetMapping("/_matrix/client/r0/directory/room/:roomAlias") 292 | public static async getDirectoryRoomByName ( 293 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 294 | required: false, 295 | defaultValue: '' 296 | }) 297 | accessHeader: string, 298 | @PathVariable('roomAlias', {required: true}) 299 | roomAlias = "" 300 | ): Promise> { 301 | try { 302 | LOG.debug(`getDirectoryRoomByName: roomAlias = `, roomAlias); 303 | const response : GetDirectoryRoomAliasResponseDTO = createGetDirectoryRoomAliasResponseDTO( 304 | 'room_id', 305 | ['server1'] 306 | ); 307 | return ResponseEntity.ok( 308 | response as unknown as ReadonlyJsonObject 309 | ); 310 | } catch (err) { 311 | return this._handleException('getDirectoryRoomByName', err); 312 | } 313 | } 314 | 315 | /** 316 | * 317 | * @param accessHeader 318 | * @param roomId 319 | * @see https://github.com/heusalagroup/hghs/issues/5 320 | */ 321 | @GetMapping("/_matrix/client/r0/rooms/:roomId/joined_members") 322 | public static async getRoomJoinedMembers ( 323 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 324 | required: false, 325 | defaultValue: '' 326 | }) 327 | accessHeader: string, 328 | @PathVariable('roomId', {required: true}) 329 | roomId = "" 330 | ): Promise> { 331 | try { 332 | 333 | LOG.debug(`getRoomJoinedMembers: roomId = `, roomId); 334 | 335 | const responseDto : MatrixRoomJoinedMembersDTO = createMatrixRoomJoinedMembersDTO( 336 | { 337 | "user": createMatrixRoomJoinedMembersRoomMemberDTO("display_name", "avatar_url") 338 | } 339 | ); 340 | 341 | return ResponseEntity.ok( 342 | responseDto as unknown as ReadonlyJsonObject 343 | ); 344 | 345 | } catch (err) { 346 | return this._handleException('getRoomJoinedMembers', err); 347 | } 348 | } 349 | 350 | /** 351 | * 352 | * @param accessHeader 353 | * @param kindString 354 | * @param body 355 | * @see https://github.com/heusalagroup/hghs/issues/6 356 | */ 357 | @PostMapping("/_matrix/client/r0/register") 358 | public static async registerUser ( 359 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 360 | required: false, 361 | defaultValue: '' 362 | }) 363 | accessHeader: string, 364 | @RequestParam('kind', RequestParamValueType.STRING) 365 | kindString = "", 366 | @RequestBody 367 | body: ReadonlyJsonObject 368 | ): Promise> { 369 | try { 370 | 371 | const kind : string | undefined = parseMatrixRegisterKind(kindString); 372 | LOG.debug(`registerUser: kind = `, kind); 373 | 374 | if (!isMatrixMatrixRegisterRequestDTO(body)) { 375 | return ResponseEntity.badRequest().body( 376 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not MatrixMatrixRegisterRequestDTO`) 377 | ).status(400); 378 | } 379 | 380 | // @FIXME: Implement https://github.com/heusalagroup/hghs/issues/6 381 | const responseDto = createMatrixRegisterResponseDTO( 382 | 'user_id', 383 | 'access_token', 384 | 'home_server', 385 | 'device_id' 386 | ); 387 | 388 | return ResponseEntity.ok( 389 | responseDto as unknown as ReadonlyJsonObject 390 | ); 391 | 392 | } catch (err) { 393 | return this._handleException('registerUser', err); 394 | } 395 | } 396 | 397 | /** 398 | * 399 | * @param accessHeader 400 | * @param roomId 401 | * @param eventType 402 | * @param stateKey 403 | * @see https://github.com/heusalagroup/hghs/issues/7 404 | */ 405 | @GetMapping("/_matrix/client/r0/rooms/:roomId/state/:eventType/:stateKey") 406 | public static async getRoomStateByType ( 407 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 408 | required: false, 409 | defaultValue: '' 410 | }) 411 | accessHeader: string, 412 | @PathVariable('roomId', {required: true}) 413 | roomId = "", 414 | @PathVariable('eventType', {required: true}) 415 | eventType = "", 416 | @PathVariable('stateKey', {required: true}) 417 | stateKey = "" 418 | ): Promise> { 419 | try { 420 | LOG.debug(`getRoomStateByType: roomId = `, roomId, eventType, stateKey); 421 | const responseDto = createGetRoomStateByTypeResponseDTO('roomName'); 422 | return ResponseEntity.ok( 423 | responseDto as unknown as ReadonlyJsonObject 424 | ); 425 | } catch (err) { 426 | return this._handleException('getRoomStateByType', err); 427 | } 428 | } 429 | 430 | /** 431 | * 432 | * @param accessHeader 433 | * @param roomId 434 | * @param eventType 435 | * @param stateKey 436 | * @param body 437 | * @see https://github.com/heusalagroup/hghs/issues/8 438 | */ 439 | @PutMapping("/_matrix/client/r0/rooms/:roomId/state/:eventType/:stateKey") 440 | public static async setRoomStateByType ( 441 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 442 | required: false, 443 | defaultValue: '' 444 | }) 445 | accessHeader: string, 446 | @PathVariable('roomId', {required: true}) 447 | roomId = "", 448 | @PathVariable('eventType', {required: true}) 449 | eventType = "", 450 | @PathVariable('stateKey', {required: true}) 451 | stateKey = "", 452 | @RequestBody 453 | body: ReadonlyJsonObject 454 | ): Promise> { 455 | try { 456 | 457 | LOG.debug(`setRoomStateByType: roomId = `, roomId, eventType, stateKey); 458 | 459 | if (!isSetRoomStateByTypeRequestDTO(body)) { 460 | return ResponseEntity.badRequest().body( 461 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not SetRoomStateByTypeRequestDTO`) 462 | ).status(400); 463 | } 464 | 465 | // @todo: Implement https://github.com/heusalagroup/hghs/issues/8 466 | const responseDto : PutRoomStateWithEventTypeResponseDTO = createPutRoomStateWithEventTypeResponseDTO( 467 | eventType 468 | ); 469 | 470 | return ResponseEntity.ok( 471 | responseDto as unknown as ReadonlyJsonObject 472 | ); 473 | 474 | } catch (err) { 475 | return this._handleException('setRoomStateByType', err); 476 | } 477 | } 478 | 479 | /** 480 | * 481 | * @param accessHeader 482 | * @param roomId 483 | * @see https://github.com/heusalagroup/hghs/issues/9 484 | */ 485 | @PostMapping("/_matrix/client/r0/rooms/:roomId/forget") 486 | public static async forgetRoom ( 487 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 488 | required: false, 489 | defaultValue: '' 490 | }) 491 | accessHeader: string, 492 | @PathVariable('roomId', {required: true}) 493 | roomId = "" 494 | ): Promise> { 495 | try { 496 | LOG.debug(`forgetRoom: roomId = `, roomId); 497 | // @FIXME: Implement https://github.com/heusalagroup/hghs/issues/9 498 | return ResponseEntity.ok( 499 | {} as unknown as ReadonlyJsonObject 500 | ); 501 | } catch (err) { 502 | return this._handleException('forgetRoom', err); 503 | } 504 | } 505 | 506 | /** 507 | * 508 | * @param accessHeader 509 | * @param roomId 510 | * @param body 511 | * @see https://github.com/heusalagroup/hghs/issues/10 512 | */ 513 | @PostMapping("/_matrix/client/r0/rooms/:roomId/leave") 514 | public static async leaveRoom ( 515 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 516 | required: false, 517 | defaultValue: '' 518 | }) 519 | accessHeader: string, 520 | @PathVariable('roomId', {required: true}) 521 | roomId = "", 522 | @RequestBody 523 | body: ReadonlyJsonObject 524 | ): Promise> { 525 | try { 526 | LOG.debug(`leaveRoom: roomId = `, roomId); 527 | if (!isMatrixLeaveRoomRequestDTO(body)) { 528 | return ResponseEntity.badRequest().body( 529 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not MatrixLeaveRoomRequestDTO`) 530 | ).status(400); 531 | } 532 | const responseDto = createMatrixLeaveRoomResponseDTO(); 533 | return ResponseEntity.ok( 534 | responseDto as unknown as ReadonlyJsonObject 535 | ); 536 | } catch (err) { 537 | return this._handleException('leaveRoom', err); 538 | } 539 | } 540 | 541 | /** 542 | * 543 | * @param accessHeader 544 | * @param roomId 545 | * @param body 546 | * @see https://github.com/heusalagroup/hghs/issues/11 547 | */ 548 | @PostMapping("/_matrix/client/r0/rooms/:roomId/invite") 549 | public static async inviteToRoom ( 550 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 551 | required: false, 552 | defaultValue: '' 553 | }) 554 | accessHeader: string, 555 | @PathVariable('roomId', {required: true}) 556 | roomId = "", 557 | @RequestBody 558 | body: ReadonlyJsonObject 559 | ): Promise> { 560 | try { 561 | LOG.debug(`inviteToRoom: roomId = `, roomId); 562 | if (!isMatrixInviteToRoomRequestDTO(body)) { 563 | return ResponseEntity.badRequest().body( 564 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not MatrixInviteToRoomRequestDTO`) 565 | ).status(400); 566 | } 567 | // FIXME: Implement https://github.com/heusalagroup/hghs/issues/11 568 | const responseDto = createMatrixInviteToRoomResponseDTO(); 569 | return ResponseEntity.ok( 570 | responseDto as unknown as ReadonlyJsonObject 571 | ); 572 | } catch (err) { 573 | return this._handleException('inviteToRoom', err); 574 | } 575 | } 576 | 577 | /** 578 | * 579 | * @param accessHeader 580 | * @param roomId 581 | * @param eventName 582 | * @param tnxId 583 | * @param body 584 | * @see https://github.com/heusalagroup/hghs/issues/12 585 | */ 586 | @PutMapping("/_matrix/client/v3/rooms/:roomId/send/:eventName/:tnxId") 587 | public static async sendEventToRoomWithTnxId ( 588 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 589 | required: false, 590 | defaultValue: '' 591 | }) 592 | accessHeader: string, 593 | @PathVariable('roomId', {required: true}) 594 | roomId = "", 595 | @PathVariable('eventName', {required: true}) 596 | eventName = "", 597 | @PathVariable('tnxId', {required: true}) 598 | tnxId = "", 599 | @RequestBody 600 | body: ReadonlyJsonObject 601 | ): Promise> { 602 | try { 603 | LOG.debug(`sendEventToRoomWithTnxId: roomId = `, roomId, eventName, tnxId); 604 | if (!isMatrixTextMessageDTO(body)) { 605 | return ResponseEntity.badRequest().body( 606 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not MatrixTextMessageDTO`) 607 | ).status(400); 608 | } 609 | // TODO: Implement https://github.com/heusalagroup/hghs/issues/12 610 | const responseDto = createSendEventToRoomWithTnxIdResponseDTO('event_id'); 611 | return ResponseEntity.ok( 612 | responseDto as unknown as ReadonlyJsonObject 613 | ); 614 | } catch (err) { 615 | return this._handleException('sendEventToRoomWithTnxId', err); 616 | } 617 | } 618 | 619 | /** 620 | * 621 | * @param accessHeader 622 | * @param bodyJson 623 | * @see https://github.com/heusalagroup/hghs/issues/13 624 | */ 625 | @PostMapping("/_matrix/client/r0/createRoom") 626 | public static async createRoom ( 627 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 628 | required: false, 629 | defaultValue: '' 630 | }) 631 | accessHeader: string, 632 | @RequestBody 633 | bodyJson: ReadonlyJsonObject 634 | ): Promise> { 635 | try { 636 | 637 | LOG.debug(`createRoom: bodyJson = `, bodyJson); 638 | if (!isMatrixCreateRoomDTO(bodyJson)) { 639 | LOG.debug(`Body invalid: ${explainMatrixCreateRoomDTO(bodyJson)}`); 640 | return ResponseEntity.badRequest().body( 641 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not MatrixCreateRoomDTO`) 642 | ).status(400); 643 | } 644 | const body : MatrixCreateRoomDTO = bodyJson; 645 | 646 | LOG.debug(`createRoom: accessHeader = `, accessHeader); 647 | const { userId, deviceId } = await this._whoAmIFromAccessHeader(accessHeader); 648 | 649 | const creationContent : Partial | undefined = body?.creation_content; 650 | 651 | const visibility : MatrixVisibility = parseMatrixVisibility(body?.visibility) ?? MatrixVisibility.PRIVATE; 652 | const roomVersion = parseMatrixRoomVersion(body?.room_version) ?? this._matrixServer.getDefaultRoomVersion(); 653 | 654 | const preset : MatrixCreateRoomPreset = body?.preset ?? MatrixUtils.getRoomPresetFromVisibility(visibility); 655 | 656 | LOG.debug(`createRoom: whoAmI: `, userId, deviceId); 657 | const {roomId} = await this._matrixServer.createRoom(userId, deviceId, roomVersion, visibility); 658 | 659 | const presetStateEvents = MatrixUtils.getRoomStateEventsFromPreset(roomId, preset); 660 | 661 | const initialStateEvents : readonly MatrixStateEvent[] = body?.initial_state ?? []; 662 | 663 | // 1. Add m.room.create event 664 | await this._matrixServer.createRoomCreateEvent( 665 | userId, 666 | roomId, 667 | roomVersion, 668 | userId, 669 | creationContent 670 | ); 671 | 672 | // 2. Create m.room.member event 673 | await this._matrixServer.createRoomMemberEvent( 674 | userId, 675 | roomId, 676 | RoomMembershipState.JOIN 677 | ); 678 | 679 | // 3. TODO: Create `m.room.power_levels` event 680 | // 4. TODO: Create `m.room.canonical_alias` event if `body.room_alias_name` is defined 681 | // 5. TODO: Add events from `presetStateEvents` 682 | 683 | // 6. Add events from `initialStateEvents` 684 | let i = 0; 685 | for (; i(responseDto); 715 | 716 | } catch (err) { 717 | return this._handleException('createRoom', err); 718 | } 719 | } 720 | 721 | /** 722 | * 723 | * @param accessHeader 724 | * @param roomId 725 | * @param body 726 | * @see https://github.com/heusalagroup/hghs/issues/14 727 | */ 728 | @PostMapping("/_matrix/client/r0/rooms/:roomId/join") 729 | public static async joinToRoom ( 730 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 731 | required: false, 732 | defaultValue: '' 733 | }) 734 | accessHeader: string, 735 | @PathVariable('roomId', {required: true}) 736 | roomId = "", 737 | @RequestBody 738 | body: ReadonlyJsonObject 739 | ): Promise> { 740 | try { 741 | if (!isMatrixJoinRoomRequestDTO(body)) { 742 | return ResponseEntity.badRequest().body( 743 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN,`Body not MatrixJoinRoomRequestDTO`) 744 | ).status(400); 745 | } 746 | LOG.debug(`joinToRoom: `, body); 747 | // FIXME: Implement https://github.com/heusalagroup/hghs/issues/14 748 | const responseDto = createMatrixJoinRoomResponseDTO('room_id'); 749 | return ResponseEntity.ok( 750 | responseDto as unknown as ReadonlyJsonObject 751 | ); 752 | } catch (err) { 753 | return this._handleException('joinToRoom', err); 754 | } 755 | } 756 | 757 | /** 758 | * 759 | * @param accessHeader 760 | * @param filter 761 | * @param since 762 | * @param full_state 763 | * @param set_presence 764 | * @param timeout 765 | * @see https://github.com/heusalagroup/hghs/issues/15 766 | */ 767 | @GetMapping("/_matrix/client/r0/sync") 768 | public static async sync ( 769 | @RequestHeader(MATRIX_AUTHORIZATION_HEADER_NAME, { 770 | required: false, 771 | defaultValue: '' 772 | }) 773 | accessHeader: string, 774 | @RequestParam('filter', RequestParamValueType.STRING) 775 | filter = "", 776 | @RequestParam('since', RequestParamValueType.STRING) 777 | since = "", 778 | @RequestParam('full_state', RequestParamValueType.STRING) 779 | full_state = "", 780 | @RequestParam('set_presence', RequestParamValueType.STRING) 781 | set_presence = "", 782 | @RequestParam('timeout', RequestParamValueType.STRING) 783 | timeout = "" 784 | ): Promise> { 785 | try { 786 | LOG.debug(`sync: `, filter, since, full_state, set_presence, timeout); 787 | const responseDto : MatrixSyncResponseDTO = createMatrixSyncResponseDTO( 788 | 'next_batch' 789 | ); 790 | return ResponseEntity.ok( 791 | responseDto as unknown as ReadonlyJsonObject 792 | ); 793 | } catch (err) { 794 | return this._handleException('sync', err); 795 | } 796 | } 797 | 798 | /** 799 | * Verifies who is the requester using access token 800 | * 801 | * @param accessToken 802 | * @private 803 | */ 804 | private static async _whoAmIFromAccessToken (accessToken: string) : Promise { 805 | 806 | LOG.debug(`whoAmI: accessToken = `, accessToken); 807 | if ( !accessToken ) { 808 | LOG.warn(`Warning! No authentication token provided.`); 809 | throw createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN_TOKEN, 'Unrecognised access token.'); 810 | } 811 | 812 | const deviceId: string | undefined = await this._matrixServer.verifyAccessToken(accessToken); 813 | if (!deviceId) { 814 | throw createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN_TOKEN,'Unrecognised access token.') ; 815 | } 816 | 817 | const device = await this._matrixServer.findDeviceById(deviceId); 818 | if (!device) { 819 | LOG.warn(`whoAmI: Device not found: `, deviceId, accessToken); 820 | throw createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN_TOKEN,'Unrecognised access token.'); 821 | } 822 | 823 | const userId = device?.userId; 824 | LOG.debug(`whoAmI: userId = `, userId); 825 | if (!userId) { 826 | LOG.warn(`whoAmI: User ID invalid: `, userId, deviceId, accessToken); 827 | throw createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN_TOKEN,'Unrecognised access token.'); 828 | } 829 | 830 | return { 831 | accessToken, 832 | deviceId, 833 | device, 834 | userId 835 | }; 836 | 837 | } 838 | 839 | /** 840 | * Verifies who is the requester using Bearer auth access header value 841 | * 842 | * @param accessHeader 843 | * @private 844 | */ 845 | private static async _whoAmIFromAccessHeader (accessHeader: string) : Promise { 846 | LOG.debug(`_whoAmIFromAccessHeader: accessHeader = `, accessHeader); 847 | const accessToken = AuthorizationUtils.parseBearerToken(accessHeader); 848 | LOG.debug(`_whoAmIFromAccessHeader: accessToken = `, accessToken); 849 | return this._whoAmIFromAccessToken(accessToken); 850 | } 851 | 852 | /** 853 | * Handle exceptions 854 | * 855 | * @param callName 856 | * @param err 857 | * @private 858 | */ 859 | private static _handleException (callName: string, err: any) : ResponseEntity { 860 | LOG.error(`${callName}: ERROR: `, err); 861 | if (isMatrixErrorDTO(err)) { 862 | return ResponseEntity.badRequest().body(err).status(401); 863 | } 864 | return ResponseEntity.internalServerError().body( 865 | createMatrixErrorDTO(MatrixErrorCode.M_UNKNOWN, 'Internal Server Error') 866 | ); 867 | } 868 | 869 | } 870 | -------------------------------------------------------------------------------- /src/hghs.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022-2023. Heusala Group . All rights reserved. 2 | 3 | import { main } from "./main"; 4 | main(process.argv).then((status : number) => { 5 | process.exit(status); 6 | }).catch((err : any) => { 7 | console.error(`Error: `, err); 8 | process.exit(1); 9 | }); 10 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022-2023. Heusala Group . All rights reserved. 2 | 3 | import { BackendTranslationServiceImpl } from "./fi/hg/backend/BackendTranslationServiceImpl"; 4 | import { EmailServiceImpl } from "./fi/hg/backend/EmailServiceImpl"; 5 | import { JwtEncodeServiceImpl } from "./fi/hg/backend/JwtEncodeServiceImpl"; 6 | import { EmailService } from "./fi/hg/core/email/EmailService"; 7 | import { JwtEncodeService } from "./fi/hg/core/jwt/JwtEncodeService"; 8 | import { JwtEngine } from "./fi/hg/core/jwt/JwtEngine"; 9 | import { ProcessUtils } from "./fi/hg/core/ProcessUtils"; 10 | 11 | // Must be first import to define environment variables before anything else 12 | ProcessUtils.initEnvFromDefaultFiles(); 13 | 14 | import { 15 | BACKEND_SCRIPT_NAME, 16 | BACKEND_LOG_LEVEL, 17 | BACKEND_URL, 18 | BACKEND_HOSTNAME, 19 | BACKEND_JWT_SECRET, 20 | BACKEND_JWT_ALG, 21 | BACKEND_DEFAULT_LANGUAGE, 22 | BACKEND_EMAIL_FROM, 23 | BACKEND_EMAIL_CONFIG, 24 | BACKEND_ACCESS_TOKEN_EXPIRATION_TIME, 25 | BACKEND_INITIAL_USERS, BACKEND_PUBLIC_URL, FEDERATION_URL 26 | } from "./constants/runtime"; 27 | import { 28 | BUILD_USAGE_URL, 29 | BUILD_WITH_FULL_USAGE 30 | } from "./constants/build"; 31 | 32 | import { LogService } from "./fi/hg/core/LogService"; 33 | import { RequestClientImpl } from "./fi/hg/core/RequestClientImpl"; 34 | import { RequestServer } from "./fi/hg/core/RequestServer"; 35 | import { RequestRouterImpl } from "./fi/hg/core/requestServer/RequestRouterImpl"; 36 | import { LogLevel } from "./fi/hg/core/types/LogLevel"; 37 | 38 | LogService.setLogLevel(BACKEND_LOG_LEVEL); 39 | 40 | import { TRANSLATIONS } from "./fi/hg/core/translations"; 41 | 42 | import { Headers } from "./fi/hg/core/request/types/Headers"; 43 | Headers.setLogLevel(LogLevel.INFO); 44 | 45 | import { CommandExitStatus } from "./fi/hg/core/cmd/types/CommandExitStatus"; 46 | import { CommandArgumentUtils } from "./fi/hg/core/cmd/utils/CommandArgumentUtils"; 47 | import { ParsedCommandArgumentStatus } from "./fi/hg/core/cmd/types/ParsedCommandArgumentStatus"; 48 | import { Language, parseLanguage } from "./fi/hg/core/types/Language"; 49 | import { StaticRoutes } from "./fi/hg/core/requestServer/types/StaticRoutes"; 50 | import { parseInteger } from "./fi/hg/core/types/Number"; 51 | import { MatrixServerService } from "./fi/hg/matrix/server/MatrixServerService"; 52 | import { HsBackendController } from "./controllers/HsBackendController"; 53 | import { ServerServiceImpl } from "./fi/hg/node/requestServer/ServerServiceImpl"; 54 | import { RequestServerImpl } from "./fi/hg/node/RequestServerImpl"; 55 | 56 | const LOG = LogService.createLogger('main'); 57 | 58 | export async function main ( 59 | args: string[] = [] 60 | ) : Promise { 61 | 62 | try { 63 | 64 | RequestRouterImpl.setLogLevel(LogLevel.INFO); 65 | RequestClientImpl.setLogLevel(LogLevel.INFO); 66 | // RequestServer.setLogLevel(LogLevel.INFO); 67 | StaticRoutes.setLogLevel(LogLevel.INFO); 68 | HsBackendController.setLogLevel(LogLevel.DEBUG); 69 | MatrixServerService.setLogLevel(LogLevel.DEBUG); 70 | 71 | LOG.debug(`Loglevel as ${LogService.getLogLevelString()}`); 72 | 73 | const {scriptName, parseStatus, exitStatus, errorString} = CommandArgumentUtils.parseArguments(BACKEND_SCRIPT_NAME, args); 74 | 75 | if ( parseStatus === ParsedCommandArgumentStatus.HELP || parseStatus === ParsedCommandArgumentStatus.VERSION ) { 76 | console.log(getMainUsage(scriptName)); 77 | return exitStatus; 78 | } 79 | 80 | if (errorString) { 81 | console.error(`ERROR: ${errorString}`); 82 | return exitStatus; 83 | } 84 | 85 | const jwtService : JwtEncodeService = JwtEncodeServiceImpl.create(); 86 | const jwtEngine : JwtEngine = jwtService.createJwtEngine(BACKEND_JWT_SECRET, BACKEND_JWT_ALG); 87 | 88 | const emailService : EmailService = EmailServiceImpl.create(BACKEND_EMAIL_FROM); 89 | 90 | const defaultLanguage : Language = parseLanguage(BACKEND_DEFAULT_LANGUAGE) ?? Language.ENGLISH; 91 | 92 | const matrixServer : MatrixServerService = new MatrixServerService( 93 | BACKEND_PUBLIC_URL, 94 | BACKEND_HOSTNAME, 95 | jwtEngine, 96 | parseInteger(BACKEND_ACCESS_TOKEN_EXPIRATION_TIME) 97 | ); 98 | 99 | // Start initializing 100 | 101 | await BackendTranslationServiceImpl.initialize(defaultLanguage, TRANSLATIONS); 102 | 103 | emailService.initialize(BACKEND_EMAIL_CONFIG); 104 | 105 | await matrixServer.initialize(); 106 | 107 | if ( BACKEND_INITIAL_USERS ) { 108 | const users = BACKEND_INITIAL_USERS.split(';'); 109 | LOG.debug(`Creating initial users from "${BACKEND_INITIAL_USERS}": `, users); 110 | let i = 0; 111 | for (; i((resolve, reject) => { 148 | try { 149 | serverListener = server.on(RequestServerImpl.Event.STOPPED, () => { 150 | LOG.debug('Stopping backend server from RequestServer stop event'); 151 | serverListener = undefined; 152 | fedServer.stop(); 153 | resolve(); 154 | }); 155 | } catch(err) { 156 | reject(err); 157 | } 158 | }); 159 | 160 | let fedServerListener : any = undefined; 161 | const fedStopPromise= new Promise((resolve, reject) => { 162 | try { 163 | fedServerListener = fedServer.on(RequestServerImpl.Event.STOPPED, () => { 164 | LOG.debug('Stopping federation server from RequestServer stop event'); 165 | fedServerListener = undefined; 166 | server.stop(); 167 | resolve(); 168 | }); 169 | } catch(err) { 170 | reject(err); 171 | } 172 | }); 173 | 174 | ProcessUtils.setupDestroyHandler( () => { 175 | LOG.debug('Stopping server from process utils event'); 176 | server.stop(); 177 | fedServer.stop(); 178 | if (serverListener) { 179 | serverListener(); 180 | serverListener = undefined; 181 | } 182 | if (fedServerListener) { 183 | fedServerListener(); 184 | fedServerListener = undefined; 185 | } 186 | }, (err : any) => { 187 | LOG.error('Error while shutting down the service: ', err); 188 | }); 189 | 190 | await stopPromise; 191 | await fedStopPromise; 192 | 193 | return CommandExitStatus.OK; 194 | 195 | } catch (err) { 196 | LOG.error(`Fatal error: `, err); 197 | return CommandExitStatus.FATAL_ERROR; 198 | } 199 | 200 | } 201 | 202 | /** 203 | * 204 | * @param scriptName 205 | * @nosideeffects 206 | * @__PURE__ 207 | */ 208 | export function getMainUsage ( 209 | scriptName: string 210 | ): string { 211 | 212 | /* @__PURE__ */if ( /* @__PURE__ */BUILD_WITH_FULL_USAGE ) { 213 | 214 | return `USAGE: ${/* @__PURE__ */scriptName} [OPT(s)] ARG(1) [...ARG(N)] 215 | 216 | HG HomeServer. 217 | 218 | ...and OPT is one of: 219 | 220 | -h --help Print help 221 | -v --version Print version 222 | -- Disables option parsing 223 | 224 | Environment variables: 225 | 226 | BACKEND_LOG_LEVEL as one of: 227 | 228 | ALL 229 | DEBUG 230 | INFO 231 | WARN 232 | ERROR 233 | NONE 234 | `; 235 | } else { 236 | return `USAGE: ${/* @__PURE__ */scriptName} ARG(1) [...ARG(N)] 237 | See ${/* @__PURE__ */BUILD_USAGE_URL} 238 | `; 239 | } 240 | } 241 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "lib": [ 5 | "esnext", 6 | "dom" 7 | ], 8 | "allowJs": true, 9 | "outDir": "./dist", 10 | "rootDir": "./src", 11 | //"declaration": true, 12 | //"declarationDir": "./dist", 13 | "moduleResolution": "node", 14 | "module": "esnext", 15 | "strict": true, 16 | "noImplicitAny": true, 17 | "sourceMap": false, 18 | "esModuleInterop": true, 19 | "resolveJsonModule": true, 20 | "experimentalDecorators": true, 21 | "emitDecoratorMetadata": true, 22 | "strictNullChecks": false, 23 | "skipLibCheck": true, 24 | "forceConsistentCasingInFileNames": true, 25 | "typeRoots": [ 26 | "./node_modules/@types/" 27 | ], 28 | "noEmit": true 29 | 30 | }, 31 | "include": [ 32 | "./src/hghs.ts" 33 | ] 34 | } 35 | --------------------------------------------------------------------------------