diff --git a/03_source/api_server.del/.dockerignore b/03_source/api_server.del/.dockerignore deleted file mode 100644 index 6667a59..0000000 --- a/03_source/api_server.del/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -.git -.gitignore -.DS_Store \ No newline at end of file diff --git a/03_source/api_server.del/.editorconfig b/03_source/api_server.del/.editorconfig deleted file mode 100644 index 53b061a..0000000 --- a/03_source/api_server.del/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true \ No newline at end of file diff --git a/03_source/api_server.del/.env.example b/03_source/api_server.del/.env.example deleted file mode 100644 index f17758c..0000000 --- a/03_source/api_server.del/.env.example +++ /dev/null @@ -1,25 +0,0 @@ -# Port number -PORT=3000 - -# Postgres URL -DATABASE_URL="postgresql://postgres:secret@localhost:5432/mydb?schema=public" - -# JWT -# JWT secret key -JWT_SECRET=thisisasamplesecret -# Number of minutes after which an access token expires -JWT_ACCESS_EXPIRATION_MINUTES=30 -# Number of days after which a refresh token expires -JWT_REFRESH_EXPIRATION_DAYS=30 -# Number of minutes after which a reset password token expires -JWT_RESET_PASSWORD_EXPIRATION_MINUTES=10 -# Number of minutes after which a verify email token expires -JWT_VERIFY_EMAIL_EXPIRATION_MINUTES=10 - -# SMTP configuration options for the email service -# For testing, you can use a fake SMTP service like Ethereal: https://ethereal.email/create -SMTP_HOST=email-server -SMTP_PORT=587 -SMTP_USERNAME=email-server-username -SMTP_PASSWORD=email-server-password -EMAIL_FROM=support@yourapp.com diff --git a/03_source/api_server.del/.eslintignore b/03_source/api_server.del/.eslintignore deleted file mode 100644 index 9e87c05..0000000 --- a/03_source/api_server.del/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -bin \ No newline at end of file diff --git a/03_source/api_server.del/.eslintrc b/03_source/api_server.del/.eslintrc deleted file mode 100644 index 478ff1a..0000000 --- a/03_source/api_server.del/.eslintrc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ], - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" - }, - "rules": { - "@typescript-eslint/no-explicit-any": "off" - } -} \ No newline at end of file diff --git a/03_source/api_server.del/.gitignore b/03_source/api_server.del/.gitignore deleted file mode 100644 index f3fc1d9..0000000 --- a/03_source/api_server.del/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# Dependencies -node_modules - -# yarn error logs -yarn-error.log - -# Environment varibales -.env* -!.env*.example - -# Code coverage -coverage - -# misc -.DS_Store - -# Dev db data -db - -# TypeScript -build diff --git a/03_source/api_server.del/.lintstagedrc b/03_source/api_server.del/.lintstagedrc deleted file mode 100644 index c49a88c..0000000 --- a/03_source/api_server.del/.lintstagedrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "*.ts": "eslint" -} \ No newline at end of file diff --git a/03_source/api_server.del/.prettierrc b/03_source/api_server.del/.prettierrc deleted file mode 100644 index a333e55..0000000 --- a/03_source/api_server.del/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "semi": true, - "tabWidth": 2, - "printWidth": 100, - "singleQuote": true, - "trailingComma": "none" -} \ No newline at end of file diff --git a/03_source/api_server.del/.vscode/extensions.json b/03_source/api_server.del/.vscode/extensions.json deleted file mode 100644 index cfc4d34..0000000 --- a/03_source/api_server.del/.vscode/extensions.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "recommendations": [ - "prisma.prisma" - ] -} diff --git a/03_source/api_server.del/.vscode/settings.json b/03_source/api_server.del/.vscode/settings.json deleted file mode 100644 index 2b7e46d..0000000 --- a/03_source/api_server.del/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.formatting.provider": "yapf" -} \ No newline at end of file diff --git a/03_source/api_server.del/CONTRIBUTING.md b/03_source/api_server.del/CONTRIBUTING.md deleted file mode 100644 index 1098f7a..0000000 --- a/03_source/api_server.del/CONTRIBUTING.md +++ /dev/null @@ -1,61 +0,0 @@ -# Contributing to prisma-express-typescript-boilerplate - -Thank you for your interest in contributing to the prisma-express-typescript-boilerplate project! Your contributions are valuable in making this project better for everyone. Before you start contributing, please take a moment to review the guidelines below. - -## Getting Started - -1. **Fork the Repository**: Start by forking the prisma-express-typescript-boilerplate repository to your own GitHub account. You can do this by clicking the "Fork" button on the repository page. - -2. **Clone the Repository**: Clone your forked repository to your local machine using the following command: - - ```git clone https://github.com/your-username/prisma-express-typescript-boilerplate.git ``` - - -3. **Install Dependencies**: Navigate to the cloned repository directory and install the project dependencies by running: - -```npm install``` - - -## Making Changes - -1. **Create a Branch**: Create a new branch for your changes. Use a descriptive name that reflects the nature of your contribution. For example: - -```git checkout -b my-contribution``` - -2. **Implement Your Changes**: Make the necessary modifications and improvements to the project. This could involve bug fixes, feature enhancements, documentation updates, or any other relevant changes. - -3. **Test Your Changes**: Ensure that your modifications work as intended and don't introduce any regressions. Run the existing tests using: - -```npm test``` - -If you're adding new features, consider writing tests to cover the new functionality. - -4. **Commit Your Changes**: Once you're satisfied with your changes, commit them with a clear and descriptive commit message: - -```git add .``` - -```git commit -m "Add my contribution``` - - -5. **Push Your Changes**: Push your changes to your forked repository: - - -## Submitting a Pull Request - -1. **Open a Pull Request**: Go to the main page of your forked repository on GitHub and switch to the branch you just pushed. Click on the "Compare & pull request" button next to the branch name. - -2. **Provide a Description**: In the pull request description, clearly explain the purpose and details of your contribution. Reference any relevant issues or feature requests if applicable. - -3. **Review Process**: The project maintainers will review your pull request, providing feedback or suggesting changes if necessary. Be open to discussion and iterate on your changes based on the feedback received. - -4. **Merge Your Pull Request**: Once your pull request has been approved and passes the review process, it will be merged into the main repository. Congratulations on your successful contribution! - -## Code of Conduct - -Please note that the prisma-express-typescript-boilerplate project follows a Code of Conduct. Respectful and inclusive behavior is expected from all contributors. Familiarize yourself with the project's Code of Conduct to ensure a positive and welcoming environment for everyone. - -## Getting Help - -If you have any questions or need assistance during the contribution process, don't hesitate to reach out to the project maintainers by opening an issue on the repository. They will be happy to help you. - -Thank you for your interest in contributing to the prisma-express-typescript-boilerplate project. Your contributions make a difference! diff --git a/03_source/api_server.del/Dockerfile b/03_source/api_server.del/Dockerfile deleted file mode 100644 index a35383c..0000000 --- a/03_source/api_server.del/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM node:18-alpine3.16 - -RUN mkdir -p /usr/src/node-app && chown -R node:node /usr/src/node-app - -WORKDIR /usr/src/node-app - -COPY package.json yarn.lock ./ - -USER node - -RUN yarn install --pure-lockfile - -COPY --chown=node:node . . - -EXPOSE 3000 diff --git a/03_source/api_server.del/LICENSE b/03_source/api_server.del/LICENSE deleted file mode 100644 index 21693ad..0000000 --- a/03_source/api_server.del/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Antonio Lázaro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/03_source/api_server.del/README.md b/03_source/api_server.del/README.md deleted file mode 100644 index dfabde1..0000000 --- a/03_source/api_server.del/README.md +++ /dev/null @@ -1,370 +0,0 @@ -# RESTful API Node Server Boilerplate - -A boilerplate/starter project for quickly building RESTful APIs using [Node.js](https://nodejs.org), [TypeScript](https://www.typescriptlang.org), [Express](https://expressjs.com), and [Prisma](https://www.prisma.io). - -This project is an adaptation of the project [RESTful API Node Server Boilerplate](https://github.com/hagopj13/node-express-boilerplate) using a [PostgreSQL](https://www.postgresql.org) database with [Prisma](https://www.prisma.io) ORM. Many of the files are just an adaptation to [TypeScript](https://www.typescriptlang.org) from the files of the previously mentioned project. - -## Quick Start - -Clone the repo: - -```bash -git clone --depth 1 https://github.com/antonio-lazaro/prisma-express-typescript-boilerplate.git -cd prisma-express-typescript-boilerplate -npx rimraf ./.git -``` - -Install the dependencies: - -```bash -yarn install -``` - -Set the environment variables: - -```bash -cp .env.example .env - -# open .env and modify the environment variables (if needed) -``` - -## Table of Contents - -- [RESTful API Node Server Boilerplate](#restful-api-node-server-boilerplate) - - [Quick Start](#quick-start) - - [Table of Contents](#table-of-contents) - - [Features](#features) - - [Commands](#commands) - - [Environment Variables](#environment-variables) - - [Project Structure](#project-structure) - - [API Documentation](#api-documentation) - - [API Endpoints](#api-endpoints) - - [Error Handling](#error-handling) - - [Validation](#validation) - - [Authentication](#authentication) - - [Authorization](#authorization) - - [Logging](#logging) - - [Linting](#linting) - - [Contributing](#contributing) - - [Inspirations](#inspirations) - - [License](#license) - -## Features - -- **SQL database**: [PostgreSQL](https://www.postgresql.org) object data modeling using [Prisma](https://www.prisma.io) ORM -- **Authentication and authorization**: using [passport](http://www.passportjs.org) -- **Validation**: request data validation using [Joi](https://joi.dev) -- **Logging**: using [winston](https://github.com/winstonjs/winston) and [morgan](https://github.com/expressjs/morgan) -- `future` **Testing**: unit and integration tests using [Jest](https://jestjs.io) -- **Error handling**: centralized error handling mechanism -- **API documentation**: with [swagger-jsdoc](https://github.com/Surnet/swagger-jsdoc) and [swagger-ui-express](https://github.com/scottie1984/swagger-ui-express) -- **Process management**: advanced production process management using [PM2](https://pm2.keymetrics.io) -- **Dependency management**: with [Yarn](https://yarnpkg.com) -- **Environment variables**: using [dotenv](https://github.com/motdotla/dotenv) and [cross-env](https://github.com/kentcdodds/cross-env#readme) -- **Security**: set security HTTP headers using [helmet](https://helmetjs.github.io) -- **Santizing**: sanitize request data against xss and query injection -- **CORS**: Cross-Origin Resource-Sharing enabled using [cors](https://github.com/expressjs/cors) -- **Compression**: gzip compression with [compression](https://github.com/expressjs/compression) -- **Docker support** -- **Code coverage**: using [coveralls](https://coveralls.io) -- **Code quality**: with [Codacy](https://www.codacy.com) -- **Git hooks**: with [Husky](https://github.com/typicode/husky) and [lint-staged](https://github.com/okonet/lint-staged) -- **Linting**: with [ESLint](https://eslint.org) and [Prettier](https://prettier.io) -- **Editor config**: consistent editor configuration using [EditorConfig](https://editorconfig.org) - -## Commands - -Running locally: - -```bash -yarn dev -``` - -Running in production: - -```bash -yarn start -``` - -Testing: - -```bash -# run all tests -yarn test - -# run all tests in watch mode -yarn test:watch - -# run test coverage -yarn coverage -``` - -Database: - -```bash -# push changes to db -yarn db:push - -# start prisma studio -yarn db:studio -``` - -Docker: - -```bash -# run docker container in development mode -yarn docker:dev - -# run docker container in production mode -yarn docker:prod - -# run all tests in a docker container -yarn docker:test - -# run docker container with PostgreSQL db -yarn docker:dev-db:start - -# stop docker container with PostgreSQL db -yarn docker:dev-db:stop -``` - -Linting: - -```bash -# run ESLint -yarn lint - -# fix ESLint errors -yarn lint:fix - -# run prettier -yarn prettier - -# fix prettier errors -yarn prettier:fix -``` - -## Environment Variables - -The environment variables can be found and modified in the `.env` file. They come with these default values: - -```bash -# Port number -PORT=3000 - -# URL of the PostgreSQL database -DATABASE_URL=postgresql://postgres:secret@localhost:5432/mydb?schema=public - -# JWT -# JWT secret key -JWT_SECRET=thisisasamplesecret -# Number of minutes after which an access token expires -JWT_ACCESS_EXPIRATION_MINUTES=30 -# Number of days after which a refresh token expires -JWT_REFRESH_EXPIRATION_DAYS=30 - -# SMTP configuration options for the email service -# For testing, you can use a fake SMTP service like Ethereal: https://ethereal.email/create -SMTP_HOST=email-server -SMTP_PORT=587 -SMTP_USERNAME=email-server-username -SMTP_PASSWORD=email-server-password -EMAIL_FROM=support@yourapp.com -``` - -## Project Structure - -``` -src\ - |--config\ # Environment variables and configuration related things - |--controllers\ # Route controllers (controller layer) - |--docs\ # Swagger files - |--middlewares\ # Custom express middlewares - |--routes\ # Routes - |--services\ # Business logic (service layer) - |--utils\ # Utility classes and functions - |--validations\ # Request data validation schemas - |--app.js # Express app - |--index.js # App entry point -``` - -## API Documentation - -To view the list of available APIs and their specifications, run the server and go to `http://localhost:3000/v1/docs` in your browser. This documentation page is automatically generated using the [swagger](https://swagger.io/) definitions written as comments in the route files. - -### API Endpoints - -List of available routes: - -**Auth routes**:\ -`POST /v1/auth/register` - register\ -`POST /v1/auth/login` - login\ -`POST /v1/auth/refresh-tokens` - refresh auth tokens\ -`POST /v1/auth/forgot-password` - send reset password email\ -`POST /v1/auth/reset-password` - reset password\ -`POST /v1/auth/send-verification-email` - send verification email\ -`POST /v1/auth/verify-email` - verify email - -**User routes**:\ -`POST /v1/users` - create a user\ -`GET /v1/users` - get all users\ -`GET /v1/users/:userId` - get user\ -`PATCH /v1/users/:userId` - update user\ -`DELETE /v1/users/:userId` - delete user - -## Error Handling - -The app has a centralized error handling mechanism. - -Controllers should try to catch the errors and forward them to the error handling middleware (by calling `next(error)`). For convenience, you can also wrap the controller inside the catchAsync utility wrapper, which forwards the error. - -```javascript -const catchAsync = require('../utils/catchAsync'); - -const controller = catchAsync(async (req, res) => { - // this error will be forwarded to the error handling middleware - throw new Error('Something wrong happened'); -}); -``` - -The error handling middleware sends an error response, which has the following format: - -```json -{ - "code": 404, - "message": "Not found" -} -``` - -When running in development mode, the error response also contains the error stack. - -The app has a utility ApiError class to which you can attach a response code and a message, and then throw it from anywhere (catchAsync will catch it). - -For example, if you are trying to get a user from the DB who is not found, and you want to send a 404 error, the code should look something like: - -```javascript -const httpStatus = require('http-status'); -const ApiError = require('../utils/ApiError'); -const User = require('../models/User'); - -const getUser = async (userId) => { - const user = await User.findById(userId); - if (!user) { - throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); - } -}; -``` - -## Validation - -Request data is validated using [Joi](https://joi.dev/). Check the [documentation](https://joi.dev/api/) for more details on how to write Joi validation schemas. - -The validation schemas are defined in the `src/validations` directory and are used in the routes by providing them as parameters to the `validate` middleware. - -```javascript -const express = require('express'); -const validate = require('../../middlewares/validate'); -const userValidation = require('../../validations/user.validation'); -const userController = require('../../controllers/user.controller'); - -const router = express.Router(); - -router.post('/users', validate(userValidation.createUser), userController.createUser); -``` - -## Authentication - -To require authentication for certain routes, you can use the `auth` middleware. - -```javascript -const express = require('express'); -const auth = require('../../middlewares/auth'); -const userController = require('../../controllers/user.controller'); - -const router = express.Router(); - -router.post('/users', auth(), userController.createUser); -``` - -These routes require a valid JWT access token in the Authorization request header using the Bearer schema. If the request does not contain a valid access token, an Unauthorized (401) error is thrown. - -**Generating Access Tokens**: - -An access token can be generated by making a successful call to the register (`POST /v1/auth/register`) or login (`POST /v1/auth/login`) endpoints. The response of these endpoints also contains refresh tokens (explained below). - -An access token is valid for 30 minutes. You can modify this expiration time by changing the `JWT_ACCESS_EXPIRATION_MINUTES` environment variable in the .env file. - -**Refreshing Access Tokens**: - -After the access token expires, a new access token can be generated, by making a call to the refresh token endpoint (`POST /v1/auth/refresh-tokens`) and sending along a valid refresh token in the request body. This call returns a new access token and a new refresh token. - -A refresh token is valid for 30 days. You can modify this expiration time by changing the `JWT_REFRESH_EXPIRATION_DAYS` environment variable in the .env file. - -## Authorization - -The `auth` middleware can also be used to require certain rights/permissions to access a route. - -```javascript -const express = require('express'); -const auth = require('../../middlewares/auth'); -const userController = require('../../controllers/user.controller'); - -const router = express.Router(); - -router.post('/users', auth('manageUsers'), userController.createUser); -``` - -In the example above, an authenticated user can access this route only if that user has the `manageUsers` permission. - -The permissions are role-based. You can view the permissions/rights of each role in the `src/config/roles.js` file. - -If the user making the request does not have the required permissions to access this route, a Forbidden (403) error is thrown. - -## Logging - -Import the logger from `src/config/logger.js`. It is using the [Winston](https://github.com/winstonjs/winston) logging library. - -Logging should be done according to the following severity levels (ascending order from most important to least important): - -```javascript -const logger = require('/config/logger'); - -logger.error('message'); // level 0 -logger.warn('message'); // level 1 -logger.info('message'); // level 2 -logger.http('message'); // level 3 -logger.verbose('message'); // level 4 -logger.debug('message'); // level 5 -``` - -In development mode, log messages of all severity levels will be printed to the console. - -In production mode, only `info`, `warn`, and `error` logs will be printed to the console.\ -It is up to the server (or process manager) to actually read them from the console and store them in log files.\ -This app uses pm2 in production mode, which is already configured to store the logs in log files. - -Note: API request information (request url, response code, timestamp, etc.) are also automatically logged (using [morgan](https://github.com/expressjs/morgan)). - -## Linting - -Linting is done using [ESLint](https://eslint.org/) and [Prettier](https://prettier.io). - -In this app, ESLint is configured to follow the [Airbnb JavaScript style guide](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb-base) with some modifications. It also extends [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) to turn off all rules that are unnecessary or might conflict with Prettier. - -To modify the ESLint configuration, update the `.eslintrc.json` file. To modify the Prettier configuration, update the `.prettierrc.json` file. - -To prevent a certain file or directory from being linted, add it to `.eslintignore` and `.prettierignore`. - -To maintain a consistent coding style across different IDEs, the project contains `.editorconfig` - -## Contributing - -Contributions are more than welcome! Please check out the [contributing guide](CONTRIBUTING.md). - -## Inspirations - -- [RESTful API Node Server Boilerplate](https://github.com/hagopj13/node-express-boilerplate) - -## License - -[MIT](LICENSE) diff --git a/03_source/api_server.del/docker-compose.dev.yml b/03_source/api_server.del/docker-compose.dev.yml deleted file mode 100644 index 4bfebad..0000000 --- a/03_source/api_server.del/docker-compose.dev.yml +++ /dev/null @@ -1,8 +0,0 @@ -services: - node-app: - container_name: node-app-dev - # command: sleep infinity - command: yarn dev -L - ports: - - '3000:3000' - - '5555:5555' diff --git a/03_source/api_server.del/docker-compose.only-db-dev.yml b/03_source/api_server.del/docker-compose.only-db-dev.yml deleted file mode 100644 index ba04833..0000000 --- a/03_source/api_server.del/docker-compose.only-db-dev.yml +++ /dev/null @@ -1,15 +0,0 @@ -services: - db: - image: postgres - restart: always - container_name: postgresdb-util-dev - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=secret - ports: - - '5432:5432' - volumes: - - db:/var/lib/postgresql/data -volumes: - db: - driver: local diff --git a/03_source/api_server.del/docker-compose.only-db-test.yml b/03_source/api_server.del/docker-compose.only-db-test.yml deleted file mode 100644 index 2301337..0000000 --- a/03_source/api_server.del/docker-compose.only-db-test.yml +++ /dev/null @@ -1,15 +0,0 @@ -services: - db: - image: postgres - restart: always - container_name: postgresdb-util-test - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=secret - ports: - - '5432:5432' - volumes: - - db:/var/lib/postgresql/data -volumes: - db: - driver: local diff --git a/03_source/api_server.del/docker-compose.prod.yml b/03_source/api_server.del/docker-compose.prod.yml deleted file mode 100644 index d5675ad..0000000 --- a/03_source/api_server.del/docker-compose.prod.yml +++ /dev/null @@ -1,5 +0,0 @@ -services: - node-app: - container_name: node-app-prod - command: yarn start - restart: always diff --git a/03_source/api_server.del/docker-compose.test.yml b/03_source/api_server.del/docker-compose.test.yml deleted file mode 100644 index a9472c0..0000000 --- a/03_source/api_server.del/docker-compose.test.yml +++ /dev/null @@ -1,4 +0,0 @@ -services: - node-app: - container_name: node-app-test - command: yarn test diff --git a/03_source/api_server.del/docker-compose.yml b/03_source/api_server.del/docker-compose.yml deleted file mode 100644 index 795dde9..0000000 --- a/03_source/api_server.del/docker-compose.yml +++ /dev/null @@ -1,46 +0,0 @@ -volumes: - dbdata: - driver: local - -networks: - node-network: - driver: bridge - -services: - postgresdb: - image: postgres - - environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=secret - ports: - - '5432:5432' - volumes: - - dbdata:/var/lib/postgresql/data - networks: - - node-network - - mailpit: - image: axllent/mailpit - ports: - - '1025:1025' # SMTP - - '8025:8025' # Web UI - environment: - MP_UI_AUTH: 'admin:password123' # Optional auth - MP_SMTP_AUTH: 'admin:password123' - MP_SMTP_AUTH_ALLOW_INSECURE: 'true' - networks: - - node-network - - node-app: - build: . - image: node-app - ports: - - '3000:3000' - depends_on: - - postgresdb - - mailpit - volumes: - - .:/usr/src/node-app - networks: - - node-network diff --git a/03_source/api_server.del/ecosystem.config.json b/03_source/api_server.del/ecosystem.config.json deleted file mode 100644 index 6729672..0000000 --- a/03_source/api_server.del/ecosystem.config.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "apps": [ - { - "name": "app", - "script": "build/src/index.js", - "instances": 1, - "autorestart": true, - "watch": false, - "time": true, - "env": { - "NODE_ENV": "production" - } - } - ] -} \ No newline at end of file diff --git a/03_source/api_server.del/jest.config.ts b/03_source/api_server.del/jest.config.ts deleted file mode 100644 index e428c85..0000000 --- a/03_source/api_server.del/jest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testEnvironmentOptions: { - NODE_ENV: 'test' - }, - restoreMocks: true, - coveragePathIgnorePatterns: ['node_modules', 'src/config', 'src/app.ts', 'tests'], - coverageReporters: ['text', 'lcov', 'clover', 'html'] -}; diff --git a/03_source/api_server.del/package.json b/03_source/api_server.del/package.json deleted file mode 100644 index 5590b60..0000000 --- a/03_source/api_server.del/package.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "name": "prisma-express-typescript-boilerplate", - "version": "1.0.0", - "description": "REST API Boilerplate with Node JS, TypeScript, Express and Prisma", - "main": "src/index.ts", - "repository": "https://github.com/antonio-lazaro/prisma-express-typescript-boilerplate.git", - "scripts": { - "start": "yarn build && pm2 start ecosystem.config.json --no-daemon", - "dev": "cross-env NODE_ENV=development nodemon src/index.ts", - "test": "docker-compose -f docker-compose.only-db-test.yml up -d && yarn db:push && jest -i --colors --verbose --detectOpenHandles && docker-compose -f docker-compose.only-db-test.yml down", - "test:watch": "docker-compose -f docker-compose.only-db-test.yml up -d && yarn db:push && jest -i --watchAll && docker-compose -f docker-compose.only-db-test.yml down", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "prettier": "prettier --check **/*.ts", - "prettier:fix": "prettier --write **/*.ts", - "db:generate": "prisma generate", - "db:push": "prisma db push --force-reset", - "db:push:w": "npx nodemon --delay 5 --ext \"ts,tsx,prisma\" --exec \"yarn db:push && yarn seed && yarn db:studio\"", - "db:studio": "prisma studio", - "docker:prod": "docker-compose -f docker-compose.yml -f docker-compose.prod.yml up", - "docker:build": "docker-compose -f docker-compose.yml -f docker-compose.dev.yml build", - "docker:dev": "docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d", - "docker:bash": "docker-compose -f docker-compose.yml -f docker-compose.dev.yml exec -it node-app sh", - "docker:test": "docker-compose -f docker-compose.yml -f docker-compose.test.yml up", - "docker:dev-db:start": "docker-compose -f docker-compose.only-db-dev.yml up -d", - "docker:dev-db:stop": "docker-compose -f docker-compose.only-db-dev.yml down", - "prepare": "husky install", - "build": "rimraf build && tsc -p tsconfig.json", - "seed": "ts-node prisma/seed.ts", - "seed:w": "yarn nodemon --ext ts,tsx --exec \"yarn run seed\"" - }, - "keywords": [ - "node", - "node.js", - "typescript", - "boilerplate", - "express", - "rest", - "api", - "prisma", - "postgresql", - "es6", - "es7", - "es8", - "es9", - "docker", - "passport", - "joi", - "eslint", - "prettier" - ], - "author": "Antonio Lázaro", - "license": "ISC", - "devDependencies": { - "@faker-js/faker": "^7.6.0", - "@jest/globals": "^29.3.1", - "@types/compression": "^1.7.2", - "@types/cors": "^2.8.13", - "@types/express": "^4.17.14", - "@types/jest": "^29.2.5", - "@types/morgan": "^1.9.3", - "@types/node": "^18.11.13", - "@types/passport": "^1.0.11", - "@types/passport-jwt": "^3.0.7", - "@types/supertest": "^2.0.12", - "@types/swagger-jsdoc": "^6.0.1", - "@types/swagger-ui-express": "^4.1.3", - "@types/xss-filters": "^0.0.27", - "@typescript-eslint/eslint-plugin": "^5.46.1", - "@typescript-eslint/parser": "^5.46.1", - "cross-env": "^7.0.3", - "eslint": "^8.29.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "husky": "^8.0.2", - "jest": "^29.3.1", - "lint-staged": "^13.1.0", - "node-mocks-http": "^1.12.1", - "nodemon": "^2.0.20", - "prettier": "^2.8.1", - "prisma": "^4.10.1", - "supertest": "^6.3.3", - "swagger-jsdoc": "^6.2.5", - "swagger-ui-express": "^4.6.0", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "typescript": "^4.9.4" - }, - "dependencies": { - "@prisma/client": "^4.10.1", - "@types/bcryptjs": "^2.4.2", - "@types/nodemailer": "^6.4.7", - "bcryptjs": "^2.4.3", - "compression": "^1.7.4", - "cors": "^2.8.5", - "date-fns": "^4.1.0", - "dotenv": "^16.0.3", - "express": "^4.18.2", - "express-rate-limit": "^6.7.0", - "helmet": "^6.0.1", - "http-status": "^1.5.3", - "joi": "^17.7.0", - "moment": "^2.29.4", - "morgan": "^1.10.0", - "nodemailer": "^6.8.0", - "passport": "^0.6.0", - "passport-jwt": "^4.0.0", - "pm2": "^5.2.2", - "winston": "^3.8.2", - "xss-filters": "^1.2.7" - }, - "prisma": { - "seed": "ts-node prisma/seed.ts" - } -} \ No newline at end of file diff --git a/03_source/api_server.del/prisma/schema.prisma b/03_source/api_server.del/prisma/schema.prisma deleted file mode 100644 index 3498be1..0000000 --- a/03_source/api_server.del/prisma/schema.prisma +++ /dev/null @@ -1,1049 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -generator client { - provider = "prisma-client-js" - binaryTargets = ["native"] -} - -datasource db { - provider = "postgresql" - url = env("DATABASE_URL") -} - -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? - password String - role Role @default(USER) - isEmailVerified Boolean @default(false) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - Token Token[] -} - -model Token { - id Int @id @default(autoincrement()) - token String - type TokenType - expires DateTime - blacklisted Boolean - createdAt DateTime @default(now()) - user User @relation(fields: [userId], references: [id]) - userId Int - memberId Int? -} - -enum Role { - USER - ADMIN -} - -enum TokenType { - ACCESS - REFRESH - RESET_PASSWORD - VERIFY_EMAIL -} - -// REQ0044/near_by_page -model Member { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - email String @unique - name String? - Event Event[] - eventId Int? - age Int? - rank String @default("Beginner") - verified String @default("NOT_VERIFIED") - hobbies String[] @default([]) - distance String @default("10km") - location_area String @default("Sai Kung") - greetings String @default("Hi, I am") - gender String @default("not disclosed") - tall_cm Int? - weight_kg Int? - occupation String @default("not disclosed") - language String[] @default([]) - education String[] @default([]) - self_introduction String @default("") - music String[] @default([]) - pets String[] @default([]) - character String[] @default([]) -} - -// REQ0042/event-detail -model Event { - id Int @id @default(autoincrement()) - eventDate DateTime - title String - joinMembers Member[] // Assuming Member model exists - price Float - currency String - duration_m Int - ageBottom Int - ageTop Int - location String - avatar String // Assuming avatar is stored as a file path or URL - Order Order[] -} - -model Order { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - title String? - order_time DateTime @default(now()) - last_payment_date DateTime? - status String @default("pending") - Event Event[] -} - -// cms_backend - -// mapped to IProductReview -model ProductReview { - id Int @id @default(autoincrement()) - name String - rating Float - comment String - helpful Float - avatarUrl String - postedAt DateTime @default(now()) // Assuming IDateValue maps to DateTime - isPurchased Boolean - attachments String[] - ProductItem ProductItem[] - // - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} - -// mapped to IProductFilters -model ProductFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - rating String - gender String[] - category String - colors String[] - priceRange Int[] -} - -// mapped to IProductTableFilters -model ProductTableFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - stock String[] - publish String[] -} - -// mapped to IProductItem -model ProductItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - sku String - name String - code String - price Float - taxes Float - tags String[] - sizes String[] - publish String - gender String[] - coverUrl String - images String[] - colors String[] - quantity Int - category String - available Int - totalSold Int - description String - totalRatings Float - totalReviews Int - inventoryType String - subDescription String - priceSale Float? - newLabel Json - saleLabel Json - ratings Json[] - reviews ProductReview[] - testing Helloworld[] -} - -// -model Helloworld { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - hello String @default("") - ProductItem ProductItem[] -} - -model MailSender { - // Define fields for MailSender here - // Example: - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - email String - name String - avatarUrl String? - // - // SendMail Mail[] @relation("mail_from") - // ReceiveMail Mail[] @relation("mail_to") -} - -model MailLabel { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - type String - name String - color String - unreadCount Int? -} - -model MailAttachment { - // Define fields for MailAttachment here - // Example: - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - filename String - url String - size Int - // Mail Mail? @relation(fields: [mailId], references: [id]) - // mailId Int? -} - -model Mail { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - folder String - labelIds String[] - subject String - isUnread Boolean - isImportant Boolean - message String - isStarred Boolean - // - // from MailSender @relation("mail_from", fields: [mailFromId], references: [id]) - // mailFromId Int - // - // to MailSender[] @relation("mail_to") - // - // attachments MailAttachment[] -} - -model OrderHistory { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - orderTime DateTime - paymentTime DateTime - deliveryTime DateTime - completionTime DateTime - timeline Json[] - OrderItem OrderItem? @relation(fields: [orderItemId], references: [id]) - orderItemId Int? -} - -model OrderShippingAddress { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - fullAddress String - phoneNumber String - OrderItem OrderItem? @relation(fields: [orderItemId], references: [id]) - orderItemId Int? -} - -model OrderPayment { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - cardType String - cardNumber String - OrderItem OrderItem? @relation(fields: [orderItemId], references: [id]) - orderItemId Int? -} - -model OrderDelivery { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - shipBy String - speedy String - trackingNumber String - OrderItem OrderItem? @relation(fields: [orderItemId], references: [id]) - orderItemId Int? -} - -model OrderCustomer { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - email String - avatarUrl String - ipAddress String - OrderItem OrderItem? @relation(fields: [orderItemId], references: [id]) - orderItemId Int? -} - -model OrderProductItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - sku String - name String - price Float - coverUrl String - quantity Float - OrderItem OrderItem? @relation(fields: [orderItemId], references: [id]) - orderItemId Int? -} - -model OrderItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - taxes Float - status String - shipping Float - discount Float - subtotal Float - orderNumber String - totalAmount Float - totalQuantity Float - history OrderHistory[] - payment OrderPayment[] - customer OrderCustomer[] - delivery OrderDelivery[] - items OrderProductItem[] - shippingAddress OrderShippingAddress[] -} - -// src/types/tour.ts -model TourGuide { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - avatarUrl String - phoneNumber String - TourItem TourItem? @relation(fields: [tourItemId], references: [id]) - tourItemId Int? - TourFilters TourFilters? @relation(fields: [tourFiltersId], references: [id]) - tourFiltersId Int? -} - -model TourBooker { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - name String - guests Float - avatarUrl String - TourItem TourItem? @relation(fields: [tourItemId], references: [id]) - tourItemId Int? -} - -model TourItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - name String - price Float - tags String[] - content String - publish String - images String[] - durations String - priceSale Float - totalViews Float - services String[] - destination String - ratingNumber Float - bookers TourBooker[] - tourGuides TourGuide[] - available Json -} - -model TourFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - services String[] - destination String[] - tourGuides TourGuide[] - endDate DateTime - startDate DateTime -} - -// src/types/user.ts -model UserProfileCover { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - role String - coverUrl String - avatarUrl String -} - -model UserProfile { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - role String - quote String - email String - school String - country String - company String - totalFollowers Float - totalFollowing Float - // socialLinks: ISocialLink -} - -model UserProfileFollower { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - country String - avatarUrl String -} - -model UserProfileGallery { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - title String - imageUrl String - postedAt DateTime -} - -model UserProfileFriend { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - role String - avatarUrl String -} - -model UserProfilePost { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - media String - message String - personLikes Json[] - comments Json[] -} - -model UserCard { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - role String - coverUrl String - avatarUrl String - totalPosts Float - totalFollowers Float - totalFollowing Float -} - -model UserItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - city String - role String - email String - state String - status String - address String - country String - zipCode String - company String - avatarUrl String - phoneNumber String - isVerified Boolean -} - -model UserAccountBillingHistory { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - price Float - invoiceNumber String -} - -// src/types/blog.ts -model PostFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - publish String -} - -model PostHero { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - title String - coverUrl String - author Json? -} - -model PostComment { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - message String - avatarUrl String - postedAt DateTime - users Json[] - replyComment Json[] - PostItem PostItem? @relation(fields: [postItemId], references: [id]) - postItemId Int? -} - -model PostItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - title String - tags String[] - publish String - content String - coverUrl String - metaTitle String - totalViews Float - totalShares Float - description String - totalComments Float - totalFavorites Float - metaKeywords String[] - metaDescription String - comments PostComment[] - author Json - favoritePerson Json[] -} - -// src/types/calendar.ts -model CalendarFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - colors String[] - startDate DateTime - endDate DateTime -} - -model CalendarRange { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - start String? - end String? -} - -model CalendarEvent { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - color String - title String - allDay Boolean - description String - end String - start String -} - -// src/types/chat.ts -model ChatAttachment { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - size Int - type String - path String - preview String - ChatMessage ChatMessage? @relation(fields: [chatMessageId], references: [id]) - chatMessageId Int? -} - -model ChatMessage { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - body String - senderId String - contentType String - attachments ChatAttachment[] - ChatConversation ChatConversation? @relation(fields: [chatConversationId], references: [id]) - chatConversationId Int? -} - -model ChatParticipant { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - role String - email String - address String - avatarUrl String - phoneNumber String - lastActivity DateTime - status String - ChatConversation ChatConversation? @relation(fields: [chatConversationId], references: [id]) - chatConversationId Int? -} - -model ChatConversation { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - type String - unreadCount Int - messages ChatMessage[] - participants ChatParticipant[] -} - -model ChatConversations { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - allIds String[] - byId Json -} - -// src/types/checkout.ts -model CheckoutItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - size String - price Float - coverUrl String - colors String[] - quantity Float - available Float - subtotal Float - CheckoutState CheckoutState? @relation(fields: [checkoutStateId], references: [id]) - checkoutStateId Int? -} - -model CheckoutDeliveryOption { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - label String - value Float - description String -} - -model CheckoutPaymentOption { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - value String - label String - description String -} - -model CheckoutCardOption { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - value String - label String -} - -model CheckoutState { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - total Float - subtotal Float - discount Float - shipping Float - totalItems Float - items CheckoutItem[] - billing AddressItem[] -} - -// common.ts -model PaymentCard { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - cardType String - primary Boolean? - cardNumber String -} - -model AddressItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - name String - company String? - primary Boolean? - fullAddress String - phoneNumber String? - addressType String? - CheckoutState CheckoutState[] - checkoutStateId Int? - InvoiceTo Invoice[] @relation("invoice_to") - InvoiceFrom Invoice[] @relation("invoice_from") -} - -model SocialLink { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - twitter String - facebook String - linkedin String - instagram String -} - -// file.ts -model FileFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - name String - type String[] - endDate DateTime - startDate DateTime -} - -model FileShared { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - name String - email String - avatarUrl String - permission String - FolderManager FolderManager? @relation(fields: [folderManagerId], references: [id]) - folderManagerId Int? - FileManager FileManager? @relation(fields: [fileManagerId], references: [id]) - fileManagerId Int? -} - -model FolderManager { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - url String - name String - size Int - type String - tags String[] - totalFiles Int? - isFavorited Boolean - modifiedAt DateTime - shared FileShared[] -} - -model FileManager { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - url String - name String - size Int - type String - tags String[] - isFavorited Boolean - modifiedAt DateTime - shared FileShared[] -} - -model FileStore { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - modifiedAt DateTime @updatedAt - // - name String - path String - preview String - size Float - type String -} - -// invoice.ts -model InvoiceTableFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - status String - service String[] - endDate DateTime - startDate DateTime -} - -model InvoiceItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - title String - price Float - total Float - service String - quantity Int - description String - Invoice Invoice? @relation(fields: [invoiceId], references: [id]) - invoiceId Int? -} - -model Invoice { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - sent Int - taxes Float - status String - subtotal Float - discount Float - shipping Float - totalAmount Float - dueDate DateTime - invoiceNumber String - items InvoiceItem[] - createDate DateTime - invoiceTo AddressItem[] @relation("invoice_to") - invoiceFrom AddressItem[] @relation("invoice_from") -} - -// job.ts -model JobFilters { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - roles String[] - experience String - benefits String[] - locations String[] - employmentTypes String[] -} - -model JobCandidate { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - name String - role String - avatarUrl String - JobItem JobItem[] -} - -model JobCompany { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - name String - logo String - phoneNumber String - fullAddress String - JobItem JobItem[] -} - -model JobSalary { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - - type String - price Float - negotiable Boolean - JobItem JobItem[] -} - -model JobItem { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - role String - title String - content String - publish String - skills String[] - totalViews Float - experience String - benefits String[] - locations String[] - employmentTypes String[] - workingSchedule String[] - expiredDate DateTime? @db.Timestamp(3) - salary JobSalary[] - company JobCompany[] - candidates JobCandidate[] -} - -// kanban.ts -model KanbanColumn { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - Kanban Kanban? @relation(fields: [kanbanId], references: [id]) - kanbanId Int? -} - -model KanbanComment { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - message String - avatarUrl String - messageType String - KanbanTask KanbanTask? @relation(fields: [kanbanTaskId], references: [id]) - kanbanTaskId Int? -} - -model KanbanAssignee { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - role String - email String - status String - address String - avatarUrl String - phoneNumber String - lastActivity DateTime - KanbanTask KanbanTask? @relation(fields: [kanbanTaskId], references: [id]) - kanbanTaskId Int? -} - -model Reporter { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - avatarUrl String - KanbanTask KanbanTask? @relation(fields: [kanbanTaskId], references: [id]) - kanbanTaskId Int? -} - -model KanbanTask { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - name String - status String - priority String - labels String[] - description String? - attachments String[] - comments KanbanComment[] - assignee KanbanAssignee[] - due DateTime[] - reporter Reporter[] - Kanban Kanban? @relation(fields: [kanbanId], references: [id]) - kanbanId Int? -} - -model Kanban { - id Int @id @default(autoincrement()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - // - columns KanbanColumn[] - tasks KanbanTask[] -} diff --git a/03_source/api_server.del/prisma/seed.ts b/03_source/api_server.del/prisma/seed.ts deleted file mode 100644 index b60ace2..0000000 --- a/03_source/api_server.del/prisma/seed.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Event } from './seeds/Event'; -import { Member } from './seeds/Member'; -import { Order } from './seeds/Order'; -import { superuserSeed } from './seeds/superuser'; -import { userSeed } from './seeds/user'; -import { ProductReview } from './seeds/productReview'; -import { ProductItem } from './seeds/productItem'; -import { Blog } from './seeds/blog'; -import { Mail } from './seeds/mail'; -// import { File } from './seeds/_files'; -// import { Chat } from './seeds/chat'; - -(async () => { - await userSeed; - await superuserSeed; - await Member; - await Event; - await Order; - await ProductReview; - await ProductItem; - await Blog; - await Mail; - // await File; - // await Chat; -})(); diff --git a/03_source/api_server.del/prisma/seeds/Event.ts b/03_source/api_server.del/prisma/seeds/Event.ts deleted file mode 100644 index 25564d8..0000000 --- a/03_source/api_server.del/prisma/seeds/Event.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import { format, parseISO } from 'date-fns'; - -const prisma = new PrismaClient(); - -async function event() { - for (let i = 0; i < 5; i++) { - const helloworldEvent = await prisma.event.upsert({ - where: { id: i }, - update: {}, - create: { - eventDate: new Date(), - joinMembers: undefined, - title: 'event ' + i, - price: 123 + i, - currency: 'HKD', - duration_m: 480 - i, - ageBottom: 12 + i, - ageTop: 48 - i, - location: 'Hong Kong Island', - avatar: 'https://www.ionics.io/img/ionic-logo.png' - } - }); - } - - console.log('seed event done'); -} - -const Event = event() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { Event }; diff --git a/03_source/api_server.del/prisma/seeds/Member.ts b/03_source/api_server.del/prisma/seeds/Member.ts deleted file mode 100644 index 80bdb9a..0000000 --- a/03_source/api_server.del/prisma/seeds/Member.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); - -async function member() { - for (let i = 0; i < 100; i++) { - const john = await prisma.member.upsert({ - where: { email: `member${i}@example.com` }, - update: {}, - create: { - email: `member${i}@example.com`, - name: `member_${i}`, - age: 20 + i, - rank: i % 2 ? 'VIP' : 'NON_VIP', - verified: i % 3 ? 'NOT_VERIFIED' : 'VERIFIED', - hobbies: ['fishing', 'basketball', 'piano'], - distance: '40km', - location_area: 'Sai Kung', - greetings: 'Hi, I am ', - gender: 'man', - tall_cm: 172, - weight_kg: 60, - occupation: 'doctor', - language: ['English', 'French', 'Chinese'], - education: ['Degree of Computer'], - self_introduction: 'Get me know me before you love me. Get me know me before you love me.', - music: ['Classic', 'Classic', 'Classic', 'Classic', 'Classic', 'Classic'], - pets: ['Classic', 'Classic', 'Classic', 'Classic', 'Classic', 'Classic'], - character: ['Classic', 'Classic', 'Classic', 'Classic', 'Classic', 'Classic'] - } - }); - } - - console.log('seed member done'); -} - -const Member = member() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { Member }; diff --git a/03_source/api_server.del/prisma/seeds/Order.ts b/03_source/api_server.del/prisma/seeds/Order.ts deleted file mode 100644 index de9b70b..0000000 --- a/03_source/api_server.del/prisma/seeds/Order.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); - -async function order() { - for (let i = 0; i < 3; i++) { - const temp = await prisma.order.upsert({ - where: { id: i }, - update: {}, - create: { - title: 'Single Party with Dating', - order_time: new Date(), - last_payment_date: new Date(), - status: 'Pending' - } - }); - } - - console.log('seed order done'); -} - -const Order = order() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { Order }; diff --git a/03_source/api_server.del/prisma/seeds/_files.ts b/03_source/api_server.del/prisma/seeds/_files.ts deleted file mode 100644 index e7697ab..0000000 --- a/03_source/api_server.del/prisma/seeds/_files.ts +++ /dev/null @@ -1,49 +0,0 @@ -// src/_mock/_files.ts -// -import { _mock } from './_mock'; -import { _fileNames } from './assets'; - -// ---------------------------------------------------------------------- - -const GB = 1000000000 * 24; - -const URLS = [ - _mock.image.cover(2), - 'https://www.cloud.com/s/c218bo6kjuqyv66/design_suriname_2015.mp3', - 'https://www.cloud.com/s/c218bo6kjuqyv66/expertise_2015_conakry_sao-tome-and-principe_gender.mp4', - 'https://www.cloud.com/s/c218bo6kjuqyv66/money-popup-crack.pdf', - _mock.image.cover(3), - _mock.image.cover(5), - 'https://www.cloud.com/s/c218bo6kjuqyv66/large_news.txt', - 'https://www.cloud.com/s/c218bo6kjuqyv66/nauru-6015-small-fighter-left-gender.psd', - 'https://www.cloud.com/s/c218bo6kjuqyv66/tv-xs.doc', - 'https://www.cloud.com/s/c218bo6kjuqyv66/gustavia-entertainment-productivity.docx', - 'https://www.cloud.com/s/c218bo6kjuqyv66/vintage_bahrain_saipan.xls', - 'https://www.cloud.com/s/c218bo6kjuqyv66/indonesia-quito-nancy-grace-left-glad.xlsx', - 'https://www.cloud.com/s/c218bo6kjuqyv66/legislation-grain.zip', - 'https://www.cloud.com/s/c218bo6kjuqyv66/large_energy_dry_philippines.rar', - 'https://www.cloud.com/s/c218bo6kjuqyv66/footer-243-ecuador.iso', - 'https://www.cloud.com/s/c218bo6kjuqyv66/kyrgyzstan-04795009-picabo-street-guide-style.ai', - 'https://www.cloud.com/s/c218bo6kjuqyv66/india-data-large-gk-chesterton-mother.esp', - 'https://www.cloud.com/s/c218bo6kjuqyv66/footer-barbados-celine-dion.ppt', - 'https://www.cloud.com/s/c218bo6kjuqyv66/socio_respectively_366996.pptx', - 'https://www.cloud.com/s/c218bo6kjuqyv66/socio_ahead_531437_sweden_popup.wav', - 'https://www.cloud.com/s/c218bo6kjuqyv66/trinidad_samuel-morse_bring.m4v', - _mock.image.cover(11), - _mock.image.cover(17), - 'https://www.cloud.com/s/c218bo6kjuqyv66/xl_david-blaine_component_tanzania_books.pdf' -]; - -// ---------------------------------------------------------------------- - -export const _files = () => - _fileNames.map((name, index) => ({ - id: _mock.id(index), - name, - path: URLS[index], - preview: URLS[index], - size: GB / ((index + 1) * 500), - createdAt: _mock.time(index), - modifiedAt: _mock.time(index), - type: `${name.split('.').pop()}` - })); diff --git a/03_source/api_server.del/prisma/seeds/_mock.ts b/03_source/api_server.del/prisma/seeds/_mock.ts deleted file mode 100644 index 2bb9f84..0000000 --- a/03_source/api_server.del/prisma/seeds/_mock.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { fSub } from './utils/set-date'; - -import { CONFIG } from './global-config'; - -import { - _id, - _ages, - _roles, - _prices, - _emails, - _ratings, - _nativeS, - _nativeM, - _nativeL, - _percents, - _booleans, - _sentences, - _lastNames, - _fullNames, - _tourNames, - _jobTitles, - _taskNames, - _fileNames, - _postTitles, - _firstNames, - _eventNames, - _courseNames, - _fullAddress, - _companyNames, - _productNames, - _descriptions, - _phoneNumbers, - _countryNames -} from './assets'; - -// ---------------------------------------------------------------------- - -export const _mock = { - id: (index: number) => _id[index], - // time: (index: number) => `2024-06-${(index + 1).toString().padStart(2, '0')}T23:00:00.000Z`, - time: (index: number) => fSub({ days: index, hours: index }), - boolean: (index: number) => _booleans[index], - role: (index: number) => _roles[index], - // Text - courseNames: (index: number) => _courseNames[index], - fileNames: (index: number) => _fileNames[index], - eventNames: (index: number) => _eventNames[index], - taskNames: (index: number) => _taskNames[index], - postTitle: (index: number) => _postTitles[index], - jobTitle: (index: number) => _jobTitles[index], - tourName: (index: number) => _tourNames[index], - productName: (index: number) => _productNames[index], - sentence: (index: number) => _sentences[index], - description: (index: number) => _descriptions[index], - // Contact - email: (index: number) => _emails[index], - phoneNumber: (index: number) => _phoneNumbers[index], - fullAddress: (index: number) => _fullAddress[index], - // Name - firstName: (index: number) => _firstNames[index], - lastName: (index: number) => _lastNames[index], - fullName: (index: number) => _fullNames[index], - companyNames: (index: number) => _companyNames[index], - countryNames: (index: number) => _countryNames[index], - // Number - number: { - percent: (index: number) => _percents[index], - rating: (index: number) => _ratings[index], - age: (index: number) => _ages[index], - price: (index: number) => _prices[index], - nativeS: (index: number) => _nativeS[index], - nativeM: (index: number) => _nativeM[index], - nativeL: (index: number) => _nativeL[index] - }, - // Image - image: { - cover: (index: number) => `${CONFIG.basePath}/assets/images/cover/cover-${index + 1}.webp`, - avatar: (index: number) => `${CONFIG.basePath}/assets/images/avatar/avatar-${index + 1}.webp`, - travel: (index: number) => `${CONFIG.basePath}/assets/images/travel/travel-${index + 1}.webp`, - course: (index: number) => `${CONFIG.basePath}/assets/images/course/course-${index + 1}.webp`, - company: (index: number) => - `${CONFIG.basePath}/assets/images/company/company-${index + 1}.webp`, - product: (index: number) => - `${CONFIG.basePath}/assets/images/m-product/product-${index + 1}.webp`, - portrait: (index: number) => - `${CONFIG.basePath}/assets/images/portrait/portrait-${index + 1}.webp` - } -}; diff --git a/03_source/api_server.del/prisma/seeds/assets.ts b/03_source/api_server.del/prisma/seeds/assets.ts deleted file mode 100644 index aba637c..0000000 --- a/03_source/api_server.del/prisma/seeds/assets.ts +++ /dev/null @@ -1,674 +0,0 @@ -// ---------------------------------------------------------------------- - -export const _id = Array.from( - { length: 40 }, - (_, index) => `e99f09a7-dd88-49d5-b1c8-1daf80c2d7b${index + 1}` -); - -// ---------------------------------------------------------------------- - -export const _booleans = [ - true, - true, - true, - false, - false, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - true, - false, - false, - false, - true, - false, - false, - true, -]; - -// ---------------------------------------------------------------------- - -export const _prices = [ - 83.74, 97.14, 68.71, 85.21, 52.17, 25.18, 43.84, 60.98, 98.42, 53.37, 72.75, 56.61, 64.55, 77.32, - 60.62, 79.81, 93.68, 47.44, 76.24, 92.87, 72.91, 20.54, 94.25, 37.51, -]; - -export const _ratings = [ - 4.2, 3.7, 4.5, 3.5, 0.5, 3.0, 2.5, 2.8, 4.9, 3.6, 2.5, 1.7, 3.9, 2.8, 4.1, 4.5, 2.2, 3.2, 0.6, - 1.3, 3.8, 3.8, 3.8, 2.0, -]; - -export const _ages = [ - 30, 26, 59, 47, 29, 46, 18, 56, 39, 19, 45, 18, 46, 56, 38, 41, 44, 48, 32, 45, 42, 60, 33, 57, -]; - -export const _percents = [ - 10.1, 13.6, 28.2, 42.1, 37.2, 18.5, 40.1, 94.8, 91.4, 53.0, 25.4, 62.9, 86.6, 62.4, 35.4, 17.6, - 52.0, 6.8, 95.3, 26.6, 69.9, 92.1, 46.2, 85.6, -]; - -export const _nativeS = [ - 11, 10, 7, 10, 12, 5, 10, 1, 8, 8, 10, 11, 12, 8, 4, 11, 8, 9, 4, 9, 2, 6, 3, 7, -]; - -export const _nativeM = [ - 497, 763, 684, 451, 433, 463, 951, 194, 425, 435, 807, 521, 538, 839, 394, 269, 453, 821, 364, - 849, 804, 776, 263, 239, -]; - -export const _nativeL = [ - 9911, 1947, 9124, 6984, 8488, 2034, 3364, 8401, 8996, 5271, 8478, 1139, 8061, 3035, 6733, 3952, - 2405, 3127, 6843, 4672, 6995, 6053, 5192, 9686, -]; - -export const _fullAddress = [ - `19034 Verna Unions Apt. 164 - Honolulu, RI / 87535`, - `1147 Rohan Drive Suite 819 - Burlington, VT / 82021`, - `18605 Thompson Circle Apt. 086 - Idaho Falls, WV / 50337`, - `110 Lamar Station Apt. 730 - Hagerstown, OK / 49808`, - `36901 Elmer Spurs Apt. 762 - Miramar, DE / 92836`, - `2089 Runolfsson Harbors Suite 886 - Chapel Hill, TX / 32827`, - `279 Karolann Ports Apt. 774 - Prescott Valley, WV / 53905`, - `96607 Claire Square Suite 591 - St. Louis Park, HI / 40802`, - `9388 Auer Station Suite 573 - Honolulu, AK / 98024`, - `47665 Adaline Squares Suite 510 - Blacksburg, NE / 53515`, - `989 Vernice Flats Apt. 183 - Billings, NV / 04147`, - `91020 Wehner Locks Apt. 673 - Albany, WY / 68763`, - `585 Candelario Pass Suite 090 - Columbus, LA / 25376`, - `80988 Renner Crest Apt. 000 - Fargo, VA / 24266`, - `28307 Shayne Pike Suite 523 - North Las Vegas, AZ / 28550`, - `205 Farrell Highway Suite 333 - Rock Hill, OK / 63421`, - `253 Kara Motorway Suite 821 - Manchester, SD / 09331`, - `13663 Kiara Oval Suite 606 - Missoula, AR / 44478`, - `8110 Claire Port Apt. 703 - Anchorage, TN / 01753`, - `4642 Demetris Lane Suite 407 - Edmond, AZ / 60888`, - `74794 Asha Flat Suite 890 - Lancaster, OR / 13466`, - `8135 Keeling Pines Apt. 326 - Alexandria, MA / 89442`, - `441 Gibson Shores Suite 247 - Pasco, NM / 60678`, - `4373 Emelia Valley Suite 596 - Columbia, NM / 42586`, -]; - -// ---------------------------------------------------------------------- - -export const _emails = [ - `nannie.abernathy70@yahoo.com`, - `ashlynn.ohara62@gmail.com`, - `milo.farrell@hotmail.com`, - `violet.ratke86@yahoo.com`, - `letha.lubowitz24@yahoo.com`, - `aditya.greenfelder31@gmail.com`, - `lenna.bergnaum27@hotmail.com`, - `luella.ryan33@gmail.com`, - `joana.simonis84@gmail.com`, - `marjolaine.white94@gmail.com`, - `vergie.block82@hotmail.com`, - `vito.hudson@hotmail.com`, - `tyrel.greenholt@gmail.com`, - `dwight.block85@yahoo.com`, - `mireya13@hotmail.com`, - `dasia.jenkins@hotmail.com`, - `benny89@yahoo.com`, - `dawn.goyette@gmail.com`, - `zella.hickle4@yahoo.com`, - `avery43@hotmail.com`, - `olen.legros@gmail.com`, - `jimmie.gerhold73@hotmail.com`, - `genevieve.powlowski@hotmail.com`, - `louie.kuphal39@gmail.com`, -]; - -// ---------------------------------------------------------------------- - -export const _fullNames = [ - `Jayvion Simon`, - `Lucian Obrien`, - `Deja Brady`, - `Harrison Stein`, - `Reece Chung`, - `Lainey Davidson`, - `Cristopher Cardenas`, - `Melanie Noble`, - `Chase Day`, - `Shawn Manning`, - `Soren Durham`, - `Cortez Herring`, - `Brycen Jimenez`, - `Giana Brandt`, - `Aspen Schmitt`, - `Colten Aguilar`, - `Angelique Morse`, - `Selina Boyer`, - `Lawson Bass`, - `Ariana Lang`, - `Amiah Pruitt`, - `Harold Mcgrath`, - `Esperanza Mcintyre`, - `Mireya Conner`, -]; - -export const _firstNames = [ - `Mossie`, - `David`, - `Ebba`, - `Chester`, - `Eula`, - `Jaren`, - `Boyd`, - `Brady`, - `Aida`, - `Anastasia`, - `Gregoria`, - `Julianne`, - `Ila`, - `Elyssa`, - `Lucio`, - `Lewis`, - `Jacinthe`, - `Molly`, - `Brown`, - `Fritz`, - `Keon`, - `Ella`, - `Ken`, - `Whitney`, -]; - -export const _lastNames = [ - `Carroll`, - `Simonis`, - `Yost`, - `Hand`, - `Emmerich`, - `Wilderman`, - `Howell`, - `Sporer`, - `Boehm`, - `Morar`, - `Koch`, - `Reynolds`, - `Padberg`, - `Watsica`, - `Upton`, - `Yundt`, - `Pfeffer`, - `Parker`, - `Zulauf`, - `Treutel`, - `McDermott`, - `McDermott`, - `Cruickshank`, - `Parisian`, -]; - -// ---------------------------------------------------------------------- - -export const _phoneNumbers = [ - '+1 202-555-0143', - '+1 416-555-0198', - '+44 20 7946 0958', - '+61 2 9876 5432', - '+91 22 1234 5678', - '+49 30 123456', - '+33 1 23456789', - '+81 3 1234 5678', - '+86 10 1234 5678', - '+55 11 2345-6789', - '+27 11 123 4567', - '+7 495 123-4567', - '+52 55 1234 5678', - '+39 06 123 4567', - '+34 91 123 4567', - '+31 20 123 4567', - '+46 8 123 456', - '+41 22 123 45 67', - '+82 2 123 4567', - '+54 11 1234-5678', - '+64 9 123 4567', - '+65 1234 5678', - '+60 3-1234 5678', - '+66 2 123 4567', - '+62 21 123 4567', - '+63 2 123 4567', - '+90 212 123 45 67', - '+966 11 123 4567', - '+971 2 123 4567', - '+20 2 12345678', - '+234 1 123 4567', - '+254 20 123 4567', - '+972 3-123-4567', - '+30 21 1234 5678', - '+353 1 123 4567', - '+351 21 123 4567', - '+47 21 23 45 67', - '+45 32 12 34 56', - '+358 9 123 4567', - '+48 22 123 45 67', -]; - -// ---------------------------------------------------------------------- - -export const _countryNames = [ - 'United States', - 'Canada', - 'United Kingdom', - 'Australia', - 'India', - 'Germany', - 'France', - 'Japan', - 'China', - 'Brazil', - 'South Africa', - 'Russia', - 'Mexico', - 'Italy', - 'Spain', - 'Netherlands', - 'Sweden', - 'Switzerland', - 'South Korea', - 'Argentina', - 'New Zealand', - 'Singapore', - 'Malaysia', - 'Thailand', - 'Indonesia', - 'Philippines', - 'Turkey', - 'Saudi Arabia', - 'United Arab Emirates', - 'Egypt', - 'Nigeria', - 'Kenya', - 'Israel', - 'Greece', - 'Ireland', - 'Portugal', - 'Norway', - 'Denmark', - 'Finland', - 'Poland', -]; - -// ---------------------------------------------------------------------- - -export const _roles = [ - `CEO`, - `CTO`, - `Project Coordinator`, - `Team Leader`, - `Software Developer`, - `Marketing Strategist`, - `Data Analyst`, - `Product Owner`, - `Graphic Designer`, - `Operations Manager`, - `Customer Support Specialist`, - `Sales Manager`, - `HR Recruiter`, - `Business Consultant`, - `Financial Planner`, - `Network Engineer`, - `Content Creator`, - `Quality Assurance Tester`, - `Public Relations Officer`, - `IT Administrator`, - `Compliance Officer`, - `Event Planner`, - `Legal Counsel`, - `Training Coordinator`, -]; - -// ---------------------------------------------------------------------- - -export const _postTitles = [ - `The Future of Renewable Energy: Innovations and Challenges Ahead`, - `Exploring the Impact of Artificial Intelligence on Modern Healthcare`, - `Climate Change and Its Effects on Global Food Security`, - `The Rise of Remote Work: Benefits, Challenges, and Future Trends`, - `Understanding Blockchain Technology: Beyond Cryptocurrency`, - `Mental Health in the Digital Age: Navigating Social Media and Well-being`, - `Sustainable Fashion: How the Industry is Going Green`, - `Space Exploration: New Frontiers and the Quest for Extraterrestrial Life`, - `The Evolution of E-Commerce: Trends Shaping the Online Retail Landscape`, - `Cybersecurity in the 21st Century: Protecting Data in a Digital World`, - `The Role of Big Data in Transforming Business Strategies`, - `Genetic Engineering: Ethical Considerations and Future Prospects`, - `Urban Farming: A Solution to Food Deserts and Urban Sustainability`, - `The Psychology of Consumer Behavior: What Drives Our Purchasing Decisions?`, - `Renewable Energy vs. Fossil Fuels: Which is the Future?`, - `Artificial Intelligence in Education: Enhancing Learning Experiences`, - `The Impact of Climate Change on Global Migration Patterns`, - `5G Technology: Revolutionizing Connectivity and Communication`, - `The Gig Economy: Opportunities, Risks, and the Future of Work`, - `Smart Cities: Integrating Technology for Sustainable Urban Living`, - `The Influence of Pop Culture on Modern Society`, - `Innovations in Medicine: From Telehealth to Personalized Treatment`, - `The Environmental Cost of Fast Fashion: What Can Consumers Do?`, - `The Intersection of Art and Technology: Digital Art in the 21st Century`, -]; - -// ---------------------------------------------------------------------- - -export const _productNames = [ - `Urban Explorer Sneakers`, - `Classic Leather Loafers`, - `Mountain Trekking Boots`, - `Elegance Stiletto Heels`, - `Comfy Running Shoes`, - `Chic Ballet Flats`, - `Vintage Oxford Shoes`, - `Waterproof Hiking Boots`, - `Casual Slip-On Sneakers`, - `Premium Dress Shoes`, - `Sporty Trail Runners`, - `Sophisticated Brogues`, - `Beach Sandals`, - `Stylish Wedge Heels`, - `Lightweight Training Shoes`, - `Luxurious Moccasins`, - `Durable Work Boots`, - `Trendy Platform Sneakers`, - `Cozy Winter Boots`, - `Fashion Ankle Boots`, - `Breathable Tennis Shoes`, - `Elegant Evening Pumps`, - `Modern Skate Shoes`, - `Comfortable Walking Shoes`, -]; - -// ---------------------------------------------------------------------- - -export const _tourNames = [ - `Majestic Mountain Adventures`, - `Island Hopping Extravaganza`, - `Cultural Wonders of Europe`, - `Safari Expedition in Africa`, - `Grand Canyon Explorer`, - `Historic Cities of Asia`, - `Tropical Paradise Getaway`, - `Alaskan Wilderness Tour`, - `Mediterranean Cruise Voyage`, - `Enchanting Eastern Europe`, - `Scenic Coastal Road Trip`, - `Ancient Ruins Discovery`, - `Australian Outback Adventure`, - `Northern Lights Experience`, - `Wildlife Wonders of South America`, - `Royal Castles and Palaces`, - `Ultimate Beach Retreat`, - `National Parks Exploration`, - `Gastronomic Tour of Italy`, - `Hiking Trails of New Zealand`, - `Art and History of France`, - `Exotic Temples of India`, - `Canadian Rockies Journey`, - `Caribbean Sun and Fun`, -]; - -// ---------------------------------------------------------------------- - -export const _jobTitles = [ - `Software Engineer`, - `Marketing Manager`, - `Data Scientist`, - `Graphic Designer`, - `Financial Analyst`, - `Human Resources Specialist`, - `Project Manager`, - `Sales Executive`, - `Content Writer`, - `Network Administrator`, - `Customer Service Representative`, - `Product Manager`, - `Business Analyst`, - `Mechanical Engineer`, - `Operations Manager`, - `UX/UI Designer`, - `Accountant`, - `Social Media Manager`, - `Research Scientist`, - `Legal Advisor`, - `Public Relations Specialist`, - `Health and Safety Officer`, - `IT Support Specialist`, - `Environmental Consultant`, -]; - -// ---------------------------------------------------------------------- - -export const _companyNames = [ - `Lueilwitz and Sons`, - `Gleichner, Mueller and Tromp`, - `Nikolaus - Leuschke`, - `Hegmann, Kreiger and Bayer`, - `Grimes Inc`, - `Durgan - Murazik`, - `Altenwerth, Medhurst and Roberts`, - `Raynor Group`, - `Mraz, Donnelly and Collins`, - `Padberg - Bailey`, - `Heidenreich, Stokes and Parker`, - `Pagac and Sons`, - `Rempel, Hand and Herzog`, - `Dare - Treutel`, - `Kihn, Marquardt and Crist`, - `Nolan - Kunde`, - `Wuckert Inc`, - `Dibbert Inc`, - `Goyette and Sons`, - `Feest Group`, - `Bosco and Sons`, - `Bartell - Kovacek`, - `Schimmel - Raynor`, - `Tremblay LLC`, -]; - -// ---------------------------------------------------------------------- - -export const _tags = [ - `Technology`, - `Health and Wellness`, - `Travel`, - `Finance`, - `Education`, - `Food and Beverage`, - `Fashion`, - `Home and Garden`, - `Sports`, - `Entertainment`, - `Business`, - `Science`, - `Automotive`, - `Beauty`, - `Fitness`, - `Lifestyle`, - `Real Estate`, - `Parenting`, - `Pet Care`, - `Environmental`, - `DIY and Crafts`, - `Gaming`, - `Photography`, - `Music`, -]; - -// ---------------------------------------------------------------------- - -export const _taskNames = [ - `Prepare Monthly Financial Report`, - `Design New Marketing Campaign`, - `Analyze Customer Feedback`, - `Update Website Content`, - `Conduct Market Research`, - `Develop Software Application`, - `Organize Team Meeting`, - `Create Social Media Posts`, - `Review Project Plan`, - `Implement Security Protocols`, - `Write Technical Documentation`, - `Test New Product Features`, - `Manage Client Inquiries`, - `Train New Employees`, - `Coordinate Logistics`, - `Monitor Network Performance`, - `Develop Training Materials`, - `Draft Press Release`, - `Prepare Budget Proposal`, - `Evaluate Vendor Proposals`, - `Perform Data Analysis`, - `Conduct Quality Assurance`, - `Plan Event Logistics`, - `Optimize SEO Strategies`, -]; - -// ---------------------------------------------------------------------- - -export const _courseNames = [ - `Introduction to Python Programming`, - `Digital Marketing Fundamentals`, - `Data Science with R`, - `Graphic Design Essentials`, - `Financial Planning for Beginners`, - `Human Resource Management Basics`, - `Project Management Fundamentals`, - `Sales Techniques and Strategies`, - `Content Writing Mastery`, - `Network Security Fundamentals`, - `Customer Service Excellence`, - `Product Management Essentials`, - `Business Analytics with Excel`, - `Mechanical Engineering Principles`, - `Leadership and Team Management`, - `User Experience (UX) Design Basics`, - `Accounting Fundamentals`, - `Social Media Marketing Mastery`, - `Biotechnology Essentials`, - `Legal Studies for Non-Lawyers`, - `Public Speaking Confidence`, - `Health and Wellness Coaching`, - `Web Development Bootcamp`, - `Photography Masterclass`, -]; - -// ---------------------------------------------------------------------- - -export const _fileNames = [ - 'cover-2.jpg', - 'design-suriname-2015.mp3', - 'expertise-2015-conakry-sao-tome-and-principe-gender.mp4', - 'money-popup-crack.pdf', - 'cover-4.jpg', - 'cover-6.jpg', - 'large-news.txt', - 'nauru-6015-small-fighter-left-gender.psd', - 'tv-xs.doc', - 'gustavia-entertainment-productivity.docx', - 'vintage-bahrain-saipan.xls', - 'indonesia-quito-nancy-grace-left-glad.xlsx', - 'legislation-grain.zip', - 'large-energy-dry-philippines.rar', - 'footer-243-ecuador.iso', - 'kyrgyzstan-04795009-picabo-street-guide-style.ai', - 'india-data-large-gk-chesterton-mother.esp', - 'footer-barbados-celine-dion.ppt', - 'socio-respectively-366996.pptx', - 'socio-ahead-531437-sweden-popup.wav', - 'trinidad-samuel-morse-bring.m4v', - 'cover-12.jpg', - 'cover-18.jpg', - 'xl-david-blaine-component-tanzania-books.pdf', -]; - -export const _eventNames = [ - `Annual General Meeting`, - `Summer Music Festival`, - `Tech Innovators Conference`, - `Charity Gala Dinner`, - `Spring Art Exhibition`, - `Corporate Training Workshop`, - `Community Health Fair`, - `Startup Pitch Night`, - `Regional Sports Tournament`, - `Book Launch Event`, - `Film Premiere Screening`, - `Industry Networking Mixer`, - `Holiday Craft Fair`, - `Environmental Awareness Week`, - `New Year's Eve Party`, - `Product Release Showcase`, - `Cultural Heritage Festival`, - `Science and Technology Expo`, - `Annual Awards Ceremony`, - `Fashion Week Runway Show`, - `Food and Wine Tasting`, - `Outdoor Adventure Camp`, - `Leadership Summit`, - `Wedding Expo`, -]; - -// ---------------------------------------------------------------------- - -export const _sentences = [ - `The sun slowly set over the horizon, painting the sky in vibrant hues of orange and pink.`, - `She eagerly opened the gift, her eyes sparkling with excitement.`, - `The old oak tree stood tall and majestic, its branches swaying gently in the breeze.`, - `The aroma of freshly brewed coffee filled the air, awakening my senses.`, - `The children giggled with joy as they ran through the sprinklers on a hot summer day.`, - `He carefully crafted a beautiful sculpture out of clay, his hands skillfully shaping the intricate details.`, - `The concert was a mesmerizing experience, with the music filling the venue and the crowd cheering in delight.`, - `The waves crashed against the shore, creating a soothing symphony of sound.`, - `The scent of blooming flowers wafted through the garden, creating a fragrant paradise.`, - `She gazed up at the night sky, marveling at the twinkling stars that dotted the darkness.`, - `The professor delivered a captivating lecture, engaging the students with thought-provoking ideas.`, - `The hiker trekked through the dense forest, guided by the soft glow of sunlight filtering through the trees.`, - `The delicate butterfly gracefully fluttered from flower to flower, sipping nectar with its slender proboscis.`, - `The aroma of freshly baked cookies filled the kitchen, tempting everyone with its irresistible scent.`, - 'The majestic waterfall cascaded down the rocks, creating a breathtaking display of nature`s power.', - `The actor delivered a powerful performance, moving the audience to tears with his emotional portrayal.`, - `The book transported me to a magical world, where imagination knew no bounds.`, - `The scent of rain filled the air as dark clouds gathered overhead, promising a refreshing downpour.`, - `The chef skillfully plated the dish, turning simple ingredients into a work of culinary art.`, - `The newborn baby let out a tiny cry, announcing its arrival to the world.`, - `The athlete sprinted across the finish line, arms raised in victory as the crowd erupted in applause.`, - `The ancient ruins stood as a testament to a civilization long gone, their grandeur still awe-inspiring.`, - `The artist dipped the brush into vibrant paint, bringing the canvas to life with bold strokes and vivid colors.`, - `The laughter of children echoed through the playground, filling the atmosphere with pure joy.`, -]; - -// ---------------------------------------------------------------------- - -export const _descriptions = [ - `Occaecati est et illo quibusdam accusamus qui. Incidunt aut et molestiae ut facere aut. Est quidem iusto praesentium excepturi harum nihil tenetur facilis. Ut omnis voluptates nihil accusantium doloribus eaque debitis.`, - `Atque eaque ducimus minima distinctio velit. Laborum et veniam officiis. Delectus ex saepe hic id laboriosam officia. Odit nostrum qui illum saepe debitis ullam. Laudantium beatae modi fugit ut. Dolores consequatur beatae nihil voluptates rem maiores.`, - `Rerum eius velit dolores. Explicabo ad nemo quibusdam. Voluptatem eum suscipit et ipsum et consequatur aperiam quia. Rerum nulla sequi recusandae illum velit quia quas. Et error laborum maiores cupiditate occaecati.`, - `Et non omnis qui. Qui sunt deserunt dolorem aut velit cumque adipisci aut enim. Nihil quis quisquam nesciunt dicta nobis ab aperiam dolorem repellat. Voluptates non blanditiis. Error et tenetur iste soluta cupiditate ratione perspiciatis et. Quibusdam aliquid nam sunt et quisquam non esse.`, - `Nihil ea sunt facilis praesentium atque. Ab animi alias sequi molestias aut velit ea. Sed possimus eos. Et est aliquid est voluptatem.`, - `Non rerum modi. Accusamus voluptatem odit nihil in. Quidem et iusto numquam veniam culpa aperiam odio aut enim. Quae vel dolores. Pariatur est culpa veritatis aut dolorem.`, - `Est enim et sit non impedit aperiam cumque animi. Aut eius impedit saepe blanditiis. Totam molestias magnam minima fugiat.`, - `Unde a inventore et. Sed esse ut. Atque ducimus quibusdam fuga quas id qui fuga.`, - `Eaque natus adipisci soluta nostrum dolorem. Nesciunt ipsum molestias ut aliquid natus ut omnis qui fugiat. Dolor et rem. Ut neque voluptatem blanditiis quasi ullam deleniti.`, - `Nam et error exercitationem qui voluptate optio. Officia omnis qui accusantium ipsam qui. Quia sequi nulla perspiciatis optio vero omnis maxime omnis ipsum. Perspiciatis consequuntur asperiores veniam dolores.`, - `Perspiciatis nulla ut ut ut voluptates totam consectetur eligendi qui. Optio ut cum. Dolorum sapiente qui laborum. Impedit temporibus totam delectus nihil. Voluptatem corrupti rem.`, - `Distinctio omnis similique omnis eos. Repellat cumque rerum nisi. Reiciendis soluta non ut veniam temporibus. Accusantium et dolorem voluptas harum. Nemo eius voluptate dicta et hic nemo. Dolorem assumenda et beatae molestias sit quo mollitia quis consequatur.`, - `Sed ut mollitia tempore ipsam et illum doloribus ut. Occaecati ratione veritatis explicabo. Omnis nam omnis sunt placeat tempore accusantium placeat distinctio velit.`, - `Eum illo dicta et perspiciatis ut blanditiis eos sequi. Ea veritatis aut et voluptas aut. Laborum eos quia tempore a culpa.`, - `Aut quos quae dolores repudiandae similique perferendis perferendis earum laudantium. Facere placeat natus nobis. Eius vitae ullam dolorem.`, - `Vero dolorem et voluptatem fugit tempore a quam iure. Fuga consequatur corrupti sunt asperiores vitae. Libero totam repellendus animi debitis illum et sunt officia.`, - `Cupiditate illum officiis id molestiae. Numquam non molestiae aliquid et natus sed hic. Alias quia explicabo sed corrupti sint. Natus in et odio qui unde facilis quia. Est sit eius laboriosam aliquid non aperiam quia quo corporis.`, - `Et a ab. Optio aspernatur minus tempora amet vitae consectetur inventore cumque. Sed et omnis. Aspernatur a magnam.`, - `Ipsum omnis et. Quia ea et autem tempore consequuntur veniam dolorem officiis. Ipsa dicta et ut quidem quia doloremque. Sequi vitae doloremque temporibus. Deserunt incidunt id aperiam itaque natus. Earum sit eaque quas incidunt nihil.`, - `Quae consequatur reiciendis. Consequatur non optio. Eaque id placeat. Commodi quo officia aut repudiandae reiciendis tempore voluptatem et. Ut accusamus qui itaque maxime aliquam. Fugit ut animi molestiae porro maiores.`, - `Modi hic asperiores ab cumque quam est aut. Voluptas atque quos molestias. Ut excepturi distinctio ipsam aspernatur sit.`, - `Sunt totam facilis. Quam commodi voluptatem veniam. Tempora deleniti itaque fugit nihil voluptas.`, - `Ipsam aliquam velit nobis repellendus officiis aut deserunt id et. Nihil sunt aut dolores aut. Dolores est ipsa quia et laborum quidem laborum accusamus id. Facilis odit quod hic laudantium saepe omnis nisi in sint. Sed cupiditate possimus id.`, - `Magnam non eveniet optio optio ut aliquid atque. Velit libero aspernatur quis laborum consequatur laudantium. Tempora facere optio fugit accusantium ut. Omnis aspernatur reprehenderit autem esse ut ut enim voluptatibus.`, -]; diff --git a/03_source/api_server.del/prisma/seeds/blog.ts b/03_source/api_server.del/prisma/seeds/blog.ts deleted file mode 100644 index 15bc3c1..0000000 --- a/03_source/api_server.del/prisma/seeds/blog.ts +++ /dev/null @@ -1,222 +0,0 @@ -// src/_mock/_blog.ts -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); -import { uuidv4 } from './utils/uuidv4'; -import { _mock } from './_mock'; -import { CONFIG } from './global-config'; -import { _tags } from './assets'; - -const codeBlock = ` -
for (var i=1; i <= 20; i++) {\n  if (i % 15 == 0)\n    return "FizzBuzz"\n  else if (i % 3 == 0)\n    return "Fizz"\n  else if (i % 5 == 0)\n    return "Buzz"\n  else\n    return i\n  }
-`; - -// Made with Tiptap editor - -const CONTENT = ` -

Heading H1

-

Heading H2

-

Heading H3

-

Heading H4

-
Heading H5
-
Heading H6
-
-

Paragraph

-

What is MTAweb Directory?

-

So you have heard about this site or you have been to it, but you cannot figure out what it is or what it can do. MTA web directory is the simplest way in which one can bid on a link, or a few links if they wish to do so. The link directory on MTA displays all of the links it currently has, and does so in alphabetical order, which makes it much easier for someone to find what they are looking for if it is something specific and they do not want to go through all the other sites and links as well. It allows you to start your bid at the bottom and slowly work your way to the top of the list.

-

With a very low costing starting bid of just $1, you are guaranteed to have a spot in MTA’s successful directory list. When you would like to increase your bid to one of the top positions, you have to know that this would be a wise decision to make as it will not only get your link to be at a higher point in the directory but it will also give you a chance to have your site advertised with the rest of the top ten on the home page of the website. This means that when visitors come to MTAweb.com, your site will be one of the first things they see. In other words, you stand a great chance at getting a comeback to your site sooner than you thought.

-

This is strong text.

-

This is italic text

-

This is underline text

-

Unordered list

- -

Ordered list

-
    -
  1. -

    Analysis

    -
  2. -
  3. -

    Design

    -
  4. -
  5. -

    Implementation

    -
  6. -
-

Blockquote

-
-

Life is short, Smile while you still have teeth! 

-
-


Block code

-${codeBlock} -

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

-
Why do we use it?
-

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).

- -

It is important that you buy links because the links are what get you the results that you want. The popularity of the links that are listed in the MTA directory is in fact one of the most important factors in the performance of the search engine. Links are important and this is why you have to purchase a link in order to bid on something and the best part is that a link will only cost you $1, which is nothing compared to what you would pay if you decided to do it through any other company or website.

- -`; - -const generateComments = () => { - const userList = Array.from({ length: 12 }, (_, index) => ({ - id: _mock.id(index), - name: _mock.fullName(index), - avatarUrl: _mock.image.avatar(index) - })); - - return [ - { - // id: uuidv4(), - name: userList[0].name, - avatarUrl: userList[0].avatarUrl, - message: _mock.sentence(1), - postedAt: _mock.time(1), - users: [userList[0], userList[1], userList[2]], - replyComment: [ - { - id: uuidv4(), - userId: userList[1].id, - message: _mock.sentence(2), - postedAt: _mock.time(2) - }, - { - id: uuidv4(), - userId: userList[0].id, - message: _mock.sentence(3), - tagUser: userList[1].name, - postedAt: _mock.time(3) - }, - { - id: uuidv4(), - userId: userList[2].id, - message: _mock.sentence(4), - postedAt: _mock.time(4) - } - ] - }, - { - // id: uuidv4(), - name: userList[4].name, - avatarUrl: userList[4].avatarUrl, - message: _mock.sentence(5), - postedAt: _mock.time(5), - users: [userList[5], userList[6], userList[7]], - replyComment: [ - { - id: uuidv4(), - userId: userList[5].id, - message: _mock.sentence(6), - postedAt: _mock.time(6) - }, - { - id: uuidv4(), - userId: userList[6].id, - message: _mock.sentence(7), - postedAt: _mock.time(7) - }, - { - id: uuidv4(), - userId: userList[7].id, - message: _mock.sentence(8), - postedAt: _mock.time(8) - } - ] - }, - { - // id: uuidv4(), - name: userList[8].name, - avatarUrl: userList[8].avatarUrl, - message: _mock.sentence(9), - postedAt: _mock.time(9), - users: [], - replyComment: [] - }, - { - // id: uuidv4(), - name: userList[9].name, - avatarUrl: userList[9].avatarUrl, - message: _mock.sentence(10), - postedAt: _mock.time(10), - users: [], - replyComment: [] - } - ]; -}; - -const _posts = () => - Array.from({ length: 19 }, (_, index) => { - const comments = generateComments(); - - const publish = index % 3 ? 'published' : 'draft'; - - const metaKeywords = _tags.slice(8, 11); - - return { - // id: _mock.id(index), - publish, - metaKeywords, - content: CONTENT, - tags: _tags.slice(0, 5), - metaTitle: 'Minimal UI Kit', - createdAt: _mock.time(index), - title: _mock.postTitle(index), - coverUrl: _mock.image.cover(index), - totalViews: _mock.number.nativeL(index), - totalShares: _mock.number.nativeL(index + 2), - totalComments: _mock.number.nativeL(index + 1), - totalFavorites: _mock.number.nativeL(index + 3), - metaDescription: 'The starting point for your next project with Minimal UI Kit', - description: `Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. `, - author: { - name: _mock.fullName(index), - avatarUrl: _mock.image.avatar(index) - }, - favoritePerson: Array.from({ length: 20 }, (__, personIndex) => ({ - name: _mock.fullName(personIndex), - avatarUrl: _mock.image.avatar(personIndex) - })), - // - comments: { - create: comments - } - }; - }); - -const temp_posts = _posts(); - -async function blog() { - for (let i = 0; i < temp_posts.length; i++) { - await prisma.postItem.upsert({ - where: { id: i }, - update: {}, - create: temp_posts[i] - }); - } - console.log('generate blog-postitem done'); -} - -const Blog = blog() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { Blog }; diff --git a/03_source/api_server.del/prisma/seeds/calendar.ts.draft b/03_source/api_server.del/prisma/seeds/calendar.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/chat.ts b/03_source/api_server.del/prisma/seeds/chat.ts deleted file mode 100644 index 4c2ebeb..0000000 --- a/03_source/api_server.del/prisma/seeds/chat.ts +++ /dev/null @@ -1,592 +0,0 @@ -// src/_mock/_blog.ts -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); -import { uuidv4 } from './utils/uuidv4'; -import { _mock } from './_mock'; -import { CONFIG } from './global-config'; -import { _tags } from './assets'; -import { fSub } from './utils/set-date'; -import { fileList } from './_files.ts'; - -export const _contacts = () => - Array.from({ length: 20 }, (_, index) => ({ - id: _mock.id(index), - role: _mock.role(index), - email: _mock.email(index), - name: _mock.fullName(index), - lastActivity: _mock.time(index), - address: _mock.fullAddress(index), - avatarUrl: _mock.image.avatar(index), - phoneNumber: _mock.phoneNumber(index), - status: - ([0, 1, 6, 12].includes(index) && 'online') || - ([3, 8, 14].includes(index) && 'offline') || - ([4, 10, 16].includes(index) && 'busy') || - 'always' - })); - -export const _conversations = () => { - const myContact = { - id: '8864c717-587d-472a-929a-8e5f298024da-0', - role: 'admin', - status: 'online', - name: 'Jaydon Frankie', - email: 'demo@minimals.cc', - phoneNumber: '+40 777666555', - address: '90210 Broadway Blvd', - avatarUrl: _mock.image.avatar(24), - lastActivity: fSub({ minutes: 1 }) - }; - - const files = fileList(); - - const otherContacts = _contacts(); - - return [ - { - id: otherContacts[1].id, - participants: [myContact, otherContacts[1]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: otherContacts[1].id, - body: _mock.sentence(1), - contentType: 'text', - attachments: files.slice(0, 1), - createdAt: fSub({ hours: 5 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(2), - contentType: 'text', - attachments: files.slice(1, 2), - createdAt: fSub({ hours: 4 }) - }, - { - id: uuidv4(), - senderId: otherContacts[1].id, - body: _mock.sentence(3), - contentType: 'text', - attachments: files.slice(2, 3), - createdAt: fSub({ hours: 3 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(4), - contentType: 'text', - attachments: files.slice(3, 6), - createdAt: fSub({ hours: 2 }) - }, - { - id: uuidv4(), - senderId: otherContacts[1].id, - body: _mock.sentence(5), - contentType: 'text', - attachments: files.slice(6, 10), - createdAt: fSub({ hours: 1 }) - }, - { - id: uuidv4(), - senderId: otherContacts[1].id, - attachments: [], - contentType: 'image', - body: _mock.image.cover(4), - createdAt: fSub({ minutes: 15 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - contentType: 'text', - attachments: [], - body: _mock.sentence(6), - createdAt: fSub({ minutes: 1 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(7), - contentType: 'text', - attachments: [], - createdAt: fSub({ minutes: 0 }) - } - ] - }, - { - id: otherContacts[2].id, - participants: [myContact, otherContacts[2]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: otherContacts[2].id, - body: _mock.sentence(2), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 6 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(3), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 5 }) - }, - { - id: uuidv4(), - senderId: otherContacts[2].id, - body: _mock.sentence(4), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 4 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(5), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 7 }) - }, - { - id: uuidv4(), - senderId: otherContacts[2].id, - body: _mock.sentence(6), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 3 }) - }, - { - id: uuidv4(), - senderId: otherContacts[2].id, - body: _mock.image.cover(7), - attachments: [], - contentType: 'image', - createdAt: fSub({ hours: 2 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(8), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 1 }) - } - ] - }, - { - id: otherContacts[3].id, - participants: [myContact, otherContacts[3]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: otherContacts[3].id, - body: _mock.sentence(3), - contentType: 'text', - attachments: files.slice(0, 1), - createdAt: fSub({ hours: 8 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(4), - contentType: 'text', - attachments: files.slice(1, 2), - createdAt: fSub({ hours: 7 }) - }, - { - id: uuidv4(), - senderId: otherContacts[3].id, - body: _mock.sentence(5), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 6 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(6), - contentType: 'text', - attachments: files.slice(2, 4), - createdAt: fSub({ hours: 5 }) - }, - { - id: uuidv4(), - senderId: otherContacts[3].id, - body: _mock.sentence(7), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 4 }) - }, - { - id: uuidv4(), - senderId: otherContacts[3].id, - body: _mock.image.cover(8), - contentType: 'image', - attachments: [], - createdAt: fSub({ hours: 3 }) - }, - { - id: uuidv4(), - senderId: otherContacts[3].id, - body: _mock.image.cover(9), - contentType: 'image', - attachments: [], - createdAt: fSub({ hours: 2 }) - } - ] - }, - { - id: otherContacts[4].id, - participants: [myContact, otherContacts[4]], - type: 'ONE_TO_ONE', - unreadCount: 8, - messages: [ - { - id: uuidv4(), - senderId: otherContacts[4].id, - body: _mock.sentence(4), - contentType: 'text', - attachments: files.slice(2, 4), - createdAt: fSub({ hours: 4 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(5), - contentType: 'text', - attachments: files.slice(4, 6), - createdAt: fSub({ hours: 3 }) - }, - { - id: uuidv4(), - senderId: otherContacts[4].id, - body: _mock.sentence(6), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 2 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(7), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 1 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(8), - contentType: 'text', - attachments: files.slice(6, 10), - createdAt: fSub({ minutes: 45 }) - }, - { - id: uuidv4(), - senderId: otherContacts[4].id, - body: _mock.sentence(9), - contentType: 'text', - attachments: [], - createdAt: fSub({ minutes: 5 }) - } - ] - }, - { - id: otherContacts[5].id, - participants: [myContact, otherContacts[5]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(5), - contentType: 'text', - attachments: [], - createdAt: fSub({ minutes: 5 }) - }, - { - id: uuidv4(), - senderId: otherContacts[5].id, - body: _mock.sentence(6), - contentType: 'text', - attachments: [], - createdAt: fSub({ seconds: 30 }) - } - ] - }, - { - id: otherContacts[6].id, - participants: [myContact, otherContacts[6]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(6), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 2 }) - }, - { - id: uuidv4(), - senderId: otherContacts[6].id, - body: _mock.sentence(7), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 1 }) - } - ] - }, - { - id: `${_mock.id(1)}gr`, - participants: [myContact, ...otherContacts.slice(6, 11)], - type: 'GROUP', - unreadCount: 2, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(6), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 5 }) - }, - { - id: uuidv4(), - senderId: otherContacts[9].id, - body: _mock.sentence(7), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 4 }) - }, - { - id: uuidv4(), - senderId: otherContacts[10].id, - body: _mock.sentence(8), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 3 }) - }, - { - id: uuidv4(), - senderId: otherContacts[8].id, - body: _mock.sentence(9), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 2 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - attachments: [], - body: _mock.sentence(10), - contentType: 'text', - createdAt: fSub({ hours: 1 }) - }, - { - id: uuidv4(), - senderId: otherContacts[6].id, - body: _mock.sentence(11), - contentType: 'text', - attachments: [], - createdAt: fSub({ minutes: 5 }) - }, - { - id: uuidv4(), - senderId: otherContacts[7].id, - body: _mock.sentence(12), - contentType: 'text', - attachments: [], - createdAt: fSub({ seconds: 30 }) - } - ] - }, - { - id: otherContacts[7].id, - participants: [myContact, otherContacts[7]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(7), - contentType: 'text', - attachments: [], - createdAt: fSub({ days: 4 }) - }, - { - id: uuidv4(), - senderId: otherContacts[7].id, - body: _mock.sentence(8), - contentType: 'text', - attachments: [], - createdAt: fSub({ days: 3 }) - } - ] - }, - { - id: otherContacts[8].id, - participants: [myContact, otherContacts[8]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(8), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 9 }) - }, - { - id: uuidv4(), - senderId: otherContacts[8].id, - body: _mock.sentence(9), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 8 }) - } - ] - }, - { - id: otherContacts[9].id, - participants: [myContact, otherContacts[9]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(9), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 5 }) - }, - { - id: uuidv4(), - senderId: otherContacts[9].id, - body: _mock.sentence(10), - contentType: 'text', - attachments: [], - createdAt: fSub({ hours: 3 }) - } - ] - }, - { - id: `${_mock.id(2)}gr`, - participants: [myContact, ...otherContacts.slice(1, 5)], - type: 'GROUP', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(1), - contentType: 'text', - attachments: files.slice(0, 5), - createdAt: fSub({ hours: 4 }) - }, - { - id: uuidv4(), - senderId: otherContacts[1].id, - body: _mock.sentence(2), - contentType: 'text', - attachments: files.slice(5, 6), - createdAt: fSub({ hours: 3 }) - }, - { - id: uuidv4(), - senderId: otherContacts[2].id, - body: _mock.sentence(3), - contentType: 'text', - attachments: files.slice(6, 7), - createdAt: fSub({ hours: 2 }) - }, - { - id: uuidv4(), - senderId: otherContacts[4].id, - body: _mock.sentence(4), - contentType: 'text', - attachments: files.slice(7, 8), - createdAt: fSub({ hours: 1 }) - }, - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(5), - contentType: 'text', - attachments: files.slice(8, 9), - createdAt: fSub({ minutes: 30 }) - }, - { - id: uuidv4(), - senderId: otherContacts[3].id, - body: _mock.sentence(6), - contentType: 'text', - attachments: files.slice(9, 10), - createdAt: fSub({ minutes: 10 }) - } - ] - }, - { - id: otherContacts[10].id, - participants: [myContact, otherContacts[10]], - type: 'ONE_TO_ONE', - unreadCount: 0, - messages: [ - { - id: uuidv4(), - senderId: myContact.id, - body: _mock.sentence(10), - contentType: 'text', - attachments: [], - createdAt: fSub({ days: 11 }) - }, - { - id: uuidv4(), - senderId: otherContacts[10].id, - body: _mock.sentence(11), - contentType: 'text', - attachments: [], - createdAt: fSub({ days: 10 }) - } - ] - } - ]; -}; - -const temp_conversations = _conversations(); - -async function chat() { - for (let i = 0; i < temp_conversations.length; i++) { - await prisma.chatMessage.upsert({ - where: { id: i }, - update: {}, - create: temp_conversations[i] - }); - } - console.log('generate blog-postitem done'); -} - -const Chat = chat() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { Chat }; diff --git a/03_source/api_server.del/prisma/seeds/checkout.ts.draft b/03_source/api_server.del/prisma/seeds/checkout.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/colors.json b/03_source/api_server.del/prisma/seeds/colors.json deleted file mode 100644 index b258fd8..0000000 --- a/03_source/api_server.del/prisma/seeds/colors.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "primary": { - "lighter": "#C8FAD6", - "light": "#5BE49B", - "main": "#00A76F", - "dark": "#007867", - "darker": "#004B50", - "contrastText": "#FFFFFF" - }, - "secondary": { - "lighter": "#EFD6FF", - "light": "#C684FF", - "main": "#8E33FF", - "dark": "#5119B7", - "darker": "#27097A", - "contrastText": "#FFFFFF" - }, - "info": { - "lighter": "#CAFDF5", - "light": "#61F3F3", - "main": "#00B8D9", - "dark": "#006C9C", - "darker": "#003768", - "contrastText": "#FFFFFF" - }, - "success": { - "lighter": "#D3FCD2", - "light": "#77ED8B", - "main": "#22C55E", - "dark": "#118D57", - "darker": "#065E49", - "contrastText": "#ffffff" - }, - "warning": { - "lighter": "#FFF5CC", - "light": "#FFD666", - "main": "#FFAB00", - "dark": "#B76E00", - "darker": "#7A4100", - "contrastText": "#1C252E" - }, - "error": { - "lighter": "#FFE9D5", - "light": "#FFAC82", - "main": "#FF5630", - "dark": "#B71D18", - "darker": "#7A0916", - "contrastText": "#FFFFFF" - }, - "grey": { - "50": "#FCFDFD", - "100": "#F9FAFB", - "200": "#F4F6F8", - "300": "#DFE3E8", - "400": "#C4CDD5", - "500": "#919EAB", - "600": "#637381", - "700": "#454F5B", - "800": "#1C252E", - "900": "#141A21" - }, - "common": { - "black": "#000000", - "white": "#FFFFFF" - } -} diff --git a/03_source/api_server.del/prisma/seeds/common.ts.draft b/03_source/api_server.del/prisma/seeds/common.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/file.ts.draft b/03_source/api_server.del/prisma/seeds/file.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/fileList.ts b/03_source/api_server.del/prisma/seeds/fileList.ts deleted file mode 100644 index a28818d..0000000 --- a/03_source/api_server.del/prisma/seeds/fileList.ts +++ /dev/null @@ -1,76 +0,0 @@ -// src/_mock/_files.ts -// -import { _mock } from './_mock'; -import { _fileNames } from './assets'; -// -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); -// - -const GB = 1000000000 * 24; - -const URLS = [ - _mock.image.cover(2), - 'https://www.cloud.com/s/c218bo6kjuqyv66/design_suriname_2015.mp3', - 'https://www.cloud.com/s/c218bo6kjuqyv66/expertise_2015_conakry_sao-tome-and-principe_gender.mp4', - 'https://www.cloud.com/s/c218bo6kjuqyv66/money-popup-crack.pdf', - _mock.image.cover(3), - _mock.image.cover(5), - 'https://www.cloud.com/s/c218bo6kjuqyv66/large_news.txt', - 'https://www.cloud.com/s/c218bo6kjuqyv66/nauru-6015-small-fighter-left-gender.psd', - 'https://www.cloud.com/s/c218bo6kjuqyv66/tv-xs.doc', - 'https://www.cloud.com/s/c218bo6kjuqyv66/gustavia-entertainment-productivity.docx', - 'https://www.cloud.com/s/c218bo6kjuqyv66/vintage_bahrain_saipan.xls', - 'https://www.cloud.com/s/c218bo6kjuqyv66/indonesia-quito-nancy-grace-left-glad.xlsx', - 'https://www.cloud.com/s/c218bo6kjuqyv66/legislation-grain.zip', - 'https://www.cloud.com/s/c218bo6kjuqyv66/large_energy_dry_philippines.rar', - 'https://www.cloud.com/s/c218bo6kjuqyv66/footer-243-ecuador.iso', - 'https://www.cloud.com/s/c218bo6kjuqyv66/kyrgyzstan-04795009-picabo-street-guide-style.ai', - 'https://www.cloud.com/s/c218bo6kjuqyv66/india-data-large-gk-chesterton-mother.esp', - 'https://www.cloud.com/s/c218bo6kjuqyv66/footer-barbados-celine-dion.ppt', - 'https://www.cloud.com/s/c218bo6kjuqyv66/socio_respectively_366996.pptx', - 'https://www.cloud.com/s/c218bo6kjuqyv66/socio_ahead_531437_sweden_popup.wav', - 'https://www.cloud.com/s/c218bo6kjuqyv66/trinidad_samuel-morse_bring.m4v', - _mock.image.cover(11), - _mock.image.cover(17), - 'https://www.cloud.com/s/c218bo6kjuqyv66/xl_david-blaine_component_tanzania_books.pdf' -]; - -// ---------------------------------------------------------------------- - -export const genFileList = () => - _fileNames.map((name, index) => ({ - // id: _mock.id(index), - // createdAt: _mock.time(index), - // - name, - path: URLS[index], - preview: URLS[index], - size: GB / ((index + 1) * 500), - modifiedAt: _mock.time(index), - type: `${name.split('.').pop()}` - })); - -const temp_file_list = genFileList(); - -async function fileList() { - for (let i = 0; i < temp_file_list.length; i++) { - await prisma.fileStore.upsert({ - where: { id: i }, - update: {}, - create: temp_file_list[i] - }); - } -} - -const File = fileList() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { File }; diff --git a/03_source/api_server.del/prisma/seeds/global-config.ts b/03_source/api_server.del/prisma/seeds/global-config.ts deleted file mode 100644 index cc08aef..0000000 --- a/03_source/api_server.del/prisma/seeds/global-config.ts +++ /dev/null @@ -1,24 +0,0 @@ -import packageJson from '../../package.json'; - -type ConfigType = { - basePath?: string; - appVersion: string; - cors: { - allowedOrigins: string[]; - methods: string[]; - }; -}; - -export const CONFIG: ConfigType = { - appVersion: packageJson.version, - basePath: - process.env.NODE_ENV === 'production' ? process.env.PRODUCTION_API : process.env.DEV_API, - cors: { - /** - * [] = allow all origins - * ['http://localhost:8081', 'http://localhost:8082'] = allow only these origins - */ - allowedOrigins: [], - methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'] - } -}; diff --git a/03_source/api_server.del/prisma/seeds/invoice.ts.draft b/03_source/api_server.del/prisma/seeds/invoice.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/job.ts.draft b/03_source/api_server.del/prisma/seeds/job.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/kanban.ts b/03_source/api_server.del/prisma/seeds/kanban.ts deleted file mode 100644 index f28520c..0000000 --- a/03_source/api_server.del/prisma/seeds/kanban.ts +++ /dev/null @@ -1,120 +0,0 @@ -// src/_mock/_kanban.ts -// no idea how to do -// -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); -import { uuidv4 } from './utils/uuidv4'; -import { _mock } from './_mock'; -import { CONFIG } from './global-config'; -import { _tags } from './assets'; -import { fAdd, fSub } from './utils/set-date'; - -const generateAttachments = () => - Array.from({ length: 20 }, (_, index) => _mock.image.cover(index)); - -const generateAssignees = () => - Array.from({ length: 20 }, (_, index) => ({ - id: _mock.id(index), - name: _mock.fullName(index), - avatarUrl: _mock.image.avatar(index) - })); - -const generateComments = () => - Array.from({ length: 8 }, (_, index) => ({ - id: uuidv4(), - name: _mock.fullName(index), - avatarUrl: _mock.image.avatar(index), - createdAt: fSub({ minutes: 20 - index }), - messageType: [1, 2].includes(index) ? 'image' : 'text', - message: [1, 2].includes(index) ? _mock.image.cover(index + 5) : _mock.sentence(index) - })); - -const COLUMN_NAMES = { - name1: 'To do', - name2: 'In progress', - name3: 'Ready to test', - name4: 'Done' -}; - -const COLUMN_IDS = { - id1: `${1}-column-${_mock.id(1)}`, - id2: `${2}-column-${_mock.id(2)}`, - id3: `${3}-column-${_mock.id(3)}`, - id4: `${4}-column-${_mock.id(4)}` -}; - -const PRIORITY_LEVEL = { - low: 'low', - medium: 'medium', - hight: 'hight' -}; - -const createTask = (index: number, status: string) => { - const commentList = generateComments(); - const assignedUser = generateAssignees(); - const attachmentList = generateAttachments(); - - const reporter = { - id: _mock.id(16), - name: _mock.fullName(16), - avatarUrl: _mock.image.avatar(16) - }; - - return { - id: `${index}-task-${_mock.id(index)}`, - reporter, - name: _mock.taskNames(index), - labels: _tags.slice(0, index), - comments: commentList.slice(0, index), - assignee: assignedUser.slice(0, index), - description: _mock.description(index), - due: [fAdd({ days: index + 1 }), fAdd({ days: index + 2 })], - priority: - ([1, 3].includes(index) && PRIORITY_LEVEL.hight) || - ([2, 4].includes(index) && PRIORITY_LEVEL.medium) || - PRIORITY_LEVEL.low, - attachments: - (index === 1 && attachmentList.slice(11, 15)) || - (index === 5 && attachmentList.slice(4, 9)) || - [], - status - }; -}; - -const tasks = () => ({ - [COLUMN_IDS.id1]: [ - createTask(1, COLUMN_NAMES.name1), - createTask(2, COLUMN_NAMES.name1), - createTask(3, COLUMN_NAMES.name1) - ], - [COLUMN_IDS.id2]: [createTask(4, COLUMN_NAMES.name2), createTask(5, COLUMN_NAMES.name2)], - [COLUMN_IDS.id3]: [], - [COLUMN_IDS.id4]: [createTask(6, COLUMN_NAMES.name4)] -}); - -const columns = () => [ - { id: COLUMN_IDS.id1, name: COLUMN_NAMES.name1 }, - { id: COLUMN_IDS.id2, name: COLUMN_NAMES.name2 }, - { id: COLUMN_IDS.id3, name: COLUMN_NAMES.name3 }, - { id: COLUMN_IDS.id4, name: COLUMN_NAMES.name4 } -]; - -// const temp_kanban = _kanban(); - -async function kanban() { - for (let i = 0; i < 10; i++) { - console.log({ i }); - } -} - -const Kanban = kanban() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { Kanban }; diff --git a/03_source/api_server.del/prisma/seeds/mail.ts b/03_source/api_server.del/prisma/seeds/mail.ts deleted file mode 100644 index cf94b7b..0000000 --- a/03_source/api_server.del/prisma/seeds/mail.ts +++ /dev/null @@ -1,101 +0,0 @@ -// src/_mock/_mail.ts -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); -// -import { uuidv4 } from './utils/uuidv4'; -import { _mock } from './_mock'; -import { CONFIG } from './global-config'; -import { _tags } from './assets'; -// -import { _files } from './_files'; -import COLORS from './colors.json'; - -export const _labels = () => [ - { id: 'all', type: 'system', name: 'all', unreadCount: 3 }, - { id: 'inbox', type: 'system', name: 'inbox', unreadCount: 1 }, - { id: 'sent', type: 'system', name: 'sent', unreadCount: 0 }, - { id: 'drafts', type: 'system', name: 'drafts', unreadCount: 0 }, - { id: 'trash', type: 'system', name: 'trash', unreadCount: 0 }, - { id: 'spam', type: 'system', name: 'spam', unreadCount: 1 }, - { id: 'important', type: 'system', name: 'important', unreadCount: 1 }, - { id: 'starred', type: 'system', name: 'starred', unreadCount: 1 }, - { id: 'social', type: 'custom', name: 'social', unreadCount: 0, color: COLORS.primary.main }, - { - id: 'promotions', - type: 'custom', - name: 'promotions', - unreadCount: 2, - color: COLORS.warning.main - }, - { id: 'forums', type: 'custom', name: 'forums', unreadCount: 1, color: COLORS.error.main } -]; - -const _mails = () => - Array.from({ length: 9 }, (_, index) => { - const files = _files(); - - const attachments = - (index === 1 && files.slice(0, 2)) || - (index === 2 && files.slice(0, 4)) || - (index === 5 && files.slice(4, 10)) || - []; - - const folder = - ([1, 2].includes(index) && 'spam') || ([3, 4].includes(index) && 'sent') || 'inbox'; - - const labelIds = - (index === 1 && ['promotions', 'forums']) || - (index === 2 && ['forums']) || - (index === 5 && ['social']) || - []; - - const from = { - name: _mock.fullName(index), - email: _mock.email(index), - avatarUrl: [1, 2, 6].includes(index) ? null : _mock.image.avatar(index) - }; - - const to = [ - { name: 'Jaydon Frankie', email: 'demo@minimals.cc', avatarUrl: null }, - { name: _mock.fullName(12), email: _mock.email(12), avatarUrl: _mock.image.avatar(12) } - ]; - - return { - // id: _mock.id(index), - // to: { create: to }, - // from: { create: from }, - // attachments, - folder, - labelIds, - subject: _mock.postTitle(index), - isUnread: [1, 3].includes(index), - isImportant: _mock.boolean(index), - message: _mock.description(index), - isStarred: _mock.boolean(index + 2) - }; - }); - -const temp_mails = _mails(); - -async function mail() { - for (let i = 0; i < temp_mails.length; i++) { - await prisma.mail.upsert({ - where: { id: i }, - update: {}, - create: temp_mails[i] - }); - } - console.log('generate mail done'); -} - -const Mail = mail() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { Mail }; diff --git a/03_source/api_server.del/prisma/seeds/order.ts.draft b/03_source/api_server.del/prisma/seeds/order.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/product.ts.draft b/03_source/api_server.del/prisma/seeds/product.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/productItem.ts b/03_source/api_server.del/prisma/seeds/productItem.ts deleted file mode 100644 index c7512e8..0000000 --- a/03_source/api_server.del/prisma/seeds/productItem.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { _mock } from './_mock'; -import { _tags } from './assets'; - -import { PrismaClient, ProductReview } from '@prisma/client'; -import { _productsReview } from './productReview'; -const prisma = new PrismaClient(); - -const COLORS = [ - '#FF4842', - '#1890FF', - '#FFC0CB', - '#00AB55', - '#FFC107', - '#7F00FF', - '#000000', - '#FFFFFF' -]; - -const DESCRIPTION = ` -
Specifications
- - - - - - - - - - - - - - - - - - - - - - - -
CategoryMobile
ManufacturerApple
Warranty12 Months
Serial number358607726380311
Ships fromUnited States
- -
Product details
- -
Benefits
- -
Delivery and returns
-

Your order of $200 or more gets free standard delivery.

- -

Orders are processed and delivered Monday-Friday (excluding public holidays)

- -`; - -const getColorSliceForIndex = (index: number) => { - if (index === 0) return COLORS.slice(0, 2); - if (index === 1) return COLORS.slice(1, 3); - if (index === 2) return COLORS.slice(2, 4); - if (index === 3) return COLORS.slice(3, 6); - if (index === 4 || index === 16 || index === 19) return COLORS.slice(4, 6); - if (index === 5 || index === 17) return COLORS.slice(5, 6); - if (index === 6 || index === 18) return COLORS.slice(0, 2); - if (index === 7) return COLORS.slice(4, 6); - if (index === 8) return COLORS.slice(2, 4); - if (index === 9 || index === 11) return COLORS.slice(2, 6); - if (index === 10) return COLORS.slice(3, 6); - if (index === 12) return COLORS.slice(2, 7); - if (index === 13) return COLORS.slice(4, 7); - if (index === 14) return COLORS.slice(0, 2); - if (index === 15) return COLORS.slice(5, 8); - return COLORS.slice(2, 6); // Default case -}; - -const generateAttachments = () => - Array.from({ length: 20 }, (_, index) => _mock.image.product(index)); - -const generateReviews = () => { - const attachments = generateAttachments(); -}; - -const generateRatings = () => - Array.from({ length: 5 }, (_, index) => ({ - name: `${index + 1} Star`, - starCount: _mock.number.nativeL(index), - reviewCount: _mock.number.nativeL(index + 1) - })); - -const generateImages = () => Array.from({ length: 8 }, (_, index) => _mock.image.product(index)); - -const _products = () => - Array.from({ length: 20 }, (_, index) => { - const reviews = generateReviews(); - const images = generateImages(); - const ratings = generateRatings(); - // - const publish = index % 3 ? 'published' : 'draft'; - - const category = (index % 2 && 'Shose') || (index % 3 && 'Apparel') || 'Accessories'; - - const gender = (index % 2 && ['Men']) || (index % 3 && ['Women', 'Kids']) || ['Kids']; - - const available = (index % 2 && 72) || (index % 3 && 10) || 0; - - const inventoryType = (index % 2 && 'in stock') || (index % 3 && 'low stock') || 'out of stock'; - - const priceSale = index % 3 ? undefined : _mock.number.price(index); - - return { - id: _mock.id(index), - sku: `WW75K521${index}YW/SV`, - name: _mock.productName(index), - gender, - images, - reviews, - publish, - ratings, - category, - available, - priceSale, - taxes: 10, - quantity: 80, - inventoryType, - tags: _tags.slice(0, 5), - code: `38BEE27${index}`, - description: DESCRIPTION, - createdAt: _mock.time(index), - price: _mock.number.price(index), - coverUrl: _mock.image.product(index), - colors: getColorSliceForIndex(index), - totalRatings: _mock.number.rating(index), - totalSold: _mock.number.nativeM(index + 1), - totalReviews: _mock.number.nativeL(index + 1), - newLabel: { enabled: [1, 2, 3].includes(index), content: 'NEW' }, - saleLabel: { enabled: [4, 5].includes(index), content: 'SALE' }, - sizes: ['6', '7', '8', '8.5', '9', '9.5', '10', '10.5', '11', '11.5', '12', '13'], - subDescription: - 'Featuring the original ripple design inspired by Japanese bullet trains, the Nike Air Max 97 lets you push your style full-speed ahead.' - }; - }); - -async function productItem() { - const temp_products = _products(); - - for (let i = 0; i < temp_products.length; i++) { - // console.log(i); - - const temp_pr = _productsReview(); - - const temp = await prisma.productItem.upsert({ - where: { id: i }, - update: {}, - create: { - name: temp_products[i].name, - code: temp_products[i].code, - price: temp_products[i].price, - taxes: temp_products[i].taxes, - tags: temp_products[i].tags, - sizes: temp_products[i].sizes, - publish: temp_products[i].publish, - gender: temp_products[i].gender, - coverUrl: temp_products[i].coverUrl, - images: temp_products[i].images, - colors: temp_products[i].colors, - quantity: temp_products[i].quantity, - category: temp_products[i].category, - available: temp_products[i].available, - totalSold: temp_products[i].totalSold, - description: temp_products[i].description, - totalRatings: temp_products[i].totalRatings, - totalReviews: temp_products[i].totalReviews, - inventoryType: temp_products[i].inventoryType, - subDescription: temp_products[i].subDescription, - priceSale: temp_products[i].priceSale, - newLabel: temp_products[i].newLabel, - saleLabel: temp_products[i].saleLabel, - ratings: temp_products[i].ratings, - // review: { create: temp_pr }, - reviews: { create: temp_pr }, - testing: { - create: [{ hello: 'world' }] - }, - - sku: temp_products[i].sku - } - }); - } - console.log('seed productItem done'); -} - -const ProductItem = productItem() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { ProductItem }; diff --git a/03_source/api_server.del/prisma/seeds/productReview.ts b/03_source/api_server.del/prisma/seeds/productReview.ts deleted file mode 100644 index 89f845b..0000000 --- a/03_source/api_server.del/prisma/seeds/productReview.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { _mock } from './_mock'; -import { _tags } from './assets'; - -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); - -const COLORS = [ - '#FF4842', - '#1890FF', - '#FFC0CB', - '#00AB55', - '#FFC107', - '#7F00FF', - '#000000', - '#FFFFFF' -]; - -const DESCRIPTION = ` -
Specifications
- - - - - - - - - - - - - - - - - - - - - - - -
CategoryMobile
ManufacturerApple
Warranty12 Months
Serial number358607726380311
Ships fromUnited States
- -
Product details
- -
Benefits
- -
Delivery and returns
-

Your order of $200 or more gets free standard delivery.

- -

Orders are processed and delivered Monday-Friday (excluding public holidays)

- -`; - -const getColorSliceForIndex = (index: number) => { - if (index === 0) return COLORS.slice(0, 2); - if (index === 1) return COLORS.slice(1, 3); - if (index === 2) return COLORS.slice(2, 4); - if (index === 3) return COLORS.slice(3, 6); - if (index === 4 || index === 16 || index === 19) return COLORS.slice(4, 6); - if (index === 5 || index === 17) return COLORS.slice(5, 6); - if (index === 6 || index === 18) return COLORS.slice(0, 2); - if (index === 7) return COLORS.slice(4, 6); - if (index === 8) return COLORS.slice(2, 4); - if (index === 9 || index === 11) return COLORS.slice(2, 6); - if (index === 10) return COLORS.slice(3, 6); - if (index === 12) return COLORS.slice(2, 7); - if (index === 13) return COLORS.slice(4, 7); - if (index === 14) return COLORS.slice(0, 2); - if (index === 15) return COLORS.slice(5, 8); - return COLORS.slice(2, 6); // Default case -}; - -const generateAttachments = () => - Array.from({ length: 20 }, (_, index) => _mock.image.product(index)); - -const generateReviews = () => { - const attachments = generateAttachments(); - - return Array.from({ length: 8 }, (_, index) => ({ - // id: _mock.id(index), - name: _mock.fullName(index), - postedAt: _mock.time(index), - comment: _mock.sentence(index), - isPurchased: _mock.boolean(index), - rating: _mock.number.rating(index), - avatarUrl: _mock.image.avatar(index), - helpful: _mock.number.nativeL(index), - attachments: - (index === 1 && attachments.slice(0, 1)) || - (index === 3 && attachments.slice(2, 4)) || - (index === 5 && attachments.slice(5, 8)) || - [] - })); -}; - -const generateRatings = () => - Array.from({ length: 5 }, (_, index) => ({ - name: `${index + 1} Star`, - starCount: _mock.number.nativeL(index), - reviewCount: _mock.number.nativeL(index + 1) - })); - -const generateImages = () => Array.from({ length: 8 }, (_, index) => _mock.image.product(index)); - -export const _productsReview = () => { - return generateReviews(); -}; - -async function productReview() { - const temp_pr = _productsReview(); - - for (let i = 0; i < temp_pr.length; i++) { - const temp = await prisma.productReview.upsert({ - where: { id: i }, - update: {}, - create: { - name: temp_pr[i].name, - rating: temp_pr[i].rating, - comment: temp_pr[i].comment, - helpful: temp_pr[i].helpful, - avatarUrl: temp_pr[i].avatarUrl, - isPurchased: temp_pr[i].isPurchased, - attachments: temp_pr[i].attachments, - postedAt: temp_pr[i].postedAt - } - }); - } - console.log('seed productReview done'); -} - -const ProductReview = productReview() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { ProductReview }; diff --git a/03_source/api_server.del/prisma/seeds/superuser.ts b/03_source/api_server.del/prisma/seeds/superuser.ts deleted file mode 100644 index 2bc3004..0000000 --- a/03_source/api_server.del/prisma/seeds/superuser.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); - -async function superuser() { - const admin1 = await prisma.user.upsert({ - where: { email: 'admin1@123.com' }, - update: {}, - create: { - email: 'admin1@123.com', - name: 'Admin1', - password: 'Aa12345678' - } - }); - - // swagger test - const swaggerUser = await prisma.user.upsert({ - where: { email: 'fake@example.com' }, - update: {}, - create: { - email: 'fake@example.com', - name: 'swagger user', - password: 'password1' - } - }); - - console.log('seed superuser done'); -} - -const superuserSeed = superuser() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { superuserSeed }; diff --git a/03_source/api_server.del/prisma/seeds/tour.ts.draft b/03_source/api_server.del/prisma/seeds/tour.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/user.ts b/03_source/api_server.del/prisma/seeds/user.ts deleted file mode 100644 index 473f27a..0000000 --- a/03_source/api_server.del/prisma/seeds/user.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient(); - -async function user() { - const alice = await prisma.user.upsert({ - where: { email: 'alice@prisma.io' }, - update: {}, - create: { - email: 'alice@prisma.io', - name: 'Alice', - password: 'Aa12345678' - } - }); - - const bob = await prisma.user.upsert({ - where: { email: 'bob@prisma.io' }, - update: {}, - create: { - email: 'bob@prisma.io', - name: 'Bob', - password: 'Aa12345678' - } - }); - console.log('seed user done'); -} - -const userSeed = user() - .then(async () => { - await prisma.$disconnect(); - }) - .catch(async (e) => { - console.error(e); - await prisma.$disconnect(); - process.exit(1); - }); - -export { userSeed }; diff --git a/03_source/api_server.del/prisma/seeds/user.ts.draft b/03_source/api_server.del/prisma/seeds/user.ts.draft deleted file mode 100644 index e69de29..0000000 diff --git a/03_source/api_server.del/prisma/seeds/utils/set-date.ts b/03_source/api_server.del/prisma/seeds/utils/set-date.ts deleted file mode 100644 index a2aa35a..0000000 --- a/03_source/api_server.del/prisma/seeds/utils/set-date.ts +++ /dev/null @@ -1,91 +0,0 @@ -import dayjs from 'dayjs'; -import duration from 'dayjs/plugin/duration'; - -// ---------------------------------------------------------------------- - -dayjs.extend(duration); - -export function setDate(now: Date, options: { days?: number; hours?: number; minutes?: number }) { - const month = now.getMonth() + 1; - const year = now.getFullYear(); - const today = now.getDate(); - - const { days, hours = 0, minutes = 0 } = options; - - return new Date(`${year}-${month}-${days ?? today} ${hours}:${minutes}`).toJSON(); -} - -export const subHours = ( - value: number, - option: 'years' | 'months' | 'days' | 'hours' | 'minutes' | 'seconds' | 'milliseconds' -) => dayjs().subtract(value, option).format(); - -// years, -// months, -// days, -// hours, -// minutes, -// seconds, -// milliseconds, - -export type DurationProps = { - years?: number; - months?: number; - days?: number; - hours?: number; - minutes?: number; - seconds?: number; - milliseconds?: number; -}; - -export function fSub({ - years = 0, - months = 0, - days = 0, - hours = 0, - minutes = 0, - seconds = 0, - milliseconds = 0 -}: DurationProps) { - const result = dayjs() - .subtract( - dayjs.duration({ - years, - months, - days, - hours, - minutes, - seconds, - milliseconds - }) - ) - .format(); - - return result; -} - -export function fAdd({ - years = 0, - months = 0, - days = 0, - hours = 0, - minutes = 0, - seconds = 0, - milliseconds = 0 -}: DurationProps) { - const result = dayjs() - .add( - dayjs.duration({ - years, - months, - days, - hours, - minutes, - seconds, - milliseconds - }) - ) - .format(); - - return result; -} diff --git a/03_source/api_server.del/prisma/seeds/utils/uuidv4.ts b/03_source/api_server.del/prisma/seeds/utils/uuidv4.ts deleted file mode 100644 index b559549..0000000 --- a/03_source/api_server.del/prisma/seeds/utils/uuidv4.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable no-bitwise */ -// ---------------------------------------------------------------------- - -export function uuidv4() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { - const r = (Math.random() * 16) | 0; - const v = c === 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); -} diff --git a/03_source/api_server.del/src/app.ts b/03_source/api_server.del/src/app.ts deleted file mode 100644 index bd36d33..0000000 --- a/03_source/api_server.del/src/app.ts +++ /dev/null @@ -1,66 +0,0 @@ -import express from 'express'; -import helmet from 'helmet'; -import compression from 'compression'; -import cors from 'cors'; -import passport from 'passport'; -import httpStatus from 'http-status'; -import config from './config/config'; -import morgan from './config/morgan'; -import xss from './middlewares/xss'; -import { jwtStrategy } from './config/passport'; -import { authLimiter } from './middlewares/rateLimiter'; -import routes from './routes/v1'; -import { errorConverter, errorHandler } from './middlewares/error'; -import ApiError from './utils/ApiError'; - -const app = express(); - -if (config.env !== 'test') { - app.use(morgan.successHandler); - app.use(morgan.errorHandler); -} - -// set security HTTP headers -app.use(helmet()); - -// parse json request body -app.use(express.json()); - -// parse urlencoded request body -app.use(express.urlencoded({ extended: true })); - -// sanitize request data -app.use(xss()); - -// gzip compression -app.use(compression()); - -// enable cors -app.use(cors()); -app.options('*', cors()); - -// jwt authentication -app.use(passport.initialize()); -passport.use('jwt', jwtStrategy); - -// limit repeated failed requests to auth endpoints -if (config.env === 'production') { - app.use('/v1/auth', authLimiter); -} - -// v1 api routes -app.use('/v1', routes); - -// send back a 404 error for any unknown api request -app.use((req, res, next) => { - console.log(req.url); - next(new ApiError(httpStatus.NOT_FOUND, 'Not found')); -}); - -// convert error to ApiError, if needed -app.use(errorConverter); - -// handle error -app.use(errorHandler); - -export default app; diff --git a/03_source/api_server.del/src/client.ts b/03_source/api_server.del/src/client.ts deleted file mode 100644 index f192742..0000000 --- a/03_source/api_server.del/src/client.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import config from './config/config'; - -// add prisma to the NodeJS global type -interface CustomNodeJsGlobal extends Global { - prisma: PrismaClient; -} - -// Prevent multiple instances of Prisma Client in development -declare const global: CustomNodeJsGlobal; - -const prisma = global.prisma || new PrismaClient(); - -if (config.env === 'development') global.prisma = prisma; - -export default prisma; diff --git a/03_source/api_server.del/src/config/config.ts b/03_source/api_server.del/src/config/config.ts deleted file mode 100644 index c4c3f55..0000000 --- a/03_source/api_server.del/src/config/config.ts +++ /dev/null @@ -1,61 +0,0 @@ -import dotenv from 'dotenv'; -import path from 'path'; -import Joi from 'joi'; - -dotenv.config({ path: path.join(process.cwd(), '.env') }); - -const envVarsSchema = Joi.object() - .keys({ - NODE_ENV: Joi.string().valid('production', 'development', 'test').required(), - PORT: Joi.number().default(3000), - JWT_SECRET: Joi.string().required().description('JWT secret key'), - JWT_ACCESS_EXPIRATION_MINUTES: Joi.number() - .default(30) - .description('minutes after which access tokens expire'), - JWT_REFRESH_EXPIRATION_DAYS: Joi.number() - .default(30) - .description('days after which refresh tokens expire'), - JWT_RESET_PASSWORD_EXPIRATION_MINUTES: Joi.number() - .default(10) - .description('minutes after which reset password token expires'), - JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: Joi.number() - .default(10) - .description('minutes after which verify email token expires'), - SMTP_HOST: Joi.string().description('server that will send the emails'), - SMTP_PORT: Joi.number().description('port to connect to the email server'), - SMTP_USERNAME: Joi.string().description('username for email server'), - SMTP_PASSWORD: Joi.string().description('password for email server'), - EMAIL_FROM: Joi.string().description('the from field in the emails sent by the app') - }) - .unknown(); - -const { value: envVars, error } = envVarsSchema - .prefs({ errors: { label: 'key' } }) - .validate(process.env); - -if (error) { - throw new Error(`Config validation error: ${error.message}`); -} - -export default { - env: envVars.NODE_ENV, - port: envVars.PORT, - jwt: { - secret: envVars.JWT_SECRET, - accessExpirationMinutes: envVars.JWT_ACCESS_EXPIRATION_MINUTES, - refreshExpirationDays: envVars.JWT_REFRESH_EXPIRATION_DAYS, - resetPasswordExpirationMinutes: envVars.JWT_RESET_PASSWORD_EXPIRATION_MINUTES, - verifyEmailExpirationMinutes: envVars.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES - }, - email: { - smtp: { - host: envVars.SMTP_HOST, - port: envVars.SMTP_PORT, - auth: { - user: envVars.SMTP_USERNAME, - pass: envVars.SMTP_PASSWORD - } - }, - from: envVars.EMAIL_FROM - } -}; diff --git a/03_source/api_server.del/src/config/logger.ts b/03_source/api_server.del/src/config/logger.ts deleted file mode 100644 index 6b6516a..0000000 --- a/03_source/api_server.del/src/config/logger.ts +++ /dev/null @@ -1,26 +0,0 @@ -import winston from 'winston'; -import config from './config'; - -const enumerateErrorFormat = winston.format((info) => { - if (info instanceof Error) { - Object.assign(info, { message: info.stack }); - } - return info; -}); - -const logger = winston.createLogger({ - level: config.env === 'development' ? 'debug' : 'info', - format: winston.format.combine( - enumerateErrorFormat(), - config.env === 'development' ? winston.format.colorize() : winston.format.uncolorize(), - winston.format.splat(), - winston.format.printf(({ level, message }) => `${level}: ${message}`) - ), - transports: [ - new winston.transports.Console({ - stderrLevels: ['error'] - }) - ] -}); - -export default logger; diff --git a/03_source/api_server.del/src/config/morgan.ts b/03_source/api_server.del/src/config/morgan.ts deleted file mode 100644 index bdb199b..0000000 --- a/03_source/api_server.del/src/config/morgan.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Response } from 'express'; -import morgan from 'morgan'; -import config from './config'; -import logger from './logger'; - -morgan.token('message', (req, res: Response) => res.locals.errorMessage || ''); - -const getIpFormat = () => (config.env === 'production' ? ':remote-addr - ' : ''); -const successResponseFormat = `${getIpFormat()}:method :url :status - :response-time ms`; -const errorResponseFormat = `${getIpFormat()}:method :url :status - :response-time ms - message: :message`; - -export const successHandler = morgan(successResponseFormat, { - skip: (req, res) => res.statusCode >= 400, - stream: { write: (message) => logger.info(message.trim()) } -}); - -export const errorHandler = morgan(errorResponseFormat, { - skip: (req, res) => res.statusCode < 400, - stream: { write: (message) => logger.error(message.trim()) } -}); - -export default { - successHandler, - errorHandler -}; diff --git a/03_source/api_server.del/src/config/passport.ts b/03_source/api_server.del/src/config/passport.ts deleted file mode 100644 index 6c27397..0000000 --- a/03_source/api_server.del/src/config/passport.ts +++ /dev/null @@ -1,33 +0,0 @@ -import prisma from '../client'; -import { Strategy as JwtStrategy, ExtractJwt, VerifyCallback } from 'passport-jwt'; -import config from './config'; -import { TokenType } from '@prisma/client'; - -const jwtOptions = { - secretOrKey: config.jwt.secret, - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken() -}; - -const jwtVerify: VerifyCallback = async (payload, done) => { - try { - if (payload.type !== TokenType.ACCESS) { - throw new Error('Invalid token type'); - } - const user = await prisma.user.findUnique({ - select: { - id: true, - email: true, - name: true - }, - where: { id: payload.sub } - }); - if (!user) { - return done(null, false); - } - done(null, user); - } catch (error) { - done(error, false); - } -}; - -export const jwtStrategy = new JwtStrategy(jwtOptions, jwtVerify); diff --git a/03_source/api_server.del/src/config/roles.ts b/03_source/api_server.del/src/config/roles.ts deleted file mode 100644 index f4355fb..0000000 --- a/03_source/api_server.del/src/config/roles.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Role } from '@prisma/client'; - -const allRoles = { - [Role.USER]: [], - [Role.ADMIN]: ['getUsers', 'manageUsers'] -}; - -export const roles = Object.keys(allRoles); -export const roleRights = new Map(Object.entries(allRoles)); diff --git a/03_source/api_server.del/src/controllers/auth.controller.ts b/03_source/api_server.del/src/controllers/auth.controller.ts deleted file mode 100644 index ad120f0..0000000 --- a/03_source/api_server.del/src/controllers/auth.controller.ts +++ /dev/null @@ -1,64 +0,0 @@ -import httpStatus from 'http-status'; -import catchAsync from '../utils/catchAsync'; -import { authService, userService, tokenService, emailService } from '../services'; -import exclude from '../utils/exclude'; -import { User } from '@prisma/client'; - -const register = catchAsync(async (req, res) => { - const { email, password } = req.body; - const user = await userService.createUser(email, password); - const userWithoutPassword = exclude(user, ['password', 'createdAt', 'updatedAt']); - const tokens = await tokenService.generateAuthTokens(user); - res.status(httpStatus.CREATED).send({ user: userWithoutPassword, tokens }); -}); - -const login = catchAsync(async (req, res) => { - const { email, password } = req.body; - const user = await authService.loginUserWithEmailAndPassword(email, password); - const tokens = await tokenService.generateAuthTokens(user); - res.send({ user, tokens }); -}); - -const logout = catchAsync(async (req, res) => { - await authService.logout(req.body.refreshToken); - res.status(httpStatus.NO_CONTENT).send(); -}); - -const refreshTokens = catchAsync(async (req, res) => { - const tokens = await authService.refreshAuth(req.body.refreshToken); - res.send({ ...tokens }); -}); - -const forgotPassword = catchAsync(async (req, res) => { - const resetPasswordToken = await tokenService.generateResetPasswordToken(req.body.email); - await emailService.sendResetPasswordEmail(req.body.email, resetPasswordToken); - res.status(httpStatus.NO_CONTENT).send(); -}); - -const resetPassword = catchAsync(async (req, res) => { - await authService.resetPassword(req.query.token as string, req.body.password); - res.status(httpStatus.NO_CONTENT).send(); -}); - -const sendVerificationEmail = catchAsync(async (req, res) => { - const user = req.user as User; - const verifyEmailToken = await tokenService.generateVerifyEmailToken(user); - await emailService.sendVerificationEmail(user.email, verifyEmailToken); - res.status(httpStatus.NO_CONTENT).send(); -}); - -const verifyEmail = catchAsync(async (req, res) => { - await authService.verifyEmail(req.query.token as string); - res.status(httpStatus.NO_CONTENT).send(); -}); - -export default { - register, - login, - logout, - refreshTokens, - forgotPassword, - resetPassword, - sendVerificationEmail, - verifyEmail -}; diff --git a/03_source/api_server.del/src/controllers/event.controller.ts b/03_source/api_server.del/src/controllers/event.controller.ts deleted file mode 100644 index c9fe5d4..0000000 --- a/03_source/api_server.del/src/controllers/event.controller.ts +++ /dev/null @@ -1,54 +0,0 @@ -import httpStatus from 'http-status'; -import pick from '../utils/pick'; -import ApiError from '../utils/ApiError'; -import catchAsync from '../utils/catchAsync'; -import { userService } from '../services'; -import eventService from '../services/event.service'; - -// const createUser = catchAsync(async (req, res) => { -// const { email, password, name, role } = req.body; -// const user = await userService.createUser(email, password, name, role); -// res.status(httpStatus.CREATED).send(user); -// }); - -// const getUsers = catchAsync(async (req, res) => { -// const filter = pick(req.query, ['name', 'role']); -// const options = pick(req.query, ['sortBy', 'limit', 'page']); -// const result = await userService.queryUsers(filter, options); -// res.send(result); -// }); - -const getEvents = catchAsync(async (req, res) => { - const filter = pick(req.query, ['name', 'role']); - const options = pick(req.query, ['sortBy', 'limit', 'page']); - const result = await eventService.queryEvents(filter, options); - res.send(result); -}); - -const getEvent = catchAsync(async (req, res) => { - const eventId = parseInt(req.params.eventId); - const event = await eventService.getEventById(eventId); - if (!event) { - throw new ApiError(httpStatus.NOT_FOUND, 'Event not found'); - } - res.send(event); -}); - -// const updateUser = catchAsync(async (req, res) => { -// const user = await userService.updateUserById(req.params.userId, req.body); -// res.send(user); -// }); - -// const deleteUser = catchAsync(async (req, res) => { -// await userService.deleteUserById(req.params.userId); -// res.status(httpStatus.NO_CONTENT).send(); -// }); - -export default { - // createUser, - getEvents, - getEvent - // getUser - // updateUser, - // deleteUser -}; diff --git a/03_source/api_server.del/src/controllers/helloworld.controller.ts b/03_source/api_server.del/src/controllers/helloworld.controller.ts deleted file mode 100644 index 97b26a2..0000000 --- a/03_source/api_server.del/src/controllers/helloworld.controller.ts +++ /dev/null @@ -1,9 +0,0 @@ -import catchAsync from '../utils/catchAsync'; - -const getHelloworld = catchAsync(async (req, res) => { - res.send({ hello: 'world' }); -}); - -export default { - getHelloworld -}; diff --git a/03_source/api_server.del/src/controllers/index.ts b/03_source/api_server.del/src/controllers/index.ts deleted file mode 100644 index 4e572af..0000000 --- a/03_source/api_server.del/src/controllers/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as authController } from './auth.controller'; -export { default as userController } from './user.controller'; diff --git a/03_source/api_server.del/src/controllers/member.controller.ts b/03_source/api_server.del/src/controllers/member.controller.ts deleted file mode 100644 index ba0814a..0000000 --- a/03_source/api_server.del/src/controllers/member.controller.ts +++ /dev/null @@ -1,55 +0,0 @@ -import httpStatus from 'http-status'; -import pick from '../utils/pick'; -import ApiError from '../utils/ApiError'; -import catchAsync from '../utils/catchAsync'; -import { userService } from '../services'; -import eventService from '../services/event.service'; -import memberService from '../services/member.service'; - -// const createUser = catchAsync(async (req, res) => { -// const { email, password, name, role } = req.body; -// const user = await userService.createUser(email, password, name, role); -// res.status(httpStatus.CREATED).send(user); -// }); - -// const getUsers = catchAsync(async (req, res) => { -// const filter = pick(req.query, ['name', 'role']); -// const options = pick(req.query, ['sortBy', 'limit', 'page']); -// const result = await userService.queryUsers(filter, options); -// res.send(result); -// }); - -const getMembers = catchAsync(async (req, res) => { - const filter = pick(req.query, ['name', 'role']); - const options = pick(req.query, ['sortBy', 'limit', 'page']); - const result = await memberService.queryMembers(filter, options); - res.send(result); -}); - -const getMember = catchAsync(async (req, res) => { - const memberId = parseInt(req.params.memberId); - const member = await memberService.getMemberById(memberId); - if (!member) { - throw new ApiError(httpStatus.NOT_FOUND, 'Member not found'); - } - res.send(member); -}); - -// const updateUser = catchAsync(async (req, res) => { -// const user = await userService.updateUserById(req.params.userId, req.body); -// res.send(user); -// }); - -// const deleteUser = catchAsync(async (req, res) => { -// await userService.deleteUserById(req.params.userId); -// res.status(httpStatus.NO_CONTENT).send(); -// }); - -export default { - // createUser, - getMembers, - getMember - // getUser - // updateUser, - // deleteUser -}; diff --git a/03_source/api_server.del/src/controllers/order.controller.ts b/03_source/api_server.del/src/controllers/order.controller.ts deleted file mode 100644 index cbdc0bd..0000000 --- a/03_source/api_server.del/src/controllers/order.controller.ts +++ /dev/null @@ -1,63 +0,0 @@ -// REQ0047/order-page -// -// PURPOSE: -// - provide api access to backend db for orders -// -// RULES: -// - T.B.A. -// -import httpStatus from 'http-status'; -import pick from '../utils/pick'; -import ApiError from '../utils/ApiError'; -import catchAsync from '../utils/catchAsync'; -import { userService } from '../services'; -import eventService from '../services/event.service'; -import orderService from '../services/order.service'; - -// const createUser = catchAsync(async (req, res) => { -// const { email, password, name, role } = req.body; -// const user = await userService.createUser(email, password, name, role); -// res.status(httpStatus.CREATED).send(user); -// }); - -// const getUsers = catchAsync(async (req, res) => { -// const filter = pick(req.query, ['name', 'role']); -// const options = pick(req.query, ['sortBy', 'limit', 'page']); -// const result = await userService.queryUsers(filter, options); -// res.send(result); -// }); - -const getOrders = catchAsync(async (req, res) => { - const filter = pick(req.query, ['name', 'role']); - const options = pick(req.query, ['sortBy', 'limit', 'page']); - const result = await orderService.queryOrders(filter, options); - res.send(result); -}); - -const getOrder = catchAsync(async (req, res) => { - const eventId = parseInt(req.params.eventId); - const event = await orderService.getOrderById(eventId); - if (!event) { - throw new ApiError(httpStatus.NOT_FOUND, 'Event not found'); - } - res.send(event); -}); - -// const updateUser = catchAsync(async (req, res) => { -// const user = await userService.updateUserById(req.params.userId, req.body); -// res.send(user); -// }); - -// const deleteUser = catchAsync(async (req, res) => { -// await userService.deleteUserById(req.params.userId); -// res.status(httpStatus.NO_CONTENT).send(); -// }); - -export default { - // createUser, - getOrders, - getOrder - // getUser - // updateUser, - // deleteUser -}; diff --git a/03_source/api_server.del/src/controllers/profile.controller.ts b/03_source/api_server.del/src/controllers/profile.controller.ts deleted file mode 100644 index c543950..0000000 --- a/03_source/api_server.del/src/controllers/profile.controller.ts +++ /dev/null @@ -1,56 +0,0 @@ -import httpStatus from 'http-status'; -import pick from '../utils/pick'; -import ApiError from '../utils/ApiError'; -import catchAsync from '../utils/catchAsync'; -import { userService } from '../services'; -import eventService from '../services/event.service'; -import memberService from '../services/member.service'; -import profileService from '../services/profile.service'; - -// const createUser = catchAsync(async (req, res) => { -// const { email, password, name, role } = req.body; -// const user = await userService.createUser(email, password, name, role); -// res.status(httpStatus.CREATED).send(user); -// }); - -// const getUsers = catchAsync(async (req, res) => { -// const filter = pick(req.query, ['name', 'role']); -// const options = pick(req.query, ['sortBy', 'limit', 'page']); -// const result = await userService.queryUsers(filter, options); -// res.send(result); -// }); - -const getMembers = catchAsync(async (req, res) => { - const filter = pick(req.query, ['name', 'role']); - const options = pick(req.query, ['sortBy', 'limit', 'page']); - const result = await memberService.queryMembers(filter, options); - res.send(result); -}); - -const getProfile = catchAsync(async (req, res) => { - const profileId = parseInt(req.params.profileId); - const profile = await profileService.getProfileById(profileId); - if (!profile) { - throw new ApiError(httpStatus.NOT_FOUND, 'Profile not found'); - } - res.send(profile); -}); - -// const updateUser = catchAsync(async (req, res) => { -// const user = await userService.updateUserById(req.params.userId, req.body); -// res.send(user); -// }); - -// const deleteUser = catchAsync(async (req, res) => { -// await userService.deleteUserById(req.params.userId); -// res.status(httpStatus.NO_CONTENT).send(); -// }); - -export default { - // createUser, - getMembers, - getProfile - // getUser - // updateUser, - // deleteUser -}; diff --git a/03_source/api_server.del/src/controllers/user.controller.ts b/03_source/api_server.del/src/controllers/user.controller.ts deleted file mode 100644 index bf115b6..0000000 --- a/03_source/api_server.del/src/controllers/user.controller.ts +++ /dev/null @@ -1,44 +0,0 @@ -import httpStatus from 'http-status'; -import pick from '../utils/pick'; -import ApiError from '../utils/ApiError'; -import catchAsync from '../utils/catchAsync'; -import { userService } from '../services'; - -const createUser = catchAsync(async (req, res) => { - const { email, password, name, role } = req.body; - const user = await userService.createUser(email, password, name, role); - res.status(httpStatus.CREATED).send(user); -}); - -const getUsers = catchAsync(async (req, res) => { - const filter = pick(req.query, ['name', 'role']); - const options = pick(req.query, ['sortBy', 'limit', 'page']); - const result = await userService.queryUsers(filter, options); - res.send(result); -}); - -const getUser = catchAsync(async (req, res) => { - const user = await userService.getUserById(req.params.userId); - if (!user) { - throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); - } - res.send(user); -}); - -const updateUser = catchAsync(async (req, res) => { - const user = await userService.updateUserById(req.params.userId, req.body); - res.send(user); -}); - -const deleteUser = catchAsync(async (req, res) => { - await userService.deleteUserById(req.params.userId); - res.status(httpStatus.NO_CONTENT).send(); -}); - -export default { - createUser, - getUsers, - getUser, - updateUser, - deleteUser -}; diff --git a/03_source/api_server.del/src/docs/components.yml b/03_source/api_server.del/src/docs/components.yml deleted file mode 100644 index d8b86fb..0000000 --- a/03_source/api_server.del/src/docs/components.yml +++ /dev/null @@ -1,92 +0,0 @@ -components: - schemas: - User: - type: object - properties: - id: - type: string - email: - type: string - format: email - name: - type: string - role: - type: string - enum: [USER, ADMIN] - example: - id: 5ebac534954b54139806c112 - email: fake@example.com - name: fake name - role: USER - - Token: - type: object - properties: - token: - type: string - expires: - type: string - format: date-time - example: - token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1ZWJhYzUzNDk1NGI1NDEzOTgwNmMxMTIiLCJpYXQiOjE1ODkyOTg0ODQsImV4cCI6MTU4OTMwMDI4NH0.m1U63blB0MLej_WfB7yC2FTMnCziif9X8yzwDEfJXAg - expires: 2020-05-12T16:18:04.793Z - - AuthTokens: - type: object - properties: - access: - $ref: '#/components/schemas/Token' - refresh: - $ref: '#/components/schemas/Token' - - Error: - type: object - properties: - code: - type: number - message: - type: string - - responses: - DuplicateEmail: - description: Email already taken - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - example: - code: 400 - message: Email already taken - Unauthorized: - description: Unauthorized - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - example: - code: 401 - message: Please authenticate - Forbidden: - description: Forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - example: - code: 403 - message: Forbidden - NotFound: - description: Not found - content: - application/json: - schema: - $ref: '#/components/schemas/Error' - example: - code: 404 - message: Not found - - securitySchemes: - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/03_source/api_server.del/src/docs/swaggerDef.ts b/03_source/api_server.del/src/docs/swaggerDef.ts deleted file mode 100644 index 25385ed..0000000 --- a/03_source/api_server.del/src/docs/swaggerDef.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { name, version, repository } from '../../package.json'; -import config from '../config/config'; - -const swaggerDef = { - openapi: '3.0.0', - info: { - title: `${name} API documentation`, - version, - license: { - name: 'MIT', - url: repository - } - }, - servers: [ - { - url: `http://localhost:${config.port}/v1` - } - ] -}; - -export default swaggerDef; diff --git a/03_source/api_server.del/src/index.ts b/03_source/api_server.del/src/index.ts deleted file mode 100644 index e1ef614..0000000 --- a/03_source/api_server.del/src/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Server } from 'http'; -import app from './app'; -import prisma from './client'; -import config from './config/config'; -import logger from './config/logger'; - -let server: Server; -prisma.$connect().then(() => { - logger.info('Connected to SQL Database'); - server = app.listen(config.port, () => { - logger.info(`Listening to port ${config.port}`); - }); -}); - -const exitHandler = () => { - if (server) { - server.close(() => { - logger.info('Server closed'); - process.exit(1); - }); - } else { - process.exit(1); - } -}; - -const unexpectedErrorHandler = (error: unknown) => { - logger.error(error); - exitHandler(); -}; - -process.on('uncaughtException', unexpectedErrorHandler); -process.on('unhandledRejection', unexpectedErrorHandler); - -process.on('SIGTERM', () => { - logger.info('SIGTERM received'); - if (server) { - server.close(); - } -}); diff --git a/03_source/api_server.del/src/middlewares/auth.ts b/03_source/api_server.del/src/middlewares/auth.ts deleted file mode 100644 index d2aa937..0000000 --- a/03_source/api_server.del/src/middlewares/auth.ts +++ /dev/null @@ -1,48 +0,0 @@ -import passport from 'passport'; -import httpStatus from 'http-status'; -import ApiError from '../utils/ApiError'; -import { roleRights } from '../config/roles'; -import { NextFunction, Request, Response } from 'express'; -import { User } from '@prisma/client'; - -const verifyCallback = - ( - req: any, - resolve: (value?: unknown) => void, - reject: (reason?: unknown) => void, - requiredRights: string[] - ) => - async (err: unknown, user: User | false, info: unknown) => { - if (err || info || !user) { - return reject(new ApiError(httpStatus.UNAUTHORIZED, 'Please authenticate')); - } - req.user = user; - - if (requiredRights.length) { - const userRights = roleRights.get(user.role) ?? []; - const hasRequiredRights = requiredRights.every((requiredRight) => - userRights.includes(requiredRight) - ); - if (!hasRequiredRights && req.params.userId !== user.id) { - return reject(new ApiError(httpStatus.FORBIDDEN, 'Forbidden')); - } - } - - resolve(); - }; - -const auth = - (...requiredRights: string[]) => - async (req: Request, res: Response, next: NextFunction) => { - return new Promise((resolve, reject) => { - passport.authenticate( - 'jwt', - { session: false }, - verifyCallback(req, resolve, reject, requiredRights) - )(req, res, next); - }) - .then(() => next()) - .catch((err) => next(err)); - }; - -export default auth; diff --git a/03_source/api_server.del/src/middlewares/error.ts b/03_source/api_server.del/src/middlewares/error.ts deleted file mode 100644 index 4f6f01f..0000000 --- a/03_source/api_server.del/src/middlewares/error.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ErrorRequestHandler } from 'express'; -import { Prisma } from '@prisma/client'; -import httpStatus from 'http-status'; -import config from '../config/config'; -import logger from '../config/logger'; -import ApiError from '../utils/ApiError'; - -export const errorConverter: ErrorRequestHandler = (err, req, res, next) => { - let error = err; - if (!(error instanceof ApiError)) { - const statusCode = - error.statusCode || error instanceof Prisma.PrismaClientKnownRequestError - ? httpStatus.BAD_REQUEST - : httpStatus.INTERNAL_SERVER_ERROR; - const message = error.message || httpStatus[statusCode]; - error = new ApiError(statusCode, message, false, err.stack); - } - next(error); -}; - -// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars -export const errorHandler: ErrorRequestHandler = (err, req, res, next) => { - let { statusCode, message } = err; - if (config.env === 'production' && !err.isOperational) { - statusCode = httpStatus.INTERNAL_SERVER_ERROR; - message = httpStatus[httpStatus.INTERNAL_SERVER_ERROR]; - } - - res.locals.errorMessage = err.message; - - const response = { - code: statusCode, - message, - ...(config.env === 'development' && { stack: err.stack }) - }; - - if (config.env === 'development') { - logger.error(err); - } - - res.status(statusCode).send(response); -}; diff --git a/03_source/api_server.del/src/middlewares/rateLimiter.ts b/03_source/api_server.del/src/middlewares/rateLimiter.ts deleted file mode 100644 index 651d39b..0000000 --- a/03_source/api_server.del/src/middlewares/rateLimiter.ts +++ /dev/null @@ -1,7 +0,0 @@ -import rateLimit from 'express-rate-limit'; - -export const authLimiter = rateLimit({ - windowMs: 15 * 60 * 1000, - max: 20, - skipSuccessfulRequests: true -}); diff --git a/03_source/api_server.del/src/middlewares/validate.ts b/03_source/api_server.del/src/middlewares/validate.ts deleted file mode 100644 index eb33640..0000000 --- a/03_source/api_server.del/src/middlewares/validate.ts +++ /dev/null @@ -1,21 +0,0 @@ -import httpStatus from 'http-status'; -import ApiError from '../utils/ApiError'; -import { NextFunction, Request, Response } from 'express'; -import pick from '../utils/pick'; -import Joi from 'joi'; - -const validate = (schema: object) => (req: Request, res: Response, next: NextFunction) => { - const validSchema = pick(schema, ['params', 'query', 'body']); - const obj = pick(req, Object.keys(validSchema)); - const { value, error } = Joi.compile(validSchema) - .prefs({ errors: { label: 'key' }, abortEarly: false }) - .validate(obj); - if (error) { - const errorMessage = error.details.map((details) => details.message).join(', '); - return next(new ApiError(httpStatus.BAD_REQUEST, errorMessage)); - } - Object.assign(req, value); - return next(); -}; - -export default validate; diff --git a/03_source/api_server.del/src/middlewares/xss.ts b/03_source/api_server.del/src/middlewares/xss.ts deleted file mode 100644 index 898206b..0000000 --- a/03_source/api_server.del/src/middlewares/xss.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NextFunction, Request, Response } from 'express'; -import { inHTMLData } from 'xss-filters'; - -/** - * Clean for xss. - * @param {string/object} data - The value to sanitize - * @return {string/object} The sanitized value - */ -export const clean = (data: T | string = ''): T => { - let isObject = false; - if (typeof data === 'object') { - data = JSON.stringify(data); - isObject = true; - } - - data = inHTMLData(data as string).trim(); - if (isObject) data = JSON.parse(data); - - return data as T; -}; - -const middleware = () => { - return (req: Request, res: Response, next: NextFunction) => { - if (req.body) req.body = clean(req.body); - if (req.query) req.query = clean(req.query); - if (req.params) req.params = clean(req.params); - next(); - }; -}; - -export default middleware; diff --git a/03_source/api_server.del/src/routes/v1/auth.route.ts b/03_source/api_server.del/src/routes/v1/auth.route.ts deleted file mode 100644 index e03a766..0000000 --- a/03_source/api_server.del/src/routes/v1/auth.route.ts +++ /dev/null @@ -1,303 +0,0 @@ -import express from 'express'; -import validate from '../../middlewares/validate'; -import authValidation from '../../validations/auth.validation'; -import { authController } from '../../controllers'; -import auth from '../../middlewares/auth'; - -const router = express.Router(); - -router.post('/register', validate(authValidation.register), authController.register); -router.post('/login', validate(authValidation.login), authController.login); -router.post('/logout', validate(authValidation.logout), authController.logout); -router.post( - '/refresh-tokens', - validate(authValidation.refreshTokens), - authController.refreshTokens -); -router.post( - '/forgot-password', - validate(authValidation.forgotPassword), - authController.forgotPassword -); -router.post( - '/reset-password', - validate(authValidation.resetPassword), - authController.resetPassword -); -router.post('/send-verification-email', auth(), authController.sendVerificationEmail); -router.post('/verify-email', validate(authValidation.verifyEmail), authController.verifyEmail); - -export default router; - -/** - * @swagger - * tags: - * name: Auth - * description: Authentication - */ - -/** - * @swagger - * /auth/register: - * post: - * summary: Register as user - * tags: [Auth] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - password - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * responses: - * "201": - * description: Created - * content: - * application/json: - * schema: - * type: object - * properties: - * user: - * $ref: '#/components/schemas/User' - * tokens: - * $ref: '#/components/schemas/AuthTokens' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - */ - -/** - * @swagger - * /auth/login: - * post: - * summary: Login - * tags: [Auth] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - email - * - password - * properties: - * email: - * type: string - * format: email - * password: - * type: string - * format: password - * example: - * email: fake@example.com - * password: password1 - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * type: object - * properties: - * user: - * $ref: '#/components/schemas/User' - * tokens: - * $ref: '#/components/schemas/AuthTokens' - * "401": - * description: Invalid email or password - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Error' - * example: - * code: 401 - * message: Invalid email or password - */ - -/** - * @swagger - * /auth/logout: - * post: - * summary: Logout - * tags: [Auth] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - refreshToken - * properties: - * refreshToken: - * type: string - * example: - * refreshToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1ZWJhYzUzNDk1NGI1NDEzOTgwNmMxMTIiLCJpYXQiOjE1ODkyOTg0ODQsImV4cCI6MTU4OTMwMDI4NH0.m1U63blB0MLej_WfB7yC2FTMnCziif9X8yzwDEfJXAg - * responses: - * "204": - * description: No content - * "404": - * $ref: '#/components/responses/NotFound' - */ - -/** - * @swagger - * /auth/refresh-tokens: - * post: - * summary: Refresh auth tokens - * tags: [Auth] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - refreshToken - * properties: - * refreshToken: - * type: string - * example: - * refreshToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1ZWJhYzUzNDk1NGI1NDEzOTgwNmMxMTIiLCJpYXQiOjE1ODkyOTg0ODQsImV4cCI6MTU4OTMwMDI4NH0.m1U63blB0MLej_WfB7yC2FTMnCziif9X8yzwDEfJXAg - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/AuthTokens' - * "401": - * $ref: '#/components/responses/Unauthorized' - */ - -/** - * @swagger - * /auth/forgot-password: - * post: - * summary: Forgot password - * description: An email will be sent to reset password. - * tags: [Auth] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - email - * properties: - * email: - * type: string - * format: email - * example: - * email: fake@example.com - * responses: - * "204": - * description: No content - * "404": - * $ref: '#/components/responses/NotFound' - */ - -/** - * @swagger - * /auth/reset-password: - * post: - * summary: Reset password - * tags: [Auth] - * parameters: - * - in: query - * name: token - * required: true - * schema: - * type: string - * description: The reset password token - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - password - * properties: - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * example: - * password: password1 - * responses: - * "204": - * description: No content - * "401": - * description: Password reset failed - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Error' - * example: - * code: 401 - * message: Password reset failed - */ - -/** - * @swagger - * /auth/send-verification-email: - * post: - * summary: Send verification email - * description: An email will be sent to verify email. - * tags: [Auth] - * security: - * - bearerAuth: [] - * responses: - * "204": - * description: No content - * "401": - * $ref: '#/components/responses/Unauthorized' - */ - -/** - * @swagger - * /auth/verify-email: - * post: - * summary: verify email - * tags: [Auth] - * parameters: - * - in: query - * name: token - * required: true - * schema: - * type: string - * description: The verify email token - * responses: - * "204": - * description: No content - * "401": - * description: verify email failed - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Error' - * example: - * code: 401 - * message: verify email failed - */ diff --git a/03_source/api_server.del/src/routes/v1/docs.route.ts b/03_source/api_server.del/src/routes/v1/docs.route.ts deleted file mode 100644 index 1f6f96b..0000000 --- a/03_source/api_server.del/src/routes/v1/docs.route.ts +++ /dev/null @@ -1,21 +0,0 @@ -import express from 'express'; -import swaggerJsdoc from 'swagger-jsdoc'; -import swaggerUi from 'swagger-ui-express'; -import swaggerDefinition from '../../docs/swaggerDef'; - -const router = express.Router(); - -const specs = swaggerJsdoc({ - swaggerDefinition, - apis: ['src/docs/*.yml', 'src/routes/v1/*.ts'] -}); - -router.use('/', swaggerUi.serve); -router.get( - '/', - swaggerUi.setup(specs, { - explorer: true - }) -); - -export default router; diff --git a/03_source/api_server.del/src/routes/v1/event.route.ts b/03_source/api_server.del/src/routes/v1/event.route.ts deleted file mode 100644 index 6108a6d..0000000 --- a/03_source/api_server.del/src/routes/v1/event.route.ts +++ /dev/null @@ -1,255 +0,0 @@ -import express from 'express'; -// import auth from '../../middlewares/auth'; -// import validate from '../../middlewares/validate'; -// import { userValidation } from '../../validations'; -// import { userController } from '../../controllers'; -import eventController from '../../controllers/event.controller'; -import helloworldController from '../../controllers/helloworld.controller'; - -const router = express.Router(); - -router.route('/helloworld').get(helloworldController.getHelloworld); - -router - .route('/') - // - .get(eventController.getEvents); -// .post(auth('manageUsers'), validate(userValidation.createUser), userController.createUser) - -router.route('/:eventId').get(eventController.getEvent); -// .patch(auth('manageUsers'), validate(userValidation.updateUser), userController.updateUser) -// .delete(auth('manageUsers'), validate(userValidation.deleteUser), userController.deleteUser); - -export default router; - -/** - * @swagger - * tags: - * name: Users - * description: User management and retrieval - */ - -/** - * @swagger - * /users: - * post: - * summary: Create a user - * description: Only admins can create other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - password - * - role - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * role: - * type: string - * enum: [user, admin] - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * role: user - * responses: - * "201": - * description: Created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * - * get: - * summary: Get all users - * description: Only admins can retrieve all users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: query - * name: name - * schema: - * type: string - * description: User name - * - in: query - * name: role - * schema: - * type: string - * description: User role - * - in: query - * name: sortBy - * schema: - * type: string - * description: sort by query in the form of field:desc/asc (ex. name:asc) - * - in: query - * name: limit - * schema: - * type: integer - * minimum: 1 - * default: 10 - * description: Maximum number of users - * - in: query - * name: page - * schema: - * type: integer - * minimum: 1 - * default: 1 - * description: Page number - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/User' - * page: - * type: integer - * example: 1 - * limit: - * type: integer - * example: 10 - * totalPages: - * type: integer - * example: 1 - * totalResults: - * type: integer - * example: 1 - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - */ - -/** - * @swagger - * /users/{id}: - * get: - * summary: Get a user - * description: Logged in users can fetch only their own user information. Only admins can fetch other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * patch: - * summary: Update a user - * description: Logged in users can only update their own information. Only admins can update other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * delete: - * summary: Delete a user - * description: Logged in users can delete only themselves. Only admins can delete other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: No content - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - */ diff --git a/03_source/api_server.del/src/routes/v1/helloworld.route.ts b/03_source/api_server.del/src/routes/v1/helloworld.route.ts deleted file mode 100644 index e84a144..0000000 --- a/03_source/api_server.del/src/routes/v1/helloworld.route.ts +++ /dev/null @@ -1,38 +0,0 @@ -import express from 'express'; -import helloworldController from '../../controllers/helloworld.controller'; - -const router = express.Router(); - -router.route('/').get(helloworldController.getHelloworld); - -export default router; - -/** - * @swagger - * tags: - * name: Helloworld - * description: Simple hello world endpoint - */ - -/** - * @swagger - * /helloworld: - * get: - * summary: Get hello world message - * description: Returns a simple hello world message - * tags: [Helloworld] - * responses: - * "200": - * description: Successful response - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - */ diff --git a/03_source/api_server.del/src/routes/v1/index.ts b/03_source/api_server.del/src/routes/v1/index.ts deleted file mode 100644 index fb3bff0..0000000 --- a/03_source/api_server.del/src/routes/v1/index.ts +++ /dev/null @@ -1,47 +0,0 @@ -import express from 'express'; -import authRoute from './auth.route'; -import userRoute from './user.route'; -import eventRoute from './event.route'; -import memberRoute from './member.route'; -import orderRoute from './order.route'; -import profileRoute from './profile.route'; -// -import helloworldRoute from './helloworld.route'; - -import docsRoute from './docs.route'; -import config from '../../config/config'; - -const router = express.Router(); - -const defaultRoutes = [ - { path: '/auth', route: authRoute }, - { path: '/users', route: userRoute }, - // - { path: '/events', route: eventRoute }, - { path: '/members', route: memberRoute }, - { path: '/orders', route: orderRoute }, - { path: '/profile', route: profileRoute }, - // - { path: '/helloworld', route: helloworldRoute } -]; - -const devRoutes = [ - // routes available only in development mode - { - path: '/docs', - route: docsRoute - } -]; - -defaultRoutes.forEach((route) => { - router.use(route.path, route.route); -}); - -/* istanbul ignore next */ -if (config.env === 'development') { - devRoutes.forEach((route) => { - router.use(route.path, route.route); - }); -} - -export default router; diff --git a/03_source/api_server.del/src/routes/v1/member.route.ts b/03_source/api_server.del/src/routes/v1/member.route.ts deleted file mode 100644 index 93e96db..0000000 --- a/03_source/api_server.del/src/routes/v1/member.route.ts +++ /dev/null @@ -1,255 +0,0 @@ -import express from 'express'; -// import auth from '../../middlewares/auth'; -// import validate from '../../middlewares/validate'; -// import { userValidation } from '../../validations'; -// import { userController } from '../../controllers'; -import memberController from '../../controllers/member.controller'; -import helloworldController from '../../controllers/helloworld.controller'; - -const router = express.Router(); - -router.route('/helloworld').get(helloworldController.getHelloworld); - -router - .route('/') - // - .get(memberController.getMembers); -// .post(auth('manageUsers'), validate(userValidation.createUser), userController.createUser) - -router.route('/:memberId').get(memberController.getMember); -// .patch(auth('manageUsers'), validate(userValidation.updateUser), userController.updateUser) -// .delete(auth('manageUsers'), validate(userValidation.deleteUser), userController.deleteUser); - -export default router; - -/** - * @swagger - * tags: - * name: Users - * description: User management and retrieval - */ - -/** - * @swagger - * /users: - * post: - * summary: Create a user - * description: Only admins can create other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - password - * - role - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * role: - * type: string - * enum: [user, admin] - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * role: user - * responses: - * "201": - * description: Created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * - * get: - * summary: Get all users - * description: Only admins can retrieve all users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: query - * name: name - * schema: - * type: string - * description: User name - * - in: query - * name: role - * schema: - * type: string - * description: User role - * - in: query - * name: sortBy - * schema: - * type: string - * description: sort by query in the form of field:desc/asc (ex. name:asc) - * - in: query - * name: limit - * schema: - * type: integer - * minimum: 1 - * default: 10 - * description: Maximum number of users - * - in: query - * name: page - * schema: - * type: integer - * minimum: 1 - * default: 1 - * description: Page number - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/User' - * page: - * type: integer - * example: 1 - * limit: - * type: integer - * example: 10 - * totalPages: - * type: integer - * example: 1 - * totalResults: - * type: integer - * example: 1 - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - */ - -/** - * @swagger - * /users/{id}: - * get: - * summary: Get a user - * description: Logged in users can fetch only their own user information. Only admins can fetch other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * patch: - * summary: Update a user - * description: Logged in users can only update their own information. Only admins can update other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * delete: - * summary: Delete a user - * description: Logged in users can delete only themselves. Only admins can delete other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: No content - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - */ diff --git a/03_source/api_server.del/src/routes/v1/order.route.ts b/03_source/api_server.del/src/routes/v1/order.route.ts deleted file mode 100644 index d875b32..0000000 --- a/03_source/api_server.del/src/routes/v1/order.route.ts +++ /dev/null @@ -1,264 +0,0 @@ -// REQ0047/order-page -// -// PURPOSE: -// - provide api access to backend db for orders -// -// RULES: -// - T.B.A. -// -import express from 'express'; -// import auth from '../../middlewares/auth'; -// import validate from '../../middlewares/validate'; -// import { userValidation } from '../../validations'; -// import { userController } from '../../controllers'; -import eventController from '../../controllers/event.controller'; -import orderController from '../../controllers/order.controller'; -import helloworldController from '../../controllers/helloworld.controller'; - -const router = express.Router(); - -router.route('/helloworld').get(helloworldController.getHelloworld); - -router - .route('/') - // - .get(orderController.getOrders); -// .post(auth('manageUsers'), validate(userValidation.createUser), userController.createUser) - -router.route('/:eventId').get(orderController.getOrder); -// .patch(auth('manageUsers'), validate(userValidation.updateUser), userController.updateUser) -// .delete(auth('manageUsers'), validate(userValidation.deleteUser), userController.deleteUser); - -export default router; - -/** - * @swagger - * tags: - * name: Users - * description: User management and retrieval - */ - -/** - * @swagger - * /users: - * post: - * summary: Create a user - * description: Only admins can create other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - password - * - role - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * role: - * type: string - * enum: [user, admin] - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * role: user - * responses: - * "201": - * description: Created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * - * get: - * summary: Get all users - * description: Only admins can retrieve all users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: query - * name: name - * schema: - * type: string - * description: User name - * - in: query - * name: role - * schema: - * type: string - * description: User role - * - in: query - * name: sortBy - * schema: - * type: string - * description: sort by query in the form of field:desc/asc (ex. name:asc) - * - in: query - * name: limit - * schema: - * type: integer - * minimum: 1 - * default: 10 - * description: Maximum number of users - * - in: query - * name: page - * schema: - * type: integer - * minimum: 1 - * default: 1 - * description: Page number - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/User' - * page: - * type: integer - * example: 1 - * limit: - * type: integer - * example: 10 - * totalPages: - * type: integer - * example: 1 - * totalResults: - * type: integer - * example: 1 - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - */ - -/** - * @swagger - * /users/{id}: - * get: - * summary: Get a user - * description: Logged in users can fetch only their own user information. Only admins can fetch other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * patch: - * summary: Update a user - * description: Logged in users can only update their own information. Only admins can update other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * delete: - * summary: Delete a user - * description: Logged in users can delete only themselves. Only admins can delete other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: No content - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - */ diff --git a/03_source/api_server.del/src/routes/v1/profile.route.ts b/03_source/api_server.del/src/routes/v1/profile.route.ts deleted file mode 100644 index aabf4f0..0000000 --- a/03_source/api_server.del/src/routes/v1/profile.route.ts +++ /dev/null @@ -1,256 +0,0 @@ -import express from 'express'; -// import auth from '../../middlewares/auth'; -// import validate from '../../middlewares/validate'; -// import { userValidation } from '../../validations'; -// import { userController } from '../../controllers'; -import memberController from '../../controllers/member.controller'; -import profileController from '../../controllers/profile.controller'; -import helloworldController from '../../controllers/helloworld.controller'; - -const router = express.Router(); - -router.route('/helloworld').get(helloworldController.getHelloworld); - -router - .route('/') - // - .get(profileController.getMembers); -// .post(auth('manageUsers'), validate(userValidation.createUser), userController.createUser) - -router.route('/:profileId').get(profileController.getProfile); -// .patch(auth('manageUsers'), validate(userValidation.updateUser), userController.updateUser) -// .delete(auth('manageUsers'), validate(userValidation.deleteUser), userController.deleteUser); - -export default router; - -/** - * @swagger - * tags: - * name: Users - * description: User management and retrieval - */ - -/** - * @swagger - * /users: - * post: - * summary: Create a user - * description: Only admins can create other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - password - * - role - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * role: - * type: string - * enum: [user, admin] - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * role: user - * responses: - * "201": - * description: Created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * - * get: - * summary: Get all users - * description: Only admins can retrieve all users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: query - * name: name - * schema: - * type: string - * description: User name - * - in: query - * name: role - * schema: - * type: string - * description: User role - * - in: query - * name: sortBy - * schema: - * type: string - * description: sort by query in the form of field:desc/asc (ex. name:asc) - * - in: query - * name: limit - * schema: - * type: integer - * minimum: 1 - * default: 10 - * description: Maximum number of users - * - in: query - * name: page - * schema: - * type: integer - * minimum: 1 - * default: 1 - * description: Page number - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/User' - * page: - * type: integer - * example: 1 - * limit: - * type: integer - * example: 10 - * totalPages: - * type: integer - * example: 1 - * totalResults: - * type: integer - * example: 1 - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - */ - -/** - * @swagger - * /users/{id}: - * get: - * summary: Get a user - * description: Logged in users can fetch only their own user information. Only admins can fetch other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * patch: - * summary: Update a user - * description: Logged in users can only update their own information. Only admins can update other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * delete: - * summary: Delete a user - * description: Logged in users can delete only themselves. Only admins can delete other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: No content - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - */ diff --git a/03_source/api_server.del/src/routes/v1/user.route.ts b/03_source/api_server.del/src/routes/v1/user.route.ts deleted file mode 100644 index 46dc435..0000000 --- a/03_source/api_server.del/src/routes/v1/user.route.ts +++ /dev/null @@ -1,252 +0,0 @@ -import express from 'express'; -import auth from '../../middlewares/auth'; -import validate from '../../middlewares/validate'; -import { userValidation } from '../../validations'; -import { userController } from '../../controllers'; - -const router = express.Router(); - -router - .route('/') - .post(auth('manageUsers'), validate(userValidation.createUser), userController.createUser) - .get(auth('getUsers'), validate(userValidation.getUsers), userController.getUsers); - -router - .route('/:userId') - .get(auth('getUsers'), validate(userValidation.getUser), userController.getUser) - .patch(auth('manageUsers'), validate(userValidation.updateUser), userController.updateUser) - .delete(auth('manageUsers'), validate(userValidation.deleteUser), userController.deleteUser); - -export default router; - -/** - * @swagger - * tags: - * name: Users - * description: User management and retrieval - */ - -/** - * @swagger - * /users: - * post: - * summary: Create a user - * description: Only admins can create other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - password - * - role - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * role: - * type: string - * enum: [user, admin] - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * role: user - * responses: - * "201": - * description: Created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * - * get: - * summary: Get all users - * description: Only admins can retrieve all users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: query - * name: name - * schema: - * type: string - * description: User name - * - in: query - * name: role - * schema: - * type: string - * description: User role - * - in: query - * name: sortBy - * schema: - * type: string - * description: sort by query in the form of field:desc/asc (ex. name:asc) - * - in: query - * name: limit - * schema: - * type: integer - * minimum: 1 - * default: 10 - * description: Maximum number of users - * - in: query - * name: page - * schema: - * type: integer - * minimum: 1 - * default: 1 - * description: Page number - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/User' - * page: - * type: integer - * example: 1 - * limit: - * type: integer - * example: 10 - * totalPages: - * type: integer - * example: 1 - * totalResults: - * type: integer - * example: 1 - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - */ - -/** - * @swagger - * /users/{id}: - * get: - * summary: Get a user - * description: Logged in users can fetch only their own user information. Only admins can fetch other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * patch: - * summary: Update a user - * description: Logged in users can only update their own information. Only admins can update other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * description: must be unique - * password: - * type: string - * format: password - * minLength: 8 - * description: At least one number and one letter - * example: - * name: fake name - * email: fake@example.com - * password: password1 - * responses: - * "200": - * description: OK - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * "400": - * $ref: '#/components/responses/DuplicateEmail' - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - * - * delete: - * summary: Delete a user - * description: Logged in users can delete only themselves. Only admins can delete other users. - * tags: [Users] - * security: - * - bearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: User id - * responses: - * "200": - * description: No content - * "401": - * $ref: '#/components/responses/Unauthorized' - * "403": - * $ref: '#/components/responses/Forbidden' - * "404": - * $ref: '#/components/responses/NotFound' - */ diff --git a/03_source/api_server.del/src/services/auth.service.ts b/03_source/api_server.del/src/services/auth.service.ts deleted file mode 100644 index 24179a0..0000000 --- a/03_source/api_server.del/src/services/auth.service.ts +++ /dev/null @@ -1,124 +0,0 @@ -import httpStatus from 'http-status'; -import tokenService from './token.service'; -import userService from './user.service'; -import ApiError from '../utils/ApiError'; -import { TokenType, User } from '@prisma/client'; -import prisma from '../client'; -import { encryptPassword, isPasswordMatch } from '../utils/encryption'; -import { AuthTokensResponse } from '../types/response'; -import exclude from '../utils/exclude'; - -/** - * Login with username and password - * @param {string} email - * @param {string} password - * @returns {Promise>} - */ -const loginUserWithEmailAndPassword = async ( - email: string, - password: string -): Promise> => { - const user = await userService.getUserByEmail(email, [ - 'id', - 'email', - 'name', - 'password', - 'role', - 'isEmailVerified', - 'createdAt', - 'updatedAt' - ]); - if (!user || !(await isPasswordMatch(password, user.password as string))) { - throw new ApiError(httpStatus.UNAUTHORIZED, 'Incorrect email or password'); - } - return exclude(user, ['password']); -}; - -/** - * Logout - * @param {string} refreshToken - * @returns {Promise} - */ -const logout = async (refreshToken: string): Promise => { - const refreshTokenData = await prisma.token.findFirst({ - where: { - token: refreshToken, - type: TokenType.REFRESH, - blacklisted: false - } - }); - if (!refreshTokenData) { - throw new ApiError(httpStatus.NOT_FOUND, 'Not found'); - } - await prisma.token.delete({ where: { id: refreshTokenData.id } }); -}; - -/** - * Refresh auth tokens - * @param {string} refreshToken - * @returns {Promise} - */ -const refreshAuth = async (refreshToken: string): Promise => { - try { - const refreshTokenData = await tokenService.verifyToken(refreshToken, TokenType.REFRESH); - const { userId } = refreshTokenData; - await prisma.token.delete({ where: { id: refreshTokenData.id } }); - return tokenService.generateAuthTokens({ id: userId }); - } catch (error) { - throw new ApiError(httpStatus.UNAUTHORIZED, 'Please authenticate'); - } -}; - -/** - * Reset password - * @param {string} resetPasswordToken - * @param {string} newPassword - * @returns {Promise} - */ -const resetPassword = async (resetPasswordToken: string, newPassword: string): Promise => { - try { - const resetPasswordTokenData = await tokenService.verifyToken( - resetPasswordToken, - TokenType.RESET_PASSWORD - ); - const user = await userService.getUserById(resetPasswordTokenData.userId); - if (!user) { - throw new Error(); - } - const encryptedPassword = await encryptPassword(newPassword); - await userService.updateUserById(user.id, { password: encryptedPassword }); - await prisma.token.deleteMany({ where: { userId: user.id, type: TokenType.RESET_PASSWORD } }); - } catch (error) { - throw new ApiError(httpStatus.UNAUTHORIZED, 'Password reset failed'); - } -}; - -/** - * Verify email - * @param {string} verifyEmailToken - * @returns {Promise} - */ -const verifyEmail = async (verifyEmailToken: string): Promise => { - try { - const verifyEmailTokenData = await tokenService.verifyToken( - verifyEmailToken, - TokenType.VERIFY_EMAIL - ); - await prisma.token.deleteMany({ - where: { userId: verifyEmailTokenData.userId, type: TokenType.VERIFY_EMAIL } - }); - await userService.updateUserById(verifyEmailTokenData.userId, { isEmailVerified: true }); - } catch (error) { - throw new ApiError(httpStatus.UNAUTHORIZED, 'Email verification failed'); - } -}; - -export default { - loginUserWithEmailAndPassword, - isPasswordMatch, - encryptPassword, - logout, - refreshAuth, - resetPassword, - verifyEmail -}; diff --git a/03_source/api_server.del/src/services/email.service.ts b/03_source/api_server.del/src/services/email.service.ts deleted file mode 100644 index 20ed977..0000000 --- a/03_source/api_server.del/src/services/email.service.ts +++ /dev/null @@ -1,66 +0,0 @@ -import nodemailer from 'nodemailer'; -import config from '../config/config'; -import logger from '../config/logger'; - -const transport = nodemailer.createTransport(config.email.smtp); -/* istanbul ignore next */ -if (config.env !== 'test') { - transport - .verify() - .then(() => logger.info('Connected to email server')) - .catch(() => - logger.warn( - 'Unable to connect to email server. Make sure you have configured the SMTP options in .env' - ) - ); -} - -/** - * Send an email - * @param {string} to - * @param {string} subject - * @param {string} text - * @returns {Promise} - */ -const sendEmail = async (to: string, subject: string, text: string) => { - const msg = { from: config.email.from, to, subject, text }; - await transport.sendMail(msg); -}; - -/** - * Send reset password email - * @param {string} to - * @param {string} token - * @returns {Promise} - */ -const sendResetPasswordEmail = async (to: string, token: string) => { - const subject = 'Reset password'; - // replace this url with the link to the reset password page of your front-end app - const resetPasswordUrl = `http://link-to-app/reset-password?token=${token}`; - const text = `Dear user, -To reset your password, click on this link: ${resetPasswordUrl} -If you did not request any password resets, then ignore this email.`; - await sendEmail(to, subject, text); -}; - -/** - * Send verification email - * @param {string} to - * @param {string} token - * @returns {Promise} - */ -const sendVerificationEmail = async (to: string, token: string) => { - const subject = 'Email Verification'; - // replace this url with the link to the email verification page of your front-end app - const verificationEmailUrl = `http://link-to-app/verify-email?token=${token}`; - const text = `Dear user, -To verify your email, click on this link: ${verificationEmailUrl}`; - await sendEmail(to, subject, text); -}; - -export default { - transport, - sendEmail, - sendResetPasswordEmail, - sendVerificationEmail -}; diff --git a/03_source/api_server.del/src/services/event.service.ts b/03_source/api_server.del/src/services/event.service.ts deleted file mode 100644 index 85f62e7..0000000 --- a/03_source/api_server.del/src/services/event.service.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { User, Role, Prisma, Event } from '@prisma/client'; -import httpStatus from 'http-status'; -import prisma from '../client'; -import ApiError from '../utils/ApiError'; -import { encryptPassword } from '../utils/encryption'; - -/** - * Create a user - * @param {Object} userBody - * @returns {Promise} - */ -// const createUser = async ( -// email: string, -// password: string, -// name?: string, -// role: Role = Role.USER -// ): Promise => { -// if (await getEventByEmail(email)) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// return prisma.user.create({ -// data: { -// email, -// name, -// password: await encryptPassword(password), -// role -// } -// }); -// }; - -/** - * Query for users - * @param {Object} filter - Prisma filter - * @param {Object} options - Query options - * @param {string} [options.sortBy] - Sort option in the format: sortField:(desc|asc) - * @param {number} [options.limit] - Maximum number of results per page (default = 10) - * @param {number} [options.page] - Current page (default = 1) - * @returns {Promise} - */ -const queryEvents = async ( - filter: object, - options: { - limit?: number; - page?: number; - sortBy?: string; - sortType?: 'asc' | 'desc'; - }, - keys: Key[] = [ - 'id', - 'email', - 'name', - 'password', - 'role', - 'isEmailVerified', - 'createdAt', - 'updatedAt' - ] as Key[] -): Promise[]> => { - // const page = options.page ?? 1; - // const limit = options.limit ?? 10; - // const sortBy = options.sortBy; - // const sortType = options.sortType ?? 'desc'; - const events = await prisma.event.findMany(); - return events as Pick[]; -}; - -/** - * Get event by id - * @param {ObjectId} id - * @param {Array} keys - * @returns {Promise | null>} - */ -const getEventById = async ( - id: number, - keys: Key[] = ['id'] as Key[] -): Promise | null> => { - return prisma.event.findUnique({ - where: { id } - // select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) - }) as Promise | null>; -}; - -/** - * Get event by email - * @param {string} email - * @param {Array} keys - * @returns {Promise | null>} - */ -// const getEventByEmail = async ( -// email: string, -// keys: Key[] = [ -// 'id', -// 'email', -// 'name', -// 'password', -// 'role', -// 'isEmailVerified', -// 'createdAt', -// 'updatedAt' -// ] as Key[] -// ): Promise | null> => { -// return prisma.user.findUnique({ -// where: { email }, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }) as Promise | null>; -// }; - -/** - * Update user by id - * @param {ObjectId} userId - * @param {Object} updateBody - * @returns {Promise} - */ -// const updateUserById = async ( -// userId: number, -// updateBody: Prisma.UserUpdateInput, -// keys: Key[] = ['id', 'email', 'name', 'role'] as Key[] -// ): Promise | null> => { -// const user = await getEventById(userId, ['id', 'email', 'name']); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// if (updateBody.email && (await getEventByEmail(updateBody.email as string))) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// const updatedUser = await prisma.user.update({ -// where: { id: user.id }, -// data: updateBody, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }); -// return updatedUser as Pick | null; -// }; - -/** - * Delete user by id - * @param {ObjectId} userId - * @returns {Promise} - */ -// const deleteUserById = async (userId: number): Promise => { -// const user = await getEventById(userId); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// await prisma.user.delete({ where: { id: user.id } }); -// return user; -// }; - -export default { - // createUser, - queryEvents, - getEventById - // getEventById, - // getEventByEmail, - // updateUserById, - // deleteUserById -}; diff --git a/03_source/api_server.del/src/services/index.ts b/03_source/api_server.del/src/services/index.ts deleted file mode 100644 index c869b5c..0000000 --- a/03_source/api_server.del/src/services/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { default as authService } from './auth.service'; -export { default as userService } from './user.service'; -export { default as tokenService } from './token.service'; -export { default as emailService } from './email.service'; -export { default as eventService } from './event.service'; diff --git a/03_source/api_server.del/src/services/member.service.ts b/03_source/api_server.del/src/services/member.service.ts deleted file mode 100644 index 221e754..0000000 --- a/03_source/api_server.del/src/services/member.service.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { User, Role, Prisma, Event, Member } from '@prisma/client'; -import httpStatus from 'http-status'; -import prisma from '../client'; -import ApiError from '../utils/ApiError'; -import { encryptPassword } from '../utils/encryption'; - -/** - * Create a user - * @param {Object} userBody - * @returns {Promise} - */ -// const createUser = async ( -// email: string, -// password: string, -// name?: string, -// role: Role = Role.USER -// ): Promise => { -// if (await getEventByEmail(email)) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// return prisma.user.create({ -// data: { -// email, -// name, -// password: await encryptPassword(password), -// role -// } -// }); -// }; - -/** - * Query for users - * @param {Object} filter - Prisma filter - * @param {Object} options - Query options - * @param {string} [options.sortBy] - Sort option in the format: sortField:(desc|asc) - * @param {number} [options.limit] - Maximum number of results per page (default = 10) - * @param {number} [options.page] - Current page (default = 1) - * @returns {Promise} - */ -const queryMembers = async ( - filter: object, - options: { - limit?: number; - page?: number; - sortBy?: string; - sortType?: 'asc' | 'desc'; - }, - keys: Key[] = ['id'] as Key[] -): Promise[]> => { - // const page = options.page ?? 1; - // const limit = options.limit ?? 10; - // const sortBy = options.sortBy; - // const sortType = options.sortType ?? 'desc'; - const members = await prisma.member.findMany(); - return members as Pick[]; -}; - -/** - * Get event by id - * @param {ObjectId} id - * @param {Array} keys - * @returns {Promise | null>} - */ -const getMemberById = async ( - id: number, - keys: Key[] = ['id'] as Key[] -): Promise | null> => { - return prisma.member.findUnique({ - where: { id } - // select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) - }) as Promise | null>; -}; - -/** - * Get event by email - * @param {string} email - * @param {Array} keys - * @returns {Promise | null>} - */ -// const getEventByEmail = async ( -// email: string, -// keys: Key[] = [ -// 'id', -// 'email', -// 'name', -// 'password', -// 'role', -// 'isEmailVerified', -// 'createdAt', -// 'updatedAt' -// ] as Key[] -// ): Promise | null> => { -// return prisma.user.findUnique({ -// where: { email }, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }) as Promise | null>; -// }; - -/** - * Update user by id - * @param {ObjectId} userId - * @param {Object} updateBody - * @returns {Promise} - */ -// const updateUserById = async ( -// userId: number, -// updateBody: Prisma.UserUpdateInput, -// keys: Key[] = ['id', 'email', 'name', 'role'] as Key[] -// ): Promise | null> => { -// const user = await getEventById(userId, ['id', 'email', 'name']); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// if (updateBody.email && (await getEventByEmail(updateBody.email as string))) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// const updatedUser = await prisma.user.update({ -// where: { id: user.id }, -// data: updateBody, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }); -// return updatedUser as Pick | null; -// }; - -/** - * Delete user by id - * @param {ObjectId} userId - * @returns {Promise} - */ -// const deleteUserById = async (userId: number): Promise => { -// const user = await getEventById(userId); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// await prisma.user.delete({ where: { id: user.id } }); -// return user; -// }; - -export default { - // createUser, - queryMembers, - getMemberById - // getEventById, - // getEventByEmail, - // updateUserById, - // deleteUserById -}; diff --git a/03_source/api_server.del/src/services/order.service.ts b/03_source/api_server.del/src/services/order.service.ts deleted file mode 100644 index 6719729..0000000 --- a/03_source/api_server.del/src/services/order.service.ts +++ /dev/null @@ -1,164 +0,0 @@ -// REQ0047/order-page -// -// PURPOSE: -// - provide api access to backend db for orders -// -// RULES: -// - T.B.A. -// -import { User, Role, Prisma, Event, Order } from '@prisma/client'; -import httpStatus from 'http-status'; -import prisma from '../client'; -import ApiError from '../utils/ApiError'; -import { encryptPassword } from '../utils/encryption'; - -/** - * Create a user - * @param {Object} userBody - * @returns {Promise} - */ -// const createUser = async ( -// email: string, -// password: string, -// name?: string, -// role: Role = Role.USER -// ): Promise => { -// if (await getEventByEmail(email)) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// return prisma.user.create({ -// data: { -// email, -// name, -// password: await encryptPassword(password), -// role -// } -// }); -// }; - -/** - * Query for users - * @param {Object} filter - Prisma filter - * @param {Object} options - Query options - * @param {string} [options.sortBy] - Sort option in the format: sortField:(desc|asc) - * @param {number} [options.limit] - Maximum number of results per page (default = 10) - * @param {number} [options.page] - Current page (default = 1) - * @returns {Promise} - */ -const queryOrders = async ( - filter: object, - options: { - limit?: number; - page?: number; - sortBy?: string; - sortType?: 'asc' | 'desc'; - }, - keys: Key[] = [ - 'id', - 'email', - 'name', - 'password', - 'role', - 'isEmailVerified', - 'createdAt', - 'updatedAt' - ] as Key[] -): Promise[]> => { - // const page = options.page ?? 1; - // const limit = options.limit ?? 10; - // const sortBy = options.sortBy; - // const sortType = options.sortType ?? 'desc'; - const events = await prisma.order.findMany(); - return events as Pick[]; -}; - -/** - * Get event by id - * @param {ObjectId} id - * @param {Array} keys - * @returns {Promise | null>} - */ -const getOrderById = async ( - id: number, - keys: Key[] = ['id'] as Key[] -): Promise | null> => { - return prisma.order.findUnique({ - where: { id } - // select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) - }) as Promise | null>; -}; - -/** - * Get event by email - * @param {string} email - * @param {Array} keys - * @returns {Promise | null>} - */ -// const getEventByEmail = async ( -// email: string, -// keys: Key[] = [ -// 'id', -// 'email', -// 'name', -// 'password', -// 'role', -// 'isEmailVerified', -// 'createdAt', -// 'updatedAt' -// ] as Key[] -// ): Promise | null> => { -// return prisma.user.findUnique({ -// where: { email }, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }) as Promise | null>; -// }; - -/** - * Update user by id - * @param {ObjectId} userId - * @param {Object} updateBody - * @returns {Promise} - */ -// const updateUserById = async ( -// userId: number, -// updateBody: Prisma.UserUpdateInput, -// keys: Key[] = ['id', 'email', 'name', 'role'] as Key[] -// ): Promise | null> => { -// const user = await getEventById(userId, ['id', 'email', 'name']); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// if (updateBody.email && (await getEventByEmail(updateBody.email as string))) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// const updatedUser = await prisma.user.update({ -// where: { id: user.id }, -// data: updateBody, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }); -// return updatedUser as Pick | null; -// }; - -/** - * Delete user by id - * @param {ObjectId} userId - * @returns {Promise} - */ -// const deleteUserById = async (userId: number): Promise => { -// const user = await getEventById(userId); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// await prisma.user.delete({ where: { id: user.id } }); -// return user; -// }; - -export default { - // createUser, - queryOrders, - getOrderById - // getEventById, - // getEventByEmail, - // updateUserById, - // deleteUserById -}; diff --git a/03_source/api_server.del/src/services/profile.service.ts b/03_source/api_server.del/src/services/profile.service.ts deleted file mode 100644 index 95f3ec6..0000000 --- a/03_source/api_server.del/src/services/profile.service.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { User, Role, Prisma, Event, Member } from '@prisma/client'; -import httpStatus from 'http-status'; -import prisma from '../client'; -import ApiError from '../utils/ApiError'; -import { encryptPassword } from '../utils/encryption'; - -/** - * Create a user - * @param {Object} userBody - * @returns {Promise} - */ -// const createUser = async ( -// email: string, -// password: string, -// name?: string, -// role: Role = Role.USER -// ): Promise => { -// if (await getEventByEmail(email)) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// return prisma.user.create({ -// data: { -// email, -// name, -// password: await encryptPassword(password), -// role -// } -// }); -// }; - -/** - * Query for users - * @param {Object} filter - Prisma filter - * @param {Object} options - Query options - * @param {string} [options.sortBy] - Sort option in the format: sortField:(desc|asc) - * @param {number} [options.limit] - Maximum number of results per page (default = 10) - * @param {number} [options.page] - Current page (default = 1) - * @returns {Promise} - */ -const queryMembers = async ( - filter: object, - options: { - limit?: number; - page?: number; - sortBy?: string; - sortType?: 'asc' | 'desc'; - }, - keys: Key[] = ['id'] as Key[] -): Promise[]> => { - // const page = options.page ?? 1; - // const limit = options.limit ?? 10; - // const sortBy = options.sortBy; - // const sortType = options.sortType ?? 'desc'; - const members = await prisma.member.findMany(); - return members as Pick[]; -}; - -/** - * Get event by id - * @param {ObjectId} id - * @param {Array} keys - * @returns {Promise | null>} - */ -const getProfileById = async ( - id: number, - keys: Key[] = ['id'] as Key[] -): Promise | null> => { - return prisma.member.findUnique({ - where: { id } - // select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) - }) as Promise | null>; -}; - -/** - * Get event by email - * @param {string} email - * @param {Array} keys - * @returns {Promise | null>} - */ -// const getEventByEmail = async ( -// email: string, -// keys: Key[] = [ -// 'id', -// 'email', -// 'name', -// 'password', -// 'role', -// 'isEmailVerified', -// 'createdAt', -// 'updatedAt' -// ] as Key[] -// ): Promise | null> => { -// return prisma.user.findUnique({ -// where: { email }, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }) as Promise | null>; -// }; - -/** - * Update user by id - * @param {ObjectId} userId - * @param {Object} updateBody - * @returns {Promise} - */ -// const updateUserById = async ( -// userId: number, -// updateBody: Prisma.UserUpdateInput, -// keys: Key[] = ['id', 'email', 'name', 'role'] as Key[] -// ): Promise | null> => { -// const user = await getEventById(userId, ['id', 'email', 'name']); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// if (updateBody.email && (await getEventByEmail(updateBody.email as string))) { -// throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); -// } -// const updatedUser = await prisma.user.update({ -// where: { id: user.id }, -// data: updateBody, -// select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) -// }); -// return updatedUser as Pick | null; -// }; - -/** - * Delete user by id - * @param {ObjectId} userId - * @returns {Promise} - */ -// const deleteUserById = async (userId: number): Promise => { -// const user = await getEventById(userId); -// if (!user) { -// throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); -// } -// await prisma.user.delete({ where: { id: user.id } }); -// return user; -// }; - -export default { - // createUser, - queryMembers, - getProfileById - // getEventById, - // getEventByEmail, - // updateUserById, - // deleteUserById -}; diff --git a/03_source/api_server.del/src/services/token.service.ts b/03_source/api_server.del/src/services/token.service.ts deleted file mode 100644 index d69c561..0000000 --- a/03_source/api_server.del/src/services/token.service.ts +++ /dev/null @@ -1,140 +0,0 @@ -import jwt from 'jsonwebtoken'; -import moment, { Moment } from 'moment'; -import httpStatus from 'http-status'; -import config from '../config/config'; -import userService from './user.service'; -import ApiError from '../utils/ApiError'; -import { Token, TokenType } from '@prisma/client'; -import prisma from '../client'; -import { AuthTokensResponse } from '../types/response'; - -/** - * Generate token - * @param {number} userId - * @param {Moment} expires - * @param {string} type - * @param {string} [secret] - * @returns {string} - */ -const generateToken = ( - userId: number, - expires: Moment, - type: TokenType, - secret = config.jwt.secret -): string => { - const payload = { - sub: userId, - iat: moment().unix(), - exp: expires.unix(), - type - }; - return jwt.sign(payload, secret); -}; - -/** - * Save a token - * @param {string} token - * @param {number} userId - * @param {Moment} expires - * @param {string} type - * @param {boolean} [blacklisted] - * @returns {Promise} - */ -const saveToken = async ( - token: string, - userId: number, - expires: Moment, - type: TokenType, - blacklisted = false -): Promise => { - const createdToken = prisma.token.create({ - data: { - token, - userId: userId, - expires: expires.toDate(), - type, - blacklisted - } - }); - return createdToken; -}; - -/** - * Verify token and return token doc (or throw an error if it is not valid) - * @param {string} token - * @param {string} type - * @returns {Promise} - */ -const verifyToken = async (token: string, type: TokenType): Promise => { - const payload = jwt.verify(token, config.jwt.secret); - const userId = Number(payload.sub); - const tokenData = await prisma.token.findFirst({ - where: { token, type, userId, blacklisted: false } - }); - if (!tokenData) { - throw new Error('Token not found'); - } - return tokenData; -}; - -/** - * Generate auth tokens - * @param {User} user - * @returns {Promise} - */ -const generateAuthTokens = async (user: { id: number }): Promise => { - const accessTokenExpires = moment().add(config.jwt.accessExpirationMinutes, 'minutes'); - const accessToken = generateToken(user.id, accessTokenExpires, TokenType.ACCESS); - - const refreshTokenExpires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = generateToken(user.id, refreshTokenExpires, TokenType.REFRESH); - await saveToken(refreshToken, user.id, refreshTokenExpires, TokenType.REFRESH); - - return { - access: { - token: accessToken, - expires: accessTokenExpires.toDate() - }, - refresh: { - token: refreshToken, - expires: refreshTokenExpires.toDate() - } - }; -}; - -/** - * Generate reset password token - * @param {string} email - * @returns {Promise} - */ -const generateResetPasswordToken = async (email: string): Promise => { - const user = await userService.getUserByEmail(email); - if (!user) { - throw new ApiError(httpStatus.NOT_FOUND, 'No users found with this email'); - } - const expires = moment().add(config.jwt.resetPasswordExpirationMinutes, 'minutes'); - const resetPasswordToken = generateToken(user.id as number, expires, TokenType.RESET_PASSWORD); - await saveToken(resetPasswordToken, user.id as number, expires, TokenType.RESET_PASSWORD); - return resetPasswordToken; -}; - -/** - * Generate verify email token - * @param {User} user - * @returns {Promise} - */ -const generateVerifyEmailToken = async (user: { id: number }): Promise => { - const expires = moment().add(config.jwt.verifyEmailExpirationMinutes, 'minutes'); - const verifyEmailToken = generateToken(user.id, expires, TokenType.VERIFY_EMAIL); - await saveToken(verifyEmailToken, user.id, expires, TokenType.VERIFY_EMAIL); - return verifyEmailToken; -}; - -export default { - generateToken, - saveToken, - verifyToken, - generateAuthTokens, - generateResetPasswordToken, - generateVerifyEmailToken -}; diff --git a/03_source/api_server.del/src/services/user.service.ts b/03_source/api_server.del/src/services/user.service.ts deleted file mode 100644 index 343fa49..0000000 --- a/03_source/api_server.del/src/services/user.service.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { User, Role, Prisma } from '@prisma/client'; -import httpStatus from 'http-status'; -import prisma from '../client'; -import ApiError from '../utils/ApiError'; -import { encryptPassword } from '../utils/encryption'; - -/** - * Create a user - * @param {Object} userBody - * @returns {Promise} - */ -const createUser = async ( - email: string, - password: string, - name?: string, - role: Role = Role.USER -): Promise => { - if (await getUserByEmail(email)) { - throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); - } - return prisma.user.create({ - data: { - email, - name, - password: await encryptPassword(password), - role - } - }); -}; - -/** - * Query for users - * @param {Object} filter - Prisma filter - * @param {Object} options - Query options - * @param {string} [options.sortBy] - Sort option in the format: sortField:(desc|asc) - * @param {number} [options.limit] - Maximum number of results per page (default = 10) - * @param {number} [options.page] - Current page (default = 1) - * @returns {Promise} - */ -const queryUsers = async ( - filter: object, - options: { - limit?: number; - page?: number; - sortBy?: string; - sortType?: 'asc' | 'desc'; - }, - keys: Key[] = [ - 'id', - 'email', - 'name', - 'password', - 'role', - 'isEmailVerified', - 'createdAt', - 'updatedAt' - ] as Key[] -): Promise[]> => { - const page = options.page ?? 1; - const limit = options.limit ?? 10; - const sortBy = options.sortBy; - const sortType = options.sortType ?? 'desc'; - const users = await prisma.user.findMany({ - where: filter, - select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}), - skip: page * limit, - take: limit, - orderBy: sortBy ? { [sortBy]: sortType } : undefined - }); - return users as Pick[]; -}; - -/** - * Get user by id - * @param {ObjectId} id - * @param {Array} keys - * @returns {Promise | null>} - */ -const getUserById = async ( - id: number, - keys: Key[] = [ - 'id', - 'email', - 'name', - 'password', - 'role', - 'isEmailVerified', - 'createdAt', - 'updatedAt' - ] as Key[] -): Promise | null> => { - return prisma.user.findUnique({ - where: { id }, - select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) - }) as Promise | null>; -}; - -/** - * Get user by email - * @param {string} email - * @param {Array} keys - * @returns {Promise | null>} - */ -const getUserByEmail = async ( - email: string, - keys: Key[] = [ - 'id', - 'email', - 'name', - 'password', - 'role', - 'isEmailVerified', - 'createdAt', - 'updatedAt' - ] as Key[] -): Promise | null> => { - return prisma.user.findUnique({ - where: { email }, - select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) - }) as Promise | null>; -}; - -/** - * Update user by id - * @param {ObjectId} userId - * @param {Object} updateBody - * @returns {Promise} - */ -const updateUserById = async ( - userId: number, - updateBody: Prisma.UserUpdateInput, - keys: Key[] = ['id', 'email', 'name', 'role'] as Key[] -): Promise | null> => { - const user = await getUserById(userId, ['id', 'email', 'name']); - if (!user) { - throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); - } - if (updateBody.email && (await getUserByEmail(updateBody.email as string))) { - throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken'); - } - const updatedUser = await prisma.user.update({ - where: { id: user.id }, - data: updateBody, - select: keys.reduce((obj, k) => ({ ...obj, [k]: true }), {}) - }); - return updatedUser as Pick | null; -}; - -/** - * Delete user by id - * @param {ObjectId} userId - * @returns {Promise} - */ -const deleteUserById = async (userId: number): Promise => { - const user = await getUserById(userId); - if (!user) { - throw new ApiError(httpStatus.NOT_FOUND, 'User not found'); - } - await prisma.user.delete({ where: { id: user.id } }); - return user; -}; - -export default { - createUser, - queryUsers, - getUserById, - getUserByEmail, - updateUserById, - deleteUserById -}; diff --git a/03_source/api_server.del/src/types/response.d.ts b/03_source/api_server.del/src/types/response.d.ts deleted file mode 100644 index e2a75f8..0000000 --- a/03_source/api_server.del/src/types/response.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface TokenResponse { - token: string; - expires: Date; -} - -export interface AuthTokensResponse { - access: TokenResponse; - refresh?: TokenResponse; -} diff --git a/03_source/api_server.del/src/utils/ApiError.ts b/03_source/api_server.del/src/utils/ApiError.ts deleted file mode 100644 index 76ff274..0000000 --- a/03_source/api_server.del/src/utils/ApiError.ts +++ /dev/null @@ -1,17 +0,0 @@ -class ApiError extends Error { - statusCode: number; - isOperational: boolean; - - constructor(statusCode: number, message: string | undefined, isOperational = true, stack = '') { - super(message); - this.statusCode = statusCode; - this.isOperational = isOperational; - if (stack) { - this.stack = stack; - } else { - Error.captureStackTrace(this, this.constructor); - } - } -} - -export default ApiError; diff --git a/03_source/api_server.del/src/utils/catchAsync.ts b/03_source/api_server.del/src/utils/catchAsync.ts deleted file mode 100644 index 6fd8cfc..0000000 --- a/03_source/api_server.del/src/utils/catchAsync.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { RequestHandler } from 'express'; -import { Request, Response, NextFunction } from 'express-serve-static-core'; - -export interface CustomParamsDictionary { - [key: string]: any; -} - -const catchAsync = - (fn: RequestHandler>) => - ( - req: Request>, - res: Response, number>, - next: NextFunction - ) => { - Promise.resolve(fn(req, res, next)).catch((err) => next(err)); - }; - -export default catchAsync; diff --git a/03_source/api_server.del/src/utils/encryption.ts b/03_source/api_server.del/src/utils/encryption.ts deleted file mode 100644 index d053d65..0000000 --- a/03_source/api_server.del/src/utils/encryption.ts +++ /dev/null @@ -1,10 +0,0 @@ -import bcrypt from 'bcryptjs'; - -export const encryptPassword = async (password: string) => { - const encryptedPassword = await bcrypt.hash(password, 8); - return encryptedPassword; -}; - -export const isPasswordMatch = async (password: string, userPassword: string) => { - return bcrypt.compare(password, userPassword); -}; diff --git a/03_source/api_server.del/src/utils/exclude.ts b/03_source/api_server.del/src/utils/exclude.ts deleted file mode 100644 index ee4b52a..0000000 --- a/03_source/api_server.del/src/utils/exclude.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Exclude keys from object - * @param obj - * @param keys - * @returns - */ -const exclude = (obj: Type, keys: Key[]): Omit => { - for (const key of keys) { - delete obj[key]; - } - return obj; -}; - -export default exclude; diff --git a/03_source/api_server.del/src/utils/pick.ts b/03_source/api_server.del/src/utils/pick.ts deleted file mode 100644 index 53694e0..0000000 --- a/03_source/api_server.del/src/utils/pick.ts +++ /dev/null @@ -1,10 +0,0 @@ -const pick = (obj: object, keys: string[]) => { - return keys.reduce<{ [key: string]: unknown }>((finalObj, key) => { - if (obj && Object.hasOwnProperty.call(obj, key)) { - finalObj[key] = obj[key as keyof typeof obj]; - } - return finalObj; - }, {}); -}; - -export default pick; diff --git a/03_source/api_server.del/src/validations/auth.validation.ts b/03_source/api_server.del/src/validations/auth.validation.ts deleted file mode 100644 index e11f11e..0000000 --- a/03_source/api_server.del/src/validations/auth.validation.ts +++ /dev/null @@ -1,59 +0,0 @@ -import Joi from 'joi'; -import { password } from './custom.validation'; - -const register = { - body: Joi.object().keys({ - email: Joi.string().required().email(), - password: Joi.string().required().custom(password) - }) -}; - -const login = { - body: Joi.object().keys({ - email: Joi.string().required(), - password: Joi.string().required() - }) -}; - -const logout = { - body: Joi.object().keys({ - refreshToken: Joi.string().required() - }) -}; - -const refreshTokens = { - body: Joi.object().keys({ - refreshToken: Joi.string().required() - }) -}; - -const forgotPassword = { - body: Joi.object().keys({ - email: Joi.string().email().required() - }) -}; - -const resetPassword = { - query: Joi.object().keys({ - token: Joi.string().required() - }), - body: Joi.object().keys({ - password: Joi.string().required().custom(password) - }) -}; - -const verifyEmail = { - query: Joi.object().keys({ - token: Joi.string().required() - }) -}; - -export default { - register, - login, - logout, - refreshTokens, - forgotPassword, - resetPassword, - verifyEmail -}; diff --git a/03_source/api_server.del/src/validations/custom.validation.ts b/03_source/api_server.del/src/validations/custom.validation.ts deleted file mode 100644 index ce686f1..0000000 --- a/03_source/api_server.del/src/validations/custom.validation.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Joi from 'joi'; - -export const password: Joi.CustomValidator = (value, helpers) => { - if (value.length < 8) { - return helpers.error('password must be at least 8 characters'); - } - if (!value.match(/\d/) || !value.match(/[a-zA-Z]/)) { - return helpers.error('password must contain at least 1 letter and 1 number'); - } - return value; -}; diff --git a/03_source/api_server.del/src/validations/index.ts b/03_source/api_server.del/src/validations/index.ts deleted file mode 100644 index 7158dd3..0000000 --- a/03_source/api_server.del/src/validations/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as authValidation } from './auth.validation'; -export { default as userValidation } from './user.validation'; diff --git a/03_source/api_server.del/src/validations/user.validation.ts b/03_source/api_server.del/src/validations/user.validation.ts deleted file mode 100644 index e719d80..0000000 --- a/03_source/api_server.del/src/validations/user.validation.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Role } from '@prisma/client'; -import Joi from 'joi'; -import { password } from './custom.validation'; - -const createUser = { - body: Joi.object().keys({ - email: Joi.string().required().email(), - password: Joi.string().required().custom(password), - name: Joi.string().required(), - role: Joi.string().required().valid(Role.USER, Role.ADMIN) - }) -}; - -const getUsers = { - query: Joi.object().keys({ - name: Joi.string(), - role: Joi.string(), - sortBy: Joi.string(), - limit: Joi.number().integer(), - page: Joi.number().integer() - }) -}; - -const getUser = { - params: Joi.object().keys({ - userId: Joi.number().integer() - }) -}; - -const updateUser = { - params: Joi.object().keys({ - userId: Joi.number().integer() - }), - body: Joi.object() - .keys({ - email: Joi.string().email(), - password: Joi.string().custom(password), - name: Joi.string() - }) - .min(1) -}; - -const deleteUser = { - params: Joi.object().keys({ - userId: Joi.number().integer() - }) -}; - -export default { - createUser, - getUsers, - getUser, - updateUser, - deleteUser -}; diff --git a/03_source/api_server.del/tests/fixtures/user.fixture.ts b/03_source/api_server.del/tests/fixtures/user.fixture.ts deleted file mode 100644 index d5d89bd..0000000 --- a/03_source/api_server.del/tests/fixtures/user.fixture.ts +++ /dev/null @@ -1,37 +0,0 @@ -import bcrypt from 'bcryptjs'; -import { faker } from '@faker-js/faker'; -import prisma from '../../src/client'; -import { Prisma, Role } from '@prisma/client'; - -const password = 'password1'; -const salt = bcrypt.genSaltSync(8); - -export const userOne = { - name: faker.name.fullName(), - email: faker.internet.email().toLowerCase(), - password, - role: Role.USER, - isEmailVerified: false -}; - -export const userTwo = { - name: faker.name.fullName(), - email: faker.internet.email().toLowerCase(), - password, - role: Role.USER, - isEmailVerified: false -}; - -export const admin = { - name: faker.name.fullName(), - email: faker.internet.email().toLowerCase(), - password, - role: Role.ADMIN, - isEmailVerified: false -}; - -export const insertUsers = async (users: Prisma.UserCreateManyInput[]) => { - await prisma.user.createMany({ - data: users.map((user) => ({ ...user, password: bcrypt.hashSync(user.password, salt) })) - }); -}; diff --git a/03_source/api_server.del/tests/integration/auth.test.ts b/03_source/api_server.del/tests/integration/auth.test.ts deleted file mode 100644 index 46cf935..0000000 --- a/03_source/api_server.del/tests/integration/auth.test.ts +++ /dev/null @@ -1,843 +0,0 @@ -import request from 'supertest'; -import { faker } from '@faker-js/faker'; -import httpStatus from 'http-status'; -import httpMocks from 'node-mocks-http'; -import moment from 'moment'; -import bcrypt from 'bcryptjs'; -import app from '../../src/app'; -import config from '../../src/config/config'; -import auth from '../../src/middlewares/auth'; -import { emailService, tokenService } from '../../src/services'; -import ApiError from '../../src/utils/ApiError'; -import setupTestDB from '../utils/setupTestDb'; -import { describe, beforeEach, test, expect, jest } from '@jest/globals'; -import { userOne, admin, insertUsers } from '../fixtures/user.fixture'; -import { Role, TokenType, User } from '@prisma/client'; -import prisma from '../../src/client'; -import { roleRights } from '../../src/config/roles'; - -setupTestDB(); - -describe('Auth routes', () => { - describe('POST /v1/auth/register', () => { - let newUser: { email: string; password: string }; - beforeEach(() => { - newUser = { - email: faker.internet.email().toLowerCase(), - password: 'password1' - }; - }); - - test('should return 201 and successfully register user if request data is ok', async () => { - const res = await request(app) - .post('/v1/auth/register') - .send(newUser) - .expect(httpStatus.CREATED); - - expect(res.body.user).not.toHaveProperty('password'); - expect(res.body.user).toEqual({ - id: expect.anything(), - name: null, - email: newUser.email, - role: Role.USER, - isEmailVerified: false - }); - - const dbUser = await prisma.user.findUnique({ where: { id: res.body.user.id } }); - expect(dbUser).toBeDefined(); - expect(dbUser?.password).not.toBe(newUser.password); - expect(dbUser).toMatchObject({ - name: null, - email: newUser.email, - role: Role.USER, - isEmailVerified: false - }); - - expect(res.body.tokens).toEqual({ - access: { token: expect.anything(), expires: expect.anything() }, - refresh: { token: expect.anything(), expires: expect.anything() } - }); - }); - - test('should return 400 error if email is invalid', async () => { - newUser.email = 'invalidEmail'; - - await request(app).post('/v1/auth/register').send(newUser).expect(httpStatus.BAD_REQUEST); - }); - - test('should return 400 error if email is already used', async () => { - await insertUsers([userOne]); - newUser.email = userOne.email; - - await request(app).post('/v1/auth/register').send(newUser).expect(httpStatus.BAD_REQUEST); - }); - - test('should return 400 error if password length is less than 8 characters', async () => { - newUser.password = 'passwo1'; - - await request(app).post('/v1/auth/register').send(newUser).expect(httpStatus.BAD_REQUEST); - }); - - test('should return 400 error if password does not contain both letters and numbers', async () => { - newUser.password = 'password'; - - await request(app).post('/v1/auth/register').send(newUser).expect(httpStatus.BAD_REQUEST); - - newUser.password = '11111111'; - - await request(app).post('/v1/auth/register').send(newUser).expect(httpStatus.BAD_REQUEST); - }); - }); - - describe('POST /v1/auth/login', () => { - test('should return 200 and login user if email and password match', async () => { - await insertUsers([userOne]); - const loginCredentials = { - email: userOne.email, - password: userOne.password - }; - - const res = await request(app) - .post('/v1/auth/login') - .send(loginCredentials) - .expect(httpStatus.OK); - - expect(res.body.user).toMatchObject({ - id: expect.anything(), - name: userOne.name, - email: userOne.email, - role: userOne.role, - isEmailVerified: userOne.isEmailVerified - }); - - expect(res.body.user).toEqual(expect.not.objectContaining({ password: expect.anything() })); - - expect(res.body.tokens).toEqual({ - access: { token: expect.anything(), expires: expect.anything() }, - refresh: { token: expect.anything(), expires: expect.anything() } - }); - }); - - test('should return 401 error if there are no users with that email', async () => { - const loginCredentials = { - email: userOne.email, - password: userOne.password - }; - - const res = await request(app) - .post('/v1/auth/login') - .send(loginCredentials) - .expect(httpStatus.UNAUTHORIZED); - - expect(res.body).toEqual({ - code: httpStatus.UNAUTHORIZED, - message: 'Incorrect email or password' - }); - }); - - test('should return 401 error if password is wrong', async () => { - await insertUsers([userOne]); - const loginCredentials = { - email: userOne.email, - password: 'wrongPassword1' - }; - - const res = await request(app) - .post('/v1/auth/login') - .send(loginCredentials) - .expect(httpStatus.UNAUTHORIZED); - - expect(res.body).toEqual({ - code: httpStatus.UNAUTHORIZED, - message: 'Incorrect email or password' - }); - }); - }); - - describe('POST /v1/auth/logout', () => { - test('should return 204 if refresh token is valid', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - await tokenService.saveToken(refreshToken, dbUserOne.id, expires, TokenType.REFRESH); - - await request(app) - .post('/v1/auth/logout') - .send({ refreshToken }) - .expect(httpStatus.NO_CONTENT); - - const dbRefreshTokenData = await prisma.token.findFirst({ where: { token: refreshToken } }); - expect(dbRefreshTokenData).toBe(null); - }); - - test('should return 400 error if refresh token is missing from request body', async () => { - await request(app).post('/v1/auth/logout').send().expect(httpStatus.BAD_REQUEST); - }); - - test('should return 404 error if refresh token is not found in the database', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - - await request(app) - .post('/v1/auth/logout') - .send({ refreshToken }) - .expect(httpStatus.NOT_FOUND); - }); - - test('should return 404 error if refresh token is blacklisted', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - await tokenService.saveToken(refreshToken, dbUserOne.id, expires, TokenType.REFRESH, true); - - await request(app) - .post('/v1/auth/logout') - .send({ refreshToken }) - .expect(httpStatus.NOT_FOUND); - }); - }); - - describe('POST /v1/auth/refresh-tokens', () => { - test('should return 200 and new auth tokens if refresh token is valid', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - await tokenService.saveToken(refreshToken, dbUserOne.id, expires, TokenType.REFRESH); - - const res = await request(app) - .post('/v1/auth/refresh-tokens') - .send({ refreshToken }) - .expect(httpStatus.OK); - - expect(res.body).toEqual({ - access: { token: expect.anything(), expires: expect.anything() }, - refresh: { token: expect.anything(), expires: expect.anything() } - }); - - const dbRefreshTokenData = await prisma.token.findFirst({ - where: { token: res.body.refresh.token }, - select: { - type: true, - userId: true, - blacklisted: true - } - }); - expect(dbRefreshTokenData).toMatchObject({ - type: TokenType.REFRESH, - userId: dbUserOne.id, - blacklisted: false - }); - - const dbRefreshTokenCount = await prisma.token.count(); - expect(dbRefreshTokenCount).toBe(1); - }); - - test('should return 400 error if refresh token is missing from request body', async () => { - await request(app).post('/v1/auth/refresh-tokens').send().expect(httpStatus.BAD_REQUEST); - }); - - test('should return 401 error if refresh token is signed using an invalid secret', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.REFRESH, - 'invalidSecret' - ); - await tokenService.saveToken(refreshToken, dbUserOne.id, expires, TokenType.REFRESH); - - await request(app) - .post('/v1/auth/refresh-tokens') - .send({ refreshToken }) - .expect(httpStatus.UNAUTHORIZED); - }); - - test('should return 401 error if refresh token is not found in the database', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - - await request(app) - .post('/v1/auth/refresh-tokens') - .send({ refreshToken }) - .expect(httpStatus.UNAUTHORIZED); - }); - - test('should return 401 error if refresh token is blacklisted', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - await tokenService.saveToken(refreshToken, dbUserOne.id, expires, TokenType.REFRESH, true); - - await request(app) - .post('/v1/auth/refresh-tokens') - .send({ refreshToken }) - .expect(httpStatus.UNAUTHORIZED); - }); - - test('should return 401 error if refresh token is expired', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().subtract(1, 'minutes'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - await tokenService.saveToken(refreshToken, dbUserOne.id, expires, TokenType.REFRESH); - - await request(app) - .post('/v1/auth/refresh-tokens') - .send({ refreshToken }) - .expect(httpStatus.UNAUTHORIZED); - }); - - // test('should return 401 error if user is not found', async () => { - // const expires = moment().add(config.jwt.refreshExpirationDays, 'days'); - // const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - // await tokenService.saveToken(refreshToken, dbUserOne.id, expires, TokenType.REFRESH); - - // await request(app) - // .post('/v1/auth/refresh-tokens') - // .send({ refreshToken }) - // .expect(httpStatus.UNAUTHORIZED); - // }); - }); - - describe('POST /v1/auth/forgot-password', () => { - beforeEach(() => { - jest.spyOn(emailService.transport, 'sendMail').mockClear(); - }); - - test('should return 204 and send reset password email to the user', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const sendResetPasswordEmailSpy = jest - .spyOn(emailService, 'sendResetPasswordEmail') - .mockImplementationOnce(() => new Promise((resolve) => resolve())); - - await request(app) - .post('/v1/auth/forgot-password') - .send({ email: userOne.email }) - .expect(httpStatus.NO_CONTENT); - - expect(sendResetPasswordEmailSpy).toHaveBeenCalledWith(userOne.email, expect.any(String)); - const resetPasswordToken = sendResetPasswordEmailSpy.mock.calls[0][1]; - const dbResetPasswordTokenData = await prisma.token.findFirst({ - where: { - token: resetPasswordToken, - userId: dbUserOne.id - } - }); - expect(dbResetPasswordTokenData).toBeDefined(); - }); - - test('should return 400 if email is missing', async () => { - await insertUsers([userOne]); - - await request(app).post('/v1/auth/forgot-password').send().expect(httpStatus.BAD_REQUEST); - }); - - test('should return 404 if email does not belong to any user', async () => { - await request(app) - .post('/v1/auth/forgot-password') - .send({ email: userOne.email }) - .expect(httpStatus.NOT_FOUND); - }); - }); - - describe('POST /v1/auth/reset-password', () => { - test('should return 204 and reset the password', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.resetPasswordExpirationMinutes, 'minutes'); - const resetPasswordToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD - ); - await tokenService.saveToken( - resetPasswordToken, - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD - ); - - await request(app) - .post('/v1/auth/reset-password') - .query({ token: resetPasswordToken }) - .send({ password: 'password2' }) - .expect(httpStatus.NO_CONTENT); - - const dbUser = (await prisma.user.findUnique({ where: { id: dbUserOne.id } })) as User; - const isPasswordMatch = await bcrypt.compare('password2', dbUser.password); - expect(isPasswordMatch).toBe(true); - - const dbResetPasswordTokenCount = await prisma.token.count({ - where: { - userId: dbUserOne.id, - type: TokenType.RESET_PASSWORD - } - }); - expect(dbResetPasswordTokenCount).toBe(0); - }); - - test('should return 400 if reset password token is missing', async () => { - await insertUsers([userOne]); - - await request(app) - .post('/v1/auth/reset-password') - .send({ password: 'password2' }) - .expect(httpStatus.BAD_REQUEST); - }); - - test('should return 401 if reset password token is blacklisted', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.resetPasswordExpirationMinutes, 'minutes'); - const resetPasswordToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD - ); - await tokenService.saveToken( - resetPasswordToken, - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD, - true - ); - - await request(app) - .post('/v1/auth/reset-password') - .query({ token: resetPasswordToken }) - .send({ password: 'password2' }) - .expect(httpStatus.UNAUTHORIZED); - }); - - test('should return 401 if reset password token is expired', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().subtract(1, 'minutes'); - const resetPasswordToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD - ); - await tokenService.saveToken( - resetPasswordToken, - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD - ); - - await request(app) - .post('/v1/auth/reset-password') - .query({ token: resetPasswordToken }) - .send({ password: 'password2' }) - .expect(httpStatus.UNAUTHORIZED); - }); - - // test('should return 401 if user is not found', async () => { - // const expires = moment().add(config.jwt.resetPasswordExpirationMinutes, 'minutes'); - // const resetPasswordToken = tokenService.generateToken( - // dbUserOne.id, - // expires, - // TokenType.RESET_PASSWORD - // ); - // await tokenService.saveToken( - // resetPasswordToken, - // dbUserOne.id, - // expires, - // TokenType.RESET_PASSWORD - // ); - - // await request(app) - // .post('/v1/auth/reset-password') - // .query({ token: resetPasswordToken }) - // .send({ password: 'password2' }) - // .expect(httpStatus.UNAUTHORIZED); - // }); - - test('should return 400 if password is missing or invalid', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.resetPasswordExpirationMinutes, 'minutes'); - const resetPasswordToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD - ); - await tokenService.saveToken( - resetPasswordToken, - dbUserOne.id, - expires, - TokenType.RESET_PASSWORD - ); - - await request(app) - .post('/v1/auth/reset-password') - .query({ token: resetPasswordToken }) - .expect(httpStatus.BAD_REQUEST); - - await request(app) - .post('/v1/auth/reset-password') - .query({ token: resetPasswordToken }) - .send({ password: 'short1' }) - .expect(httpStatus.BAD_REQUEST); - - await request(app) - .post('/v1/auth/reset-password') - .query({ token: resetPasswordToken }) - .send({ password: 'password' }) - .expect(httpStatus.BAD_REQUEST); - - await request(app) - .post('/v1/auth/reset-password') - .query({ token: resetPasswordToken }) - .send({ password: '11111111' }) - .expect(httpStatus.BAD_REQUEST); - }); - }); - - describe('POST /v1/auth/send-verification-email', () => { - beforeEach(() => { - jest.spyOn(emailService.transport, 'sendMail').mockClear(); - }); - - test('should return 204 and send verification email to the user', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const sendVerificationEmailSpy = jest - .spyOn(emailService, 'sendVerificationEmail') - .mockImplementationOnce(() => new Promise((resolve) => resolve())); - const userOneAccessToken = tokenService.generateToken( - dbUserOne.id, - moment().add(config.jwt.accessExpirationMinutes, 'minutes'), - TokenType.ACCESS - ); - - await request(app) - .post('/v1/auth/send-verification-email') - .set('Authorization', `Bearer ${userOneAccessToken}`) - .expect(httpStatus.NO_CONTENT); - - expect(sendVerificationEmailSpy).toHaveBeenCalledWith(userOne.email, expect.any(String)); - const verifyEmailToken = sendVerificationEmailSpy.mock.calls[0][1]; - const dbVerifyEmailToken = await prisma.token.findFirst({ - where: { - token: verifyEmailToken, - userId: dbUserOne.id - } - }); - - expect(dbVerifyEmailToken).toBeDefined(); - }); - - test('should return 401 error if access token is missing', async () => { - await insertUsers([userOne]); - - await request(app) - .post('/v1/auth/send-verification-email') - .send() - .expect(httpStatus.UNAUTHORIZED); - }); - }); - - describe('POST /v1/auth/verify-email', () => { - test('should return 204 and verify the email', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.verifyEmailExpirationMinutes, 'minutes'); - const verifyEmailToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.VERIFY_EMAIL - ); - await tokenService.saveToken(verifyEmailToken, dbUserOne.id, expires, TokenType.VERIFY_EMAIL); - - await request(app) - .post('/v1/auth/verify-email') - .query({ token: verifyEmailToken }) - .send() - .expect(httpStatus.NO_CONTENT); - - const dbUser = (await prisma.user.findUnique({ where: { id: dbUserOne.id } })) as User; - - expect(dbUser.isEmailVerified).toBe(true); - - const dbVerifyEmailToken = await prisma.token.count({ - where: { - userId: dbUserOne.id, - type: TokenType.VERIFY_EMAIL - } - }); - expect(dbVerifyEmailToken).toBe(0); - }); - - test('should return 400 if verify email token is missing', async () => { - await insertUsers([userOne]); - - await request(app).post('/v1/auth/verify-email').send().expect(httpStatus.BAD_REQUEST); - }); - - test('should return 401 if verify email token is blacklisted', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.verifyEmailExpirationMinutes, 'minutes'); - const verifyEmailToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.VERIFY_EMAIL - ); - await tokenService.saveToken( - verifyEmailToken, - dbUserOne.id, - expires, - TokenType.VERIFY_EMAIL, - true - ); - - await request(app) - .post('/v1/auth/verify-email') - .query({ token: verifyEmailToken }) - .send() - .expect(httpStatus.UNAUTHORIZED); - }); - - test('should return 401 if verify email token is expired', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().subtract(1, 'minutes'); - const verifyEmailToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.VERIFY_EMAIL - ); - await tokenService.saveToken(verifyEmailToken, dbUserOne.id, expires, TokenType.VERIFY_EMAIL); - - await request(app) - .post('/v1/auth/verify-email') - .query({ token: verifyEmailToken }) - .send() - .expect(httpStatus.UNAUTHORIZED); - }); - - // test('should return 401 if user is not found', async () => { - // const expires = moment().add(config.jwt.verifyEmailExpirationMinutes, 'minutes'); - // const verifyEmailToken = tokenService.generateToken( - // dbUserOne.id, - // expires, - // TokenType.VERIFY_EMAIL - // ); - // await tokenService.saveToken(verifyEmailToken, dbUserOne.id, expires, TokenType.VERIFY_EMAIL); - - // await request(app) - // .post('/v1/auth/verify-email') - // .query({ token: verifyEmailToken }) - // .send() - // .expect(httpStatus.UNAUTHORIZED); - // }); - }); -}); - -describe('Auth middleware', () => { - test('should call next with no errors if access token is valid', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const userOneAccessToken = tokenService.generateToken( - dbUserOne.id, - moment().add(config.jwt.accessExpirationMinutes, 'minutes'), - TokenType.ACCESS - ); - const req = httpMocks.createRequest({ - headers: { Authorization: `Bearer ${userOneAccessToken}` } - }); - const next = jest.fn(); - - await auth()(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(); - expect((req.user as User).id).toEqual(dbUserOne.id); - }); - - test('should call next with unauthorized error if access token is not found in header', async () => { - await insertUsers([userOne]); - const req = httpMocks.createRequest(); - const next = jest.fn(); - - await auth()(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(expect.any(ApiError)); - expect(next).toHaveBeenCalledWith( - expect.objectContaining({ - statusCode: httpStatus.UNAUTHORIZED, - message: 'Please authenticate' - }) - ); - }); - - test('should call next with unauthorized error if access token is not a valid jwt token', async () => { - await insertUsers([userOne]); - const req = httpMocks.createRequest({ headers: { Authorization: 'Bearer randomToken' } }); - const next = jest.fn(); - - await auth()(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(expect.any(ApiError)); - expect(next).toHaveBeenCalledWith( - expect.objectContaining({ - statusCode: httpStatus.UNAUTHORIZED, - message: 'Please authenticate' - }) - ); - }); - - test('should call next with unauthorized error if the token is not an access token', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.accessExpirationMinutes, 'minutes'); - const refreshToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.REFRESH); - const req = httpMocks.createRequest({ headers: { Authorization: `Bearer ${refreshToken}` } }); - const next = jest.fn(); - - await auth()(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(expect.any(ApiError)); - expect(next).toHaveBeenCalledWith( - expect.objectContaining({ - statusCode: httpStatus.UNAUTHORIZED, - message: 'Please authenticate' - }) - ); - }); - - test('should call next with unauthorized error if access token is generated with an invalid secret', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().add(config.jwt.accessExpirationMinutes, 'minutes'); - const accessToken = tokenService.generateToken( - dbUserOne.id, - expires, - TokenType.ACCESS, - 'invalidSecret' - ); - const req = httpMocks.createRequest({ headers: { Authorization: `Bearer ${accessToken}` } }); - const next = jest.fn(); - - await auth()(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(expect.any(ApiError)); - expect(next).toHaveBeenCalledWith( - expect.objectContaining({ - statusCode: httpStatus.UNAUTHORIZED, - message: 'Please authenticate' - }) - ); - }); - - test('should call next with unauthorized error if access token is expired', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const expires = moment().subtract(1, 'minutes'); - const accessToken = tokenService.generateToken(dbUserOne.id, expires, TokenType.ACCESS); - const req = httpMocks.createRequest({ headers: { Authorization: `Bearer ${accessToken}` } }); - const next = jest.fn(); - - await auth()(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(expect.any(ApiError)); - expect(next).toHaveBeenCalledWith( - expect.objectContaining({ - statusCode: httpStatus.UNAUTHORIZED, - message: 'Please authenticate' - }) - ); - }); - - test('should call next with unauthorized error if user is not found', async () => { - const userOneAccessToken = tokenService.generateToken( - 2000, - moment().add(config.jwt.accessExpirationMinutes, 'minutes'), - TokenType.ACCESS - ); - const req = httpMocks.createRequest({ - headers: { Authorization: `Bearer ${userOneAccessToken}` } - }); - const next = jest.fn(); - - await auth()(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(expect.any(ApiError)); - expect(next).toHaveBeenCalledWith( - expect.objectContaining({ - statusCode: httpStatus.UNAUTHORIZED, - message: 'Please authenticate' - }) - ); - }); - - test('should call next with forbidden error if user does not have required rights and userId is not in params', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const userOneAccessToken = tokenService.generateToken( - dbUserOne.id, - moment().add(config.jwt.accessExpirationMinutes, 'minutes'), - TokenType.ACCESS - ); - const req = httpMocks.createRequest({ - headers: { Authorization: `Bearer ${userOneAccessToken}` } - }); - const next = jest.fn(); - - await auth('anyRight')(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(expect.any(ApiError)); - expect(next).toHaveBeenCalledWith( - expect.objectContaining({ statusCode: httpStatus.FORBIDDEN, message: 'Forbidden' }) - ); - }); - - test('should call next with no errors if user does not have required rights but userId is in params', async () => { - await insertUsers([userOne]); - const dbUserOne = (await prisma.user.findUnique({ where: { email: userOne.email } })) as User; - const userOneAccessToken = tokenService.generateToken( - dbUserOne.id, - moment().add(config.jwt.accessExpirationMinutes, 'minutes'), - TokenType.ACCESS - ); - const req = httpMocks.createRequest({ - headers: { Authorization: `Bearer ${userOneAccessToken}` }, - params: { userId: dbUserOne.id } - }); - const next = jest.fn(); - - await auth('anyRight')(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(); - }); - - test('should call next with no errors if user has required rights', async () => { - await insertUsers([admin]); - const dbAdmin = (await prisma.user.findUnique({ where: { email: admin.email } })) as User; - const adminAccessToken = tokenService.generateToken( - dbAdmin.id, - moment().add(config.jwt.accessExpirationMinutes, 'minutes'), - TokenType.ACCESS - ); - const req = httpMocks.createRequest({ - headers: { Authorization: `Bearer ${adminAccessToken}` }, - params: { userId: dbAdmin.id } - }); - const next = jest.fn(); - - await auth(...(roleRights.get(Role.ADMIN) as string[]))(req, httpMocks.createResponse(), next); - - expect(next).toHaveBeenCalledWith(); - }); -}); diff --git a/03_source/api_server.del/tests/utils/setupTestDb.ts b/03_source/api_server.del/tests/utils/setupTestDb.ts deleted file mode 100644 index 42f10f1..0000000 --- a/03_source/api_server.del/tests/utils/setupTestDb.ts +++ /dev/null @@ -1,21 +0,0 @@ -import prisma from '../../src/client'; -import { beforeAll, beforeEach, afterAll } from '@jest/globals'; - -const setupTestDB = () => { - beforeAll(async () => { - await prisma.$connect(); - }); - - beforeEach(async () => { - await prisma.token.deleteMany(); - await prisma.user.deleteMany(); - }); - - afterAll(async () => { - await prisma.token.deleteMany(); - await prisma.user.deleteMany(); - await prisma.$disconnect(); - }); -}; - -export default setupTestDB; diff --git a/03_source/api_server.del/tsconfig.json b/03_source/api_server.del/tsconfig.json deleted file mode 100644 index 80852f4..0000000 --- a/03_source/api_server.del/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "es2016", - "outDir": "./build", - "module": "commonjs", - "types": ["node"], - "resolveJsonModule": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "strictNullChecks": true - } -} \ No newline at end of file diff --git a/03_source/api_server.del/yarn.lock b/03_source/api_server.del/yarn.lock deleted file mode 100644 index 1629b46..0000000 --- a/03_source/api_server.del/yarn.lock +++ /dev/null @@ -1,5323 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@apidevtools/json-schema-ref-parser@^9.0.6": - version "9.1.0" - resolved "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.0.tgz" - integrity sha512-teB30tFooE3iQs2HQIKJ02D8UZA1Xy1zaczzhUjJs0CymYxeC0g+y5rCY2p8NHBM6DBUVoR8rSM4kHLj1WE9mQ== - dependencies: - "@jsdevtools/ono" "^7.1.3" - "@types/json-schema" "^7.0.6" - call-me-maybe "^1.0.1" - js-yaml "^4.1.0" - -"@apidevtools/openapi-schemas@^2.0.4": - version "2.1.0" - resolved "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz" - integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== - -"@apidevtools/swagger-methods@^3.0.2": - version "3.0.2" - resolved "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz" - integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== - -"@apidevtools/swagger-parser@10.0.2": - version "10.0.2" - resolved "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz" - integrity sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg== - dependencies: - "@apidevtools/json-schema-ref-parser" "^9.0.6" - "@apidevtools/openapi-schemas" "^2.0.4" - "@apidevtools/swagger-methods" "^3.0.2" - "@jsdevtools/ono" "^7.1.3" - call-me-maybe "^1.0.1" - z-schema "^4.2.3" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.20.5": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" - integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f" - integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.7" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.20.7", "@babel/generator@^7.7.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" - integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.20.7": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" - integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": - version "7.20.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.10.tgz#2bf98239597fcec12f842756f186a9dde6d09230" - integrity sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@eslint/eslintrc@^1.3.3": - version "1.3.3" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz" - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@faker-js/faker@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-7.6.0.tgz#9ea331766084288634a9247fcd8b84f16ff4ba07" - integrity sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.11.6": - version "0.11.7" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz" - integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== - dependencies: - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - slash "^3.0.0" - -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== - dependencies: - "@jest/console" "^29.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" - micromatch "^4.0.4" - pretty-format "^29.3.1" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== - dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - jest-mock "^29.3.1" - -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== - dependencies: - jest-get-type "^29.2.0" - -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== - dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" - -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== - dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" - -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" - -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== - dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== - dependencies: - "@jest/test-result" "^29.3.1" - graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - slash "^3.0.0" - -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.1" - -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== - dependencies: - "@jest/schemas" "^29.0.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jsdevtools/ono@^7.1.3": - version "7.1.3" - resolved "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz" - integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@opencensus/core@0.0.9": - version "0.0.9" - resolved "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz" - integrity sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q== - dependencies: - continuation-local-storage "^3.2.1" - log-driver "^1.2.7" - semver "^5.5.0" - shimmer "^1.2.0" - uuid "^3.2.1" - -"@opencensus/core@^0.0.8": - version "0.0.8" - resolved "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz" - integrity sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ== - dependencies: - continuation-local-storage "^3.2.1" - log-driver "^1.2.7" - semver "^5.5.0" - shimmer "^1.2.0" - uuid "^3.2.1" - -"@opencensus/propagation-b3@0.0.8": - version "0.0.8" - resolved "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz" - integrity sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A== - dependencies: - "@opencensus/core" "^0.0.8" - uuid "^3.2.1" - -"@pm2/agent@~2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.1.tgz" - integrity sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw== - dependencies: - async "~3.2.0" - chalk "~3.0.0" - dayjs "~1.8.24" - debug "~4.3.1" - eventemitter2 "~5.0.1" - fast-json-patch "^3.0.0-1" - fclone "~1.0.11" - nssocket "0.6.0" - pm2-axon "~4.0.1" - pm2-axon-rpc "~0.7.0" - proxy-agent "~5.0.0" - semver "~7.2.0" - ws "~7.4.0" - -"@pm2/io@~5.0.0": - version "5.0.0" - resolved "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz" - integrity sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw== - dependencies: - "@opencensus/core" "0.0.9" - "@opencensus/propagation-b3" "0.0.8" - async "~2.6.1" - debug "~4.3.1" - eventemitter2 "^6.3.1" - require-in-the-middle "^5.0.0" - semver "6.3.0" - shimmer "^1.2.0" - signal-exit "^3.0.3" - tslib "1.9.3" - -"@pm2/js-api@~0.6.7": - version "0.6.7" - resolved "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz" - integrity sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw== - dependencies: - async "^2.6.3" - axios "^0.21.0" - debug "~4.3.1" - eventemitter2 "^6.3.1" - ws "^7.0.0" - -"@pm2/pm2-version-check@latest": - version "1.0.4" - resolved "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz" - integrity sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA== - dependencies: - debug "^4.3.1" - -"@prisma/client@^4.7.1": - version "4.7.1" - resolved "https://registry.npmjs.org/@prisma/client/-/client-4.7.1.tgz" - integrity sha512-/GbnOwIPtjiveZNUzGXOdp7RxTEkHL4DZP3vBaFNadfr6Sf0RshU5EULFzVaSi9i9PIK9PYd+1Rn7z2B2npb9w== - dependencies: - "@prisma/engines-version" "4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c" - -"@prisma/engines-version@4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c": - version "4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c" - resolved "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.7.1-1.272861e07ab64f234d3ffc4094e32bd61775599c.tgz" - integrity sha512-Bd4LZ+WAnUHOq31e9X/ihi5zPlr4SzTRwUZZYxvWOxlerIZ7HJlVa9zXpuKTKLpI9O1l8Ec4OYCKsivWCs5a3Q== - -"@prisma/engines@4.16.2": - version "4.16.2" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-4.16.2.tgz#5ec8dd672c2173d597e469194916ad4826ce2e5f" - integrity sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw== - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== - -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/babel__core@^7.1.14": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== - dependencies: - "@babel/types" "^7.3.0" - -"@types/bcryptjs@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.2.tgz#e3530eac9dd136bfdfb0e43df2c4c5ce1f77dfae" - integrity sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ== - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/compression@^1.7.2": - version "1.7.2" - resolved "https://registry.npmjs.org/@types/compression/-/compression-1.7.2.tgz" - integrity sha512-lwEL4M/uAGWngWFLSG87ZDr2kLrbuR8p7X+QZB1OQlT+qkHsCPDVFnHPyXf4Vyl4yDDorNY+mAhosxkCvppatg== - dependencies: - "@types/express" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/cookiejar@*": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8" - integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== - -"@types/cors@^2.8.13": - version "2.8.13" - resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz" - integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.18": - version "4.17.31" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@^4.17.14": - version "4.17.14" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz" - integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^29.2.5": - version "29.2.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.5.tgz#c27f41a9d6253f288d1910d3c5f09484a56b73c0" - integrity sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - -"@types/json-schema@^7.0.6", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/jsonwebtoken@*": - version "8.5.9" - resolved "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz" - integrity sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg== - dependencies: - "@types/node" "*" - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/morgan@^1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz" - integrity sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q== - dependencies: - "@types/node" "*" - -"@types/node@*", "@types/node@^18.11.13": - version "18.11.13" - resolved "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz" - integrity sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w== - -"@types/nodemailer@^6.4.7": - version "6.4.7" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.7.tgz#658f4bca47c1a895b1d7e054b3b54030a5e1f5e0" - integrity sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg== - dependencies: - "@types/node" "*" - -"@types/passport-jwt@^3.0.7": - version "3.0.7" - resolved "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.7.tgz" - integrity sha512-qRQ4qlww1Yhs3IaioDKrsDNmKy6gLDLgFsGwpCnc2YqWovO2Oxu9yCQdWHMJafQ7UIuOba4C4/TNXcGkQfEjlQ== - dependencies: - "@types/express" "*" - "@types/jsonwebtoken" "*" - "@types/passport-strategy" "*" - -"@types/passport-strategy@*": - version "0.2.35" - resolved "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz" - integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== - dependencies: - "@types/express" "*" - "@types/passport" "*" - -"@types/passport@*", "@types/passport@^1.0.11": - version "1.0.11" - resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.11.tgz" - integrity sha512-pz1cx9ptZvozyGKKKIPLcVDVHwae4hrH5d6g5J+DkMRRjR3cVETb4jMabhXAUbg3Ov7T22nFHEgaK2jj+5CBpw== - dependencies: - "@types/express" "*" - -"@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== - -"@types/serve-static@*": - version "1.15.0" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== - -"@types/superagent@*": - version "4.1.16" - resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.16.tgz#12c9c16f232f9d89beab91d69368f96ce8e2d881" - integrity sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ== - dependencies: - "@types/cookiejar" "*" - "@types/node" "*" - -"@types/supertest@^2.0.12": - version "2.0.12" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.12.tgz#ddb4a0568597c9aadff8dbec5b2e8fddbe8692fc" - integrity sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ== - dependencies: - "@types/superagent" "*" - -"@types/swagger-jsdoc@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.1.tgz" - integrity sha512-+MUpcbyxD528dECUBCEVm6abNuORdbuGjbrUdHDeAQ+rkPuo2a+L4N02WJHF3bonSSE6SJ3dUJwF2V6+cHnf0w== - -"@types/swagger-ui-express@^4.1.3": - version "4.1.3" - resolved "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz" - integrity sha512-jqCjGU/tGEaqIplPy3WyQg+Nrp6y80DCFnDEAvVKWkJyv0VivSSDCChkppHRHAablvInZe6pijDFMnavtN0vqA== - dependencies: - "@types/express" "*" - "@types/serve-static" "*" - -"@types/xss-filters@^0.0.27": - version "0.0.27" - resolved "https://registry.npmjs.org/@types/xss-filters/-/xss-filters-0.0.27.tgz" - integrity sha512-ctN3f7vl4tBXa+W11hm0oDwp67K6SYK07h4OmNgaEoIOVJ/rksnc2prpbjK+Ju3/fYIa3HQaH4x9Y525CXFOow== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.18" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.18.tgz#466225ab4fbabb9aa711f5b406796daf1374a5b7" - integrity sha512-eIJR1UER6ur3EpKM3d+2Pgd+ET+k6Kn9B4ZItX0oPjjVI5PrfaRjKyLT5UYendDpLuoiJMNJvovLQbEXqhsPaw== - dependencies: - "@types/yargs-parser" "*" - -"@typescript-eslint/eslint-plugin@^5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz" - integrity sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA== - dependencies: - "@typescript-eslint/scope-manager" "5.46.1" - "@typescript-eslint/type-utils" "5.46.1" - "@typescript-eslint/utils" "5.46.1" - debug "^4.3.4" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz" - integrity sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg== - dependencies: - "@typescript-eslint/scope-manager" "5.46.1" - "@typescript-eslint/types" "5.46.1" - "@typescript-eslint/typescript-estree" "5.46.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz" - integrity sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA== - dependencies: - "@typescript-eslint/types" "5.46.1" - "@typescript-eslint/visitor-keys" "5.46.1" - -"@typescript-eslint/type-utils@5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz" - integrity sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng== - dependencies: - "@typescript-eslint/typescript-estree" "5.46.1" - "@typescript-eslint/utils" "5.46.1" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz" - integrity sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w== - -"@typescript-eslint/typescript-estree@5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz" - integrity sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg== - dependencies: - "@typescript-eslint/types" "5.46.1" - "@typescript-eslint/visitor-keys" "5.46.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz" - integrity sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA== - dependencies: - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.46.1" - "@typescript-eslint/types" "5.46.1" - "@typescript-eslint/typescript-estree" "5.46.1" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.46.1": - version "5.46.1" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz" - integrity sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg== - dependencies: - "@typescript-eslint/types" "5.46.1" - eslint-visitor-keys "^3.3.0" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1, acorn-walk@^8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1, acorn@^8.7.0, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -amp-message@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz" - integrity sha512-JqutcFwoU1+jhv7ArgW38bqrE+LQdcRv4NxNw0mp0JHQyB6tXesWRjtYKlDgHRY2o3JE5UTaBGUK8kSWUdxWUg== - dependencies: - amp "0.3.1" - -amp@0.3.1, amp@~0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz" - integrity sha512-OwIuC4yZaRogHKiuU5WlMR5Xk/jAcpPtawWL05Gj8Lvm2F6mwoJt4O/bHI+DHwG79vWd+8OFYM4/BzYqyRd3qw== - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -ast-types@^0.13.2: - version "0.13.4" - resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" - integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== - dependencies: - tslib "^2.0.1" - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-listener@^0.6.0: - version "0.6.10" - resolved "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz" - integrity sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw== - dependencies: - semver "^5.3.0" - shimmer "^1.1.0" - -async@^2.6.3, async@~2.6.1: - version "2.6.4" - resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -async@^3.2.0, async@^3.2.3, async@~3.2.0: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -axios@^0.21.0: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== - dependencies: - "@jest/transform" "^29.3.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== - dependencies: - babel-plugin-jest-hoist "^29.2.0" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - -bcryptjs@^2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" - integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -blessed@0.1.81: - version "0.1.81" - resolved "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz" - integrity sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ== - -bodec@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz" - integrity sha512-Ylo+MAo5BDUq1KA3f3R/MFhh+g8cnHmo8bz3YPGhI1znrMaf77ol1sfvYJzsw3nTE+Y2GryfDxBaR+AqpAkEHQ== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.3: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== - dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-equal-constant-time@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -call-me-maybe@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz" - integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001400: - version "1.0.30001441" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" - integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== - -chalk@3.0.0, chalk@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -charm@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz" - integrity sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ== - -chokidar@^3.5.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" - integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== - -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-tableau@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz" - integrity sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ== - dependencies: - chalk "3.0.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.9.1" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.1.3: - version "3.2.1" - resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colorette@^2.0.19: - version "2.0.19" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@2.15.1: - version "2.15.1" - resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - -commander@6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz" - integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== - -commander@^2.7.1: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^9.4.1: - version "9.4.1" - resolved "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz" - integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== - -component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -content-disposition@0.5.4, content-disposition@^0.5.3: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -continuation-local-storage@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz" - integrity sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA== - dependencies: - async-listener "^0.6.0" - emitter-listener "^1.1.1" - -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookiejar@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -croner@~4.1.92: - version "4.1.97" - resolved "https://registry.npmjs.org/croner/-/croner-4.1.97.tgz" - integrity sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ== - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -culvert@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz" - integrity sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg== - -data-uri-to-buffer@3: - version "3.0.1" - resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - -date-fns@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" - integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== - -dayjs@~1.11.5: - version "1.11.7" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== - -dayjs@~1.8.24: - version "1.8.36" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz" - integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -degenerator@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz" - integrity sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ== - dependencies: - ast-types "^0.13.2" - escodegen "^1.8.1" - esprima "^4.0.0" - vm2 "^3.9.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -dezalgo@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" - -diff-sequences@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@3.0.0, doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dotenv@^16.0.3: - version "16.0.3" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" - integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ecdsa-sig-formatter@1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== - -emitter-listener@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz" - integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ== - dependencies: - shimmer "^1.2.0" - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -enquirer@2.3.6: - version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^1.8.1: - version "1.14.3" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" - integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== - dependencies: - esprima "^4.0.1" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.29.0: - version "8.29.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz" - integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg== - dependencies: - "@eslint/eslintrc" "^1.3.3" - "@humanwhocodes/config-array" "^0.11.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.15.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-sdsl "^4.1.4" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter2@5.0.1, eventemitter2@~5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz" - integrity sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg== - -eventemitter2@^6.3.1: - version "6.4.9" - resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz" - integrity sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg== - -eventemitter2@~0.4.14: - version "0.4.14" - resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" - integrity sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^3.0.1" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.0.0, expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== - dependencies: - "@jest/expect-utils" "^29.3.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - -express-rate-limit@^6.7.0: - version "6.7.0" - resolved "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz" - integrity sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA== - -express@^4.18.2: - version "4.18.2" - resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-patch@^3.0.0-1: - version "3.1.1" - resolved "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz" - integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-safe-stringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fastq@^1.6.0: - version "1.14.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz" - integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fclone@1.0.11, fclone@~1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz" - integrity sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw== - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-uri-to-path@2: - version "2.0.0" - resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz" - integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.14.0: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formidable@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.1.tgz#81269cbea1a613240049f5f61a9d97731517414f" - integrity sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ== - dependencies: - dezalgo "^1.0.4" - hexoid "^1.0.0" - once "^1.4.0" - qs "^6.11.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2, fresh@^0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -ftp@^0.3.10: - version "0.3.10" - resolved "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz" - integrity sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ== - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.3" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-uri@3: - version "3.0.2" - resolved "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz" - integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== - dependencies: - "@tootallnate/once" "1" - data-uri-to-buffer "3" - debug "4" - file-uri-to-path "2" - fs-extra "^8.1.0" - ftp "^0.3.10" - -git-node-fs@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz" - integrity sha512-bLQypt14llVXBg0S0u8q8HmU7g9p3ysH+NvVlae5vILuUvs759665HvmR5+wb04KjHyjFcDRxdYb4kyNnluMUQ== - -git-sha1@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz" - integrity sha512-2e/nZezdVlyCopOCYHeW0onkbZg7xP1Ad6pndPy1rCygeRykefUS6r7oA5cJRGEFvseiaz5a/qUHFVX1dd6Isg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.5, glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.15.0: - version "13.19.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== - dependencies: - type-fest "^0.20.2" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -helmet@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/helmet/-/helmet-6.0.1.tgz" - integrity sha512-8wo+VdQhTMVBMCITYZaGTbE4lvlthelPYSvoyNvk4RECTmrVjMerp9RfUOQXZWLvCcAn1pKj7ZRxK4lI9Alrcw== - -hexoid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" - integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-status@^1.5.3: - version "1.5.3" - resolved "https://registry.npmjs.org/http-status/-/http-status-1.5.3.tgz" - integrity sha512-jCClqdnnwigYslmtfb28vPplOgoiZ0siP2Z8C5Ua+3UKbx410v+c+jT+jh1bbI4TvcEySuX0vd/CfFZFbDkJeQ== - -https-proxy-agent@5, https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== - -husky@^8.0.2: - version "8.0.2" - resolved "https://registry.npmjs.org/husky/-/husky-8.0.2.tgz" - integrity sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg== - -iconv-lite@0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== - -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - p-limit "^3.1.0" - pretty-format "^29.3.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== - dependencies: - "@jest/core" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.3.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" - -jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== - dependencies: - "@jest/types" "^29.3.1" - chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" - -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" - -jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== - -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== - dependencies: - "@jest/types" "^29.3.1" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== - dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.3.1" - -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== - dependencies: - chalk "^4.0.0" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" - -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.3.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== - dependencies: - "@jest/types" "^29.3.1" - "@types/node" "*" - jest-util "^29.3.1" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== - -jest-resolve-dependencies@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== - dependencies: - jest-regex-util "^29.2.0" - jest-snapshot "^29.3.1" - -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== - dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.3.1" - graceful-fs "^4.2.9" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - natural-compare "^1.4.0" - pretty-format "^29.3.1" - semver "^7.3.5" - -jest-util@^29.0.0, jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== - dependencies: - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== - dependencies: - "@jest/types" "^29.3.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.2.0" - leven "^3.1.0" - pretty-format "^29.3.1" - -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== - dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.3.1" - string-length "^4.0.1" - -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== - dependencies: - "@types/node" "*" - jest-util "^29.3.1" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" - integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== - dependencies: - "@jest/core" "^29.3.1" - "@jest/types" "^29.3.1" - import-local "^3.0.2" - jest-cli "^29.3.1" - -joi@^17.7.0: - version "17.7.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3" - integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" - "@sideway/pinpoint" "^2.0.0" - -js-git@^0.7.8: - version "0.7.8" - resolved "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz" - integrity sha512-+E5ZH/HeRnoc/LW0AmAyhU+mNcWBzAKE+30+IDMLSLbbK+Tdt02AdkOKq9u15rlJsDEGFqtgckc8ZM59LhhiUA== - dependencies: - bodec "^0.1.0" - culvert "^0.1.2" - git-sha1 "^0.1.2" - pako "^0.2.5" - -js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonwebtoken@^8.2.0: - version "8.5.1" - resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz" - integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^5.6.0" - -jwa@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" - integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== - dependencies: - buffer-equal-constant-time "1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -lazy@~1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz" - integrity sha512-Y+CjUfLmIpoUCCRl0ub4smrYtGGr5AOa2AKOaWelGHOGz33X/Y/KizefGqbkwfz44+cnq/+9habclf8vOmu2LA== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lilconfig@2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^13.1.0: - version "13.1.0" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.0.tgz" - integrity sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.19" - commander "^9.4.1" - debug "^4.3.4" - execa "^6.1.0" - lilconfig "2.0.6" - listr2 "^5.0.5" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-inspect "^1.12.2" - pidtree "^0.6.0" - string-argv "^0.3.1" - yaml "^2.1.3" - -listr2@^5.0.5: - version "5.0.6" - resolved "https://registry.npmjs.org/listr2/-/listr2-5.0.6.tgz" - integrity sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.19" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.7" - through "^2.3.8" - wrap-ansi "^7.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash@^4.17.14: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-driver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -logform@^2.3.2, logform@^2.4.0: - version "2.4.2" - resolved "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz" - integrity sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw== - dependencies: - "@colors/colors" "1.5.0" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.1, merge-descriptors@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@^1.1.2, methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0, mime@^1.3.4: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -mkdirp@1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -module-details-from-path@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz" - integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== - -moment@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -morgan@^1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" - integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@~0.0.4: - version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -needle@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -netmask@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" - integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-mocks-http@^1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/node-mocks-http/-/node-mocks-http-1.12.1.tgz#838e176019daf177caff6bb8534e3a32646e7531" - integrity sha512-jrA7Sn3qI6GsHgWtUW3gMj0vO6Yz0nJjzg3jRZYjcfj4tzi8oWPauDK1qHVJoAxTbwuDHF1JiM9GISZ/ocI/ig== - dependencies: - accepts "^1.3.7" - content-disposition "^0.5.3" - depd "^1.1.0" - fresh "^0.5.2" - merge-descriptors "^1.0.1" - methods "^1.1.2" - mime "^1.3.4" - parseurl "^1.3.3" - range-parser "^1.2.0" - type-is "^1.6.18" - -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== - -nodemailer@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.8.0.tgz#804bcc5256ee5523bc914506ee59f8de8f0b1cd5" - integrity sha512-EjYvSmHzekz6VNkNd12aUqAco+bOkRe3Of5jVhltqKhEsjw/y0PYPJfp83+s9Wzh1dspYAkUW/YNQ350NATbSQ== - -nodemon@^2.0.20: - version "2.0.20" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701" - integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw== - dependencies: - chokidar "^3.5.2" - debug "^3.2.7" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^5.7.1" - simple-update-notifier "^1.0.7" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -nssocket@0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz" - integrity sha512-a9GSOIql5IqgWJR3F/JXG4KpJTA3Z53Cj0MeMvGpglytB1nxE4PdFNC0jINe27CS7cGivoynwc054EzCcT3M3w== - dependencies: - eventemitter2 "~0.4.14" - lazy "~1.0.11" - -object-assign@^4: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pac-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz" - integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - get-uri "3" - http-proxy-agent "^4.0.1" - https-proxy-agent "5" - pac-resolver "^5.0.0" - raw-body "^2.2.0" - socks-proxy-agent "5" - -pac-resolver@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz" - integrity sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q== - dependencies: - degenerator "^3.0.2" - ip "^1.1.5" - netmask "^2.0.2" - -pako@^0.2.5: - version "0.2.9" - resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" - integrity sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parseurl@^1.3.3, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -passport-jwt@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.0.tgz" - integrity sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg== - dependencies: - jsonwebtoken "^8.2.0" - passport-strategy "^1.0.0" - -passport-strategy@1.x.x, passport-strategy@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz" - integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== - -passport@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz" - integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== - dependencies: - passport-strategy "1.x.x" - pause "0.0.1" - utils-merge "^1.0.1" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pause@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" - integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - -pidusage@^2.0.21: - version "2.0.21" - resolved "https://registry.npmjs.org/pidusage/-/pidusage-2.0.21.tgz" - integrity sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA== - dependencies: - safe-buffer "^5.2.1" - -pidusage@~3.0: - version "3.0.2" - resolved "https://registry.npmjs.org/pidusage/-/pidusage-3.0.2.tgz" - integrity sha512-g0VU+y08pKw5M8EZ2rIGiEBaB8wrQMjYGFfW2QVIfyT8V+fq8YFLkvlz4bz5ljvFDJYNFCWT3PWqcRr2FKO81w== - dependencies: - safe-buffer "^5.2.1" - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pm2-axon-rpc@~0.7.0, pm2-axon-rpc@~0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz" - integrity sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw== - dependencies: - debug "^4.3.1" - -pm2-axon@~4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz" - integrity sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg== - dependencies: - amp "~0.3.1" - amp-message "~0.1.1" - debug "^4.3.1" - escape-string-regexp "^4.0.0" - -pm2-deploy@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz" - integrity sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg== - dependencies: - run-series "^1.1.8" - tv4 "^1.3.0" - -pm2-multimeter@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz" - integrity sha512-S+wT6XfyKfd7SJIBqRgOctGxaBzUOmVQzTAS+cg04TsEUObJVreha7lvCfX8zzGVr871XwCSnHUU7DQQ5xEsfA== - dependencies: - charm "~0.1.1" - -pm2-sysmonit@^1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz" - integrity sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA== - dependencies: - async "^3.2.0" - debug "^4.3.1" - pidusage "^2.0.21" - systeminformation "^5.7" - tx2 "~1.0.4" - -pm2@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/pm2/-/pm2-5.2.2.tgz" - integrity sha512-mASxgh/MZhtVze/wijGf+tE6JKdA3lEq64FOfXVhhArkuk9Qxl4ePw9XgFJaArOXnU3bde+KbeAJHYxppVvYBQ== - dependencies: - "@pm2/agent" "~2.0.0" - "@pm2/io" "~5.0.0" - "@pm2/js-api" "~0.6.7" - "@pm2/pm2-version-check" latest - async "~3.2.0" - blessed "0.1.81" - chalk "3.0.0" - chokidar "^3.5.3" - cli-tableau "^2.0.0" - commander "2.15.1" - croner "~4.1.92" - dayjs "~1.11.5" - debug "^4.3.1" - enquirer "2.3.6" - eventemitter2 "5.0.1" - fclone "1.0.11" - mkdirp "1.0.4" - needle "2.4.0" - pidusage "~3.0" - pm2-axon "~4.0.1" - pm2-axon-rpc "~0.7.1" - pm2-deploy "~1.0.2" - pm2-multimeter "^0.1.2" - promptly "^2" - semver "^7.2" - source-map-support "0.5.21" - sprintf-js "1.1.2" - vizion "~2.2.1" - yamljs "0.3.0" - optionalDependencies: - pm2-sysmonit "^1.2.8" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.8.1: - version "2.8.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz" - integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== - -pretty-format@^29.0.0, pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== - dependencies: - "@jest/schemas" "^29.0.0" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prisma@^4.10.1: - version "4.16.2" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-4.16.2.tgz#469e0a0991c6ae5bcde289401726bb012253339e" - integrity sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g== - dependencies: - "@prisma/engines" "4.16.2" - -promptly@^2: - version "2.2.0" - resolved "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz" - integrity sha512-aC9j+BZsRSSzEsXBNBwDnAxujdx19HycZoKgRgzWnS8eOHg1asuf9heuLprfbe739zY3IdUQx+Egv6Jn135WHA== - dependencies: - read "^1.0.4" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-agent@~5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz" - integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g== - dependencies: - agent-base "^6.0.0" - debug "4" - http-proxy-agent "^4.0.0" - https-proxy-agent "^5.0.0" - lru-cache "^5.1.1" - pac-proxy-agent "^5.0.0" - proxy-from-env "^1.0.0" - socks-proxy-agent "^5.0.0" - -proxy-from-env@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.11.0, qs@^6.11.0: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -range-parser@^1.2.0, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1, raw-body@^2.2.0: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -read@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" - integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== - dependencies: - mute-stream "~0.0.4" - -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-in-the-middle@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz" - integrity sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg== - dependencies: - debug "^4.1.1" - module-details-from-path "^1.0.3" - resolve "^1.22.1" - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.20.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -run-series@^1.1.8: - version "1.1.9" - resolved "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz" - integrity sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g== - -rxjs@^7.5.7: - version "7.6.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz" - integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-stable-stringify@^2.3.1: - version "2.4.1" - resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz" - integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -semver@6.3.0, semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@7.x, semver@^7.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@~7.2.0: - version "7.2.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.2.3.tgz" - integrity sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shimmer@^1.1.0, shimmer@^1.2.0: - version "1.2.1" - resolved "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz" - integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -simple-update-notifier@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" - integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== - dependencies: - semver "~7.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@5, socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== - dependencies: - agent-base "^6.0.2" - debug "4" - socks "^2.3.3" - -socks@^2.3.3: - version "2.7.1" - resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@0.5.21: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -string-argv@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -superagent@^8.0.5: - version "8.0.6" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.6.tgz#e3fb0b3112b79b12acd605c08846253197765bf6" - integrity sha512-HqSe6DSIh3hEn6cJvCkaM1BLi466f1LHi4yubR0tpewlMpk4RUFFy35bKz8SsPBwYfIIJy5eclp+3tCYAuX0bw== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.3" - debug "^4.3.4" - fast-safe-stringify "^2.1.1" - form-data "^4.0.0" - formidable "^2.1.1" - methods "^1.1.2" - mime "2.6.0" - qs "^6.11.0" - semver "^7.3.8" - -supertest@^6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.3.3.tgz#42f4da199fee656106fd422c094cf6c9578141db" - integrity sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA== - dependencies: - methods "^1.1.2" - superagent "^8.0.5" - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swagger-jsdoc@^6.2.5: - version "6.2.5" - resolved "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.5.tgz" - integrity sha512-l+cdsKS2y+QDhrH1TJSUiE0y9XKuf5xaGSatjf0hR/wjTlMpO8WfubBK9d/nASdbHPMtj9iJZLBH2ogBEhL7Sw== - dependencies: - commander "6.2.0" - doctrine "3.0.0" - glob "7.1.6" - lodash.mergewith "^4.6.2" - swagger-parser "10.0.2" - yaml "2.0.0-1" - -swagger-parser@10.0.2: - version "10.0.2" - resolved "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.2.tgz" - integrity sha512-9jHkHM+QXyLGFLk1DkXBwV+4HyNm0Za3b8/zk/+mjr8jgOSiqm3FOTHBSDsBjtn9scdL+8eWcHdupp2NLM8tDw== - dependencies: - "@apidevtools/swagger-parser" "10.0.2" - -swagger-ui-dist@>=4.11.0: - version "4.15.5" - resolved "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.15.5.tgz" - integrity sha512-V3eIa28lwB6gg7/wfNvAbjwJYmDXy1Jo1POjyTzlB6wPcHiGlRxq39TSjYGVjQrUSAzpv+a7nzp7mDxgNy57xA== - -swagger-ui-express@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.6.0.tgz" - integrity sha512-ZxpQFp1JR2RF8Ar++CyJzEDdvufa08ujNUJgMVTMWPi86CuQeVdBtvaeO/ysrz6dJAYXf9kbVNhWD7JWocwqsA== - dependencies: - swagger-ui-dist ">=4.11.0" - -systeminformation@^5.7: - version "5.16.6" - resolved "https://registry.npmjs.org/systeminformation/-/systeminformation-5.16.6.tgz" - integrity sha512-FLljCM7UmCVnilpQvX9b1SptMjuxPrtlqqSsFPI/3nQ19ZDJSalpph/9K707y5N6gT1loJwG42j+xVhX0RwuFw== - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through@^2.3.8: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - -triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - -ts-jest@^29.0.3: - version "29.0.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.3.tgz#63ea93c5401ab73595440733cefdba31fcf9cb77" - integrity sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^29.0.0" - json5 "^2.2.1" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@1.9.3: - version "1.9.3" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.1, tslib@^2.1.0: - version "2.4.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tv4@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz" - integrity sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw== - -tx2@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/tx2/-/tx2-1.0.5.tgz" - integrity sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg== - dependencies: - json-stringify-safe "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-is@^1.6.18, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@^4.9.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1, utils-merge@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^3.2.1: - version "3.4.0" - resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - -validator@^13.6.0: - version "13.7.0" - resolved "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" - integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vizion@~2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/vizion/-/vizion-2.2.1.tgz" - integrity sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww== - dependencies: - async "^2.6.3" - git-node-fs "^1.0.0" - ini "^1.3.5" - js-git "^0.7.8" - -vm2@^3.9.8: - version "3.9.13" - resolved "https://registry.npmjs.org/vm2/-/vm2-3.9.13.tgz" - integrity sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -winston-transport@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz" - integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== - dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" - triple-beam "^1.3.0" - -winston@^3.8.2: - version "3.8.2" - resolved "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz" - integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== - dependencies: - "@colors/colors" "1.5.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.4.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.5.0" - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^7.0.0, ws@~7.4.0: - version "7.4.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz" - integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== - -xss-filters@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/xss-filters/-/xss-filters-1.2.7.tgz" - integrity sha512-KzcmYT/f+YzcYrYRqw6mXxd25BEZCxBQnf+uXTopQDIhrmiaLwO+f+yLsIvvNlPhYvgff8g3igqrBxYh9k8NbQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@2.0.0-1: - version "2.0.0-1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz" - integrity sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ== - -yaml@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz" - integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== - -yamljs@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz" - integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ== - dependencies: - argparse "^1.0.7" - glob "^7.0.5" - -yargs-parser@^21.0.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -z-schema@^4.2.3: - version "4.2.4" - resolved "https://registry.npmjs.org/z-schema/-/z-schema-4.2.4.tgz" - integrity sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w== - dependencies: - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - validator "^13.6.0" - optionalDependencies: - commander "^2.7.1" diff --git a/03_source/mobile_baseline.bak/.editorconfig b/03_source/mobile_baseline.bak/.editorconfig deleted file mode 100644 index 82da0b1..0000000 --- a/03_source/mobile_baseline.bak/.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -# http://editorconfig.org - -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -insert_final_newline = false -trim_trailing_whitespace = false \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/.firebaserc b/03_source/mobile_baseline.bak/.firebaserc deleted file mode 100644 index 711741d..0000000 --- a/03_source/mobile_baseline.bak/.firebaserc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "projects": { - "default": "ionic-react-conference-app" - } -} diff --git a/03_source/mobile_baseline.bak/.github/CONTRIBUTING.md b/03_source/mobile_baseline.bak/.github/CONTRIBUTING.md deleted file mode 100644 index 20ff866..0000000 --- a/03_source/mobile_baseline.bak/.github/CONTRIBUTING.md +++ /dev/null @@ -1,59 +0,0 @@ -# Contributing to the Ionic React Conference Application - -Thank you for taking the time to contribute! :tada::+1: - -The following is a set of guidelines for contributing to the conference app. These are just guidelines, not rules, use your best judgment and feel free to propose changes to this document in a pull request. - -## Table of Contents -- [Reporting Issues](#reporting-issues) - - [Before Submitting an Issue](#before-submitting-an-issue) - - [Determining the Repository](#determining-the-repository) - - [Submitting the Issue](#submitting-the-issue) -- [Submitting a Pull Request](#submitting-a-pull-request) - - [Guidelines for Submitting](#guidelines-for-submitting) - - [Code Style](#code-style) - -## Reporting Issues - -Before submitting an issue, please go through [the list below](#before-submitting-an-issue) as you might find a solution to your issue. - -### Before Submitting an Issue - -* Make sure you get the latest version of the code and run through the [Getting Started](https://github.com/ionic-team/ionic-react-conference-app#getting-started) steps to see if this resolves your issue. -* Check the [forum](https://forum.ionicframework.com) for similar questions and answers. -* Go through [all issues](https://github.com/ionic-team/ionic-react-conference-app/issues?utf8=%E2%9C%93&q=is%3Aissue) on this repository to see if the issue has already been created. It could have been closed with a resolution, so check closed issues, too. -* Chat with us on [Discord](https://ionic.link/discord) to see if we can find a solution to the problem! -* [Determine which repository](#determining-the-repository) the problem should be reported in. - -### Determining the Repository - -There are several repositories being used for Ionic, which makes it difficult to determine which one to report an issue to. Don't worry if you aren't sure, we can always move it! - -* The [Ionic Framework repository](https://github.com/ionic-team/ionic-framework) is a repository for all things related to the Ionic Framework. If you are able to reproduce the issue in any of the Ionic starters (or an existing project), you'll want to submit the issue [here](https://github.com/ionic-team/ionic-framework/issues). -* The [Ionic CLI repository](https://github.com/ionic-team/ionic-cli) contains all of the code that allows you to run `ionic` commands from a terminal window. It is safe to put any issues [here](https://github.com/ionic-team/ionic-cli/issues) that relate to running an `ionic` command. -* **This repository** is a demo of the Ionic Framework. If you find an issue with this app that does not occur on [a new app](https://ionicframework.com/docs/intro/cli#start-an-app), please submit the issue [here](https://github.com/ionic-team/ionic-react-conference-app/issues). - -### Submitting the Issue - -* **Use a clear and descriptive title** for the issue to identify the problem. This makes it easier for others to find. -* **Describe the exact steps to reproduce the problem** with as many details as needed. -* **Provide your configuration** by running `ionic info` in a terminal from *within* the project folder and pasting this information in the issue. - -## Submitting a Pull Request - -### Guidelines for Submitting - -When in doubt, keep your pull requests small. To give a PR the best chance of getting accepted, do not bundle more than one "feature" or bug fix per PR. Doing so makes it very hard to accept it if one of the fixes has issues. - -It's always best to create two smaller PRs than one big one. - -Talk to us before creating a PR that refactors the code or directory structure of the project. This project is constantly changing to reflect the latest version of Ionic Framework so sometimes it will be in the process of getting fixed. - -### Code Style - -Make sure to follow the existing code style as much as possible. - -* No underscores prefixing JS functions. -* Use flat Sass: - * **Don't** use [BEM conventions](https://css-tricks.com/bem-101/) - * Avoid nesting selectors. This is done to make it easier for users without Sass experience to understand and read. diff --git a/03_source/mobile_baseline.bak/.gitignore b/03_source/mobile_baseline.bak/.gitignore deleted file mode 100644 index 516dc4d..0000000 --- a/03_source/mobile_baseline.bak/.gitignore +++ /dev/null @@ -1,83 +0,0 @@ -# Logs -.firebase -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env - -# See https://help.github.com/ignore-files/ for more about ignoring files. - -# dependencies -/node_modules - -# testing -/coverage - -# production -/dist - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -.stencil/ diff --git a/03_source/mobile_baseline.bak/.netlify/_redirects b/03_source/mobile_baseline.bak/.netlify/_redirects deleted file mode 100644 index 50a4633..0000000 --- a/03_source/mobile_baseline.bak/.netlify/_redirects +++ /dev/null @@ -1 +0,0 @@ -/* /index.html 200 \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/.netlify/state.json b/03_source/mobile_baseline.bak/.netlify/state.json deleted file mode 100644 index f97268e..0000000 --- a/03_source/mobile_baseline.bak/.netlify/state.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "siteId": "86675615-6271-4145-8ffe-9c78dc4d34a3" -} \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/.prettierrc b/03_source/mobile_baseline.bak/.prettierrc deleted file mode 100644 index c3e0328..0000000 --- a/03_source/mobile_baseline.bak/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "semi": true, - "singleQuote": true, - "trailingComma": "es5" -} diff --git a/03_source/mobile_baseline.bak/.vscode/settings.json b/03_source/mobile_baseline.bak/.vscode/settings.json deleted file mode 100644 index 3662b37..0000000 --- a/03_source/mobile_baseline.bak/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules/typescript/lib" -} \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/LICENSE b/03_source/mobile_baseline.bak/LICENSE deleted file mode 100644 index 623c70a..0000000 --- a/03_source/mobile_baseline.bak/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2015-present Drifty Co. -http://drifty.com/ - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/03_source/mobile_baseline.bak/README.md b/03_source/mobile_baseline.bak/README.md deleted file mode 100644 index 7a24529..0000000 --- a/03_source/mobile_baseline.bak/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# Ionic React Conference App - -[![Built with Ionic](https://img.shields.io/badge/-Built%20with%20Ionic-3880FF?style=flat&logo=ionic&logoColor=white)](https://ionicframework.com) -[![React](https://img.shields.io/badge/-React-61DAFB?style=flat&logo=react&logoColor=black)](https://reactjs.org) -[![MIT License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) - - -This is a **kitchen-sink demo application** built with **Ionic Framework** and **React**. It showcases a wide range of Ionic components and features in the context of a fictional tech conference app. - -**Note**: There is no actual Ionic Conference. This project is purely for demonstration purposes. - -👉 [Try the Live Demo](https://ionic-react-conference-app-git-main-ionic1.vercel.app/tutorial) - -## 🧱 Framework Variants - -This app is also available in other frameworks: - -- 🔗 [Ionic Angular Conference App](https://github.com/ionic-team/ionic-conference-app) -- 🔗 [Ionic Vue Conference App](https://github.com/ionic-team/ionic-vue-conference-app) -- ✅ **You're viewing the React version** - -## ✨ Features - -- Browse conference schedule with filtering -- View speaker bios and session details -- User authentication and profile management -- Interactive maps for venue navigation -- Push notifications support -- Dark/Light mode toggling -- Cross-platform support: iOS, Android, and Web - -## ⚙️ Getting Started - -### Prerequisites - -- Node.js (LTS version recommended) → [Download](https://nodejs.org/) -- npm (included with Node.js) -- Ionic CLI → Install globally: - ```bash - npm install -g ionic - ``` - -### Installation -1. Clone the repository: - ```bash - git clone https://github.com/ionic-team/ionic-react-conference-app.git - ``` -2. Navigate into the project: - ```bash - cd ionic-react-conference-app - ``` -3. Install dependencies: - ```bash - npm install - ``` -4. Start the dev server: - ```bash - ionic serve - ``` -5. Open your browser to: - ``` - http://localhost:3000 - ``` - -## 🤝 Contributing - -We welcome contributions! Please see our [Contributing Guide](.github/CONTRIBUTING.md) for details on how to submit pull requests, report issues, and contribute to the project. - -## 📄 License - -This project is licensed under the MIT [License](./LICENSE). diff --git a/03_source/mobile_baseline.bak/android/.gitignore b/03_source/mobile_baseline.bak/android/.gitignore deleted file mode 100644 index 48354a3..0000000 --- a/03_source/mobile_baseline.bak/android/.gitignore +++ /dev/null @@ -1,101 +0,0 @@ -# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore - -# Built application files -*.apk -*.aar -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -# Uncomment the following line in case you need and you don't have the release build type files in your app -# release/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml - -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -#*.jks -#*.keystore - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild -.cxx/ - -# Google Services (e.g. APIs or Firebase) -# google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -# Version control -vcs.xml - -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ - -# Android Profiling -*.hprof - -# Cordova plugins for Capacitor -capacitor-cordova-android-plugins - -# Copied web assets -app/src/main/assets/public - -# Generated Config files -app/src/main/assets/capacitor.config.json -app/src/main/assets/capacitor.plugins.json -app/src/main/res/xml/config.xml diff --git a/03_source/mobile_baseline.bak/android/app/.gitignore b/03_source/mobile_baseline.bak/android/app/.gitignore deleted file mode 100644 index 043df80..0000000 --- a/03_source/mobile_baseline.bak/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build/* -!/build/.npmkeep diff --git a/03_source/mobile_baseline.bak/android/app/build.gradle b/03_source/mobile_baseline.bak/android/app/build.gradle deleted file mode 100644 index 6011e85..0000000 --- a/03_source/mobile_baseline.bak/android/app/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -apply plugin: 'com.android.application' - -android { - namespace "io.ionic.starter" - compileSdk rootProject.ext.compileSdkVersion - defaultConfig { - applicationId "io.ionic.starter" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - aaptOptions { - // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. - // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 - ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' - } - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -repositories { - flatDir{ - dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" - implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" - implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" - implementation project(':capacitor-android') - testImplementation "junit:junit:$junitVersion" - androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" - androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" - implementation project(':capacitor-cordova-android-plugins') -} - -apply from: 'capacitor.build.gradle' - -try { - def servicesJSON = file('google-services.json') - if (servicesJSON.text) { - apply plugin: 'com.google.gms.google-services' - } -} catch(Exception e) { - logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") -} diff --git a/03_source/mobile_baseline.bak/android/app/capacitor.build.gradle b/03_source/mobile_baseline.bak/android/app/capacitor.build.gradle deleted file mode 100644 index adabd97..0000000 --- a/03_source/mobile_baseline.bak/android/app/capacitor.build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 - } -} - -apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" -dependencies { - implementation project(':capacitor-preferences') - -} - - -if (hasProperty('postBuildExtras')) { - postBuildExtras() -} diff --git a/03_source/mobile_baseline.bak/android/app/proguard-rules.pro b/03_source/mobile_baseline.bak/android/app/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/03_source/mobile_baseline.bak/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/03_source/mobile_baseline.bak/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/03_source/mobile_baseline.bak/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java deleted file mode 100644 index f2c2217..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import android.content.Context; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("com.getcapacitor.app", appContext.getPackageName()); - } -} diff --git a/03_source/mobile_baseline.bak/android/app/src/main/AndroidManifest.xml b/03_source/mobile_baseline.bak/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 340e7df..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/03_source/mobile_baseline.bak/android/app/src/main/java/io/ionic/starter/MainActivity.java b/03_source/mobile_baseline.bak/android/app/src/main/java/io/ionic/starter/MainActivity.java deleted file mode 100644 index 73e3a98..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/java/io/ionic/starter/MainActivity.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.ionic.starter; - -import com.getcapacitor.BridgeActivity; - -public class MainActivity extends BridgeActivity {} diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-hdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-hdpi/splash.png deleted file mode 100644 index 90e8400..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-hdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-mdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-mdpi/splash.png deleted file mode 100644 index 990610d..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-mdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xhdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xhdpi/splash.png deleted file mode 100644 index 3c67e01..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xhdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xxhdpi/splash.png deleted file mode 100644 index cff9eef..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xxhdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xxxhdpi/splash.png deleted file mode 100644 index cd4b88d..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-hdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-hdpi/splash.png deleted file mode 100644 index fdd3184..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-hdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-mdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-mdpi/splash.png deleted file mode 100644 index 7dcce56..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-mdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xhdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xhdpi/splash.png deleted file mode 100644 index bcd0278..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xhdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xxhdpi/splash.png deleted file mode 100644 index 9048412..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xxhdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xxxhdpi/splash.png deleted file mode 100644 index a15aaa1..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21d..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable/ic_launcher_background.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index d5fccc5..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable/splash.png b/03_source/mobile_baseline.bak/android/app/src/main/res/drawable/splash.png deleted file mode 100644 index 990610d..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/drawable/splash.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/layout/activity_main.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b5ad138..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 036d09b..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 036d09b..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index d8c727b..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 2127973..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index d8c727b..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 3b955cd..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 8ed0605..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 3b955cd..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index a080869..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index df0f158..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index a080869..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 3c46f09..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2960cbb..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 3c46f09..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 2a94e06..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index d2ea9ab..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 2a94e06..0000000 Binary files a/03_source/mobile_baseline.bak/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/values/ic_launcher_background.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index c5d5899..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #FFFFFF - \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/values/strings.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/values/strings.xml deleted file mode 100644 index a15be2e..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - ionic-react-conference-app - ionic-react-conference-app - io.ionic.starter - io.ionic.starter - diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/values/styles.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/values/styles.xml deleted file mode 100644 index be874e5..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/android/app/src/main/res/xml/file_paths.xml b/03_source/mobile_baseline.bak/android/app/src/main/res/xml/file_paths.xml deleted file mode 100644 index bd0c4d8..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/03_source/mobile_baseline.bak/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java deleted file mode 100644 index 0297327..0000000 --- a/03_source/mobile_baseline.bak/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import org.junit.Test; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} diff --git a/03_source/mobile_baseline.bak/android/build.gradle b/03_source/mobile_baseline.bak/android/build.gradle deleted file mode 100644 index f1b3b0e..0000000 --- a/03_source/mobile_baseline.bak/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.7.2' - classpath 'com.google.gms:google-services:4.4.2' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -apply from: "variables.gradle" - -allprojects { - repositories { - google() - mavenCentral() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/03_source/mobile_baseline.bak/android/capacitor.settings.gradle b/03_source/mobile_baseline.bak/android/capacitor.settings.gradle deleted file mode 100644 index a1c665a..0000000 --- a/03_source/mobile_baseline.bak/android/capacitor.settings.gradle +++ /dev/null @@ -1,6 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') - -include ':capacitor-preferences' -project(':capacitor-preferences').projectDir = new File('../node_modules/@capacitor/preferences/android') diff --git a/03_source/mobile_baseline.bak/android/gradle.properties b/03_source/mobile_baseline.bak/android/gradle.properties deleted file mode 100644 index 2e87c52..0000000 --- a/03_source/mobile_baseline.bak/android/gradle.properties +++ /dev/null @@ -1,22 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true diff --git a/03_source/mobile_baseline.bak/android/gradle/wrapper/gradle-wrapper.jar b/03_source/mobile_baseline.bak/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b9..0000000 Binary files a/03_source/mobile_baseline.bak/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/03_source/mobile_baseline.bak/android/gradle/wrapper/gradle-wrapper.properties b/03_source/mobile_baseline.bak/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index c1d5e01..0000000 --- a/03_source/mobile_baseline.bak/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/03_source/mobile_baseline.bak/android/gradlew b/03_source/mobile_baseline.bak/android/gradlew deleted file mode 100755 index f5feea6..0000000 --- a/03_source/mobile_baseline.bak/android/gradlew +++ /dev/null @@ -1,252 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/03_source/mobile_baseline.bak/android/gradlew.bat b/03_source/mobile_baseline.bak/android/gradlew.bat deleted file mode 100644 index 9b42019..0000000 --- a/03_source/mobile_baseline.bak/android/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/03_source/mobile_baseline.bak/android/settings.gradle b/03_source/mobile_baseline.bak/android/settings.gradle deleted file mode 100644 index 3b4431d..0000000 --- a/03_source/mobile_baseline.bak/android/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -include ':app' -include ':capacitor-cordova-android-plugins' -project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') - -apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/android/variables.gradle b/03_source/mobile_baseline.bak/android/variables.gradle deleted file mode 100644 index 2c8e408..0000000 --- a/03_source/mobile_baseline.bak/android/variables.gradle +++ /dev/null @@ -1,16 +0,0 @@ -ext { - minSdkVersion = 23 - compileSdkVersion = 35 - targetSdkVersion = 35 - androidxActivityVersion = '1.9.2' - androidxAppCompatVersion = '1.7.0' - androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.15.0' - androidxFragmentVersion = '1.8.4' - coreSplashScreenVersion = '1.0.1' - androidxWebkitVersion = '1.12.1' - junitVersion = '4.13.2' - androidxJunitVersion = '1.2.1' - androidxEspressoCoreVersion = '3.6.1' - cordovaAndroidVersion = '10.1.1' -} \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/capacitor.config.json b/03_source/mobile_baseline.bak/capacitor.config.json deleted file mode 100644 index 0f2dd5f..0000000 --- a/03_source/mobile_baseline.bak/capacitor.config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "appId": "io.ionic.starter", - "appName": "ionic-react-conference-app", - "bundledWebRuntime": false, - "npmClient": "npm", - "webDir": "dist", - "cordova": {} -} diff --git a/03_source/mobile_baseline.bak/firebase.json b/03_source/mobile_baseline.bak/firebase.json deleted file mode 100644 index 49a74df..0000000 --- a/03_source/mobile_baseline.bak/firebase.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "hosting": { - "public": "build", - "rewrites": [ - { - "source": "**", - "destination": "/index.html" - } - ], - "headers": [ - { - "source": "**/static/**", - "headers": [ - { - "key": "Cache-Control", - "value": "max-age=31536000" - } - ] - }, - { - "source": "**/*.@(jpg|jpeg|gif|png|svg)", - "headers": [ - { - "key": "Cache-Control", - "value": "max-age=31536000" - } - ] - } - ] - } -} diff --git a/03_source/mobile_baseline.bak/index.html b/03_source/mobile_baseline.bak/index.html deleted file mode 100644 index 805b105..0000000 --- a/03_source/mobile_baseline.bak/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - Ionic Conference App - - - - - - - - - - - - - - - -
- - - - diff --git a/03_source/mobile_baseline.bak/ionic.config.json b/03_source/mobile_baseline.bak/ionic.config.json deleted file mode 100644 index f610198..0000000 --- a/03_source/mobile_baseline.bak/ionic.config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "ionic-react-conference-app", - "integrations": { - "capacitor": {} - }, - "type": "react" -} diff --git a/03_source/mobile_baseline.bak/ios/.gitignore b/03_source/mobile_baseline.bak/ios/.gitignore deleted file mode 100644 index f470299..0000000 --- a/03_source/mobile_baseline.bak/ios/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -App/build -App/Pods -App/output -App/App/public -DerivedData -xcuserdata - -# Cordova plugins for Capacitor -capacitor-cordova-ios-plugins - -# Generated Config files -App/App/capacitor.config.json -App/App/config.xml diff --git a/03_source/mobile_baseline.bak/ios/App/App.xcodeproj/project.pbxproj b/03_source/mobile_baseline.bak/ios/App/App.xcodeproj/project.pbxproj deleted file mode 100644 index d6d8154..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App.xcodeproj/project.pbxproj +++ /dev/null @@ -1,408 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 48; - objects = { - -/* Begin PBXBuildFile section */ - 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; - 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; - 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; - A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; - 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; - 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; - AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; - FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 504EC3011FED79650016851F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { - isa = PBXGroup; - children = ( - AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 504EC2FB1FED79650016851F = { - isa = PBXGroup; - children = ( - 504EC3061FED79650016851F /* App */, - 504EC3051FED79650016851F /* Products */, - 7F8756D8B27F46E3366F6CEA /* Pods */, - 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, - ); - sourceTree = ""; - }; - 504EC3051FED79650016851F /* Products */ = { - isa = PBXGroup; - children = ( - 504EC3041FED79650016851F /* App.app */, - ); - name = Products; - sourceTree = ""; - }; - 504EC3061FED79650016851F /* App */ = { - isa = PBXGroup; - children = ( - 50379B222058CBB4000EE86E /* capacitor.config.json */, - 504EC3071FED79650016851F /* AppDelegate.swift */, - 504EC30B1FED79650016851F /* Main.storyboard */, - 504EC30E1FED79650016851F /* Assets.xcassets */, - 504EC3101FED79650016851F /* LaunchScreen.storyboard */, - 504EC3131FED79650016851F /* Info.plist */, - 2FAD9762203C412B000D30F8 /* config.xml */, - 50B271D01FEDC1A000F3C39B /* public */, - ); - path = App; - sourceTree = ""; - }; - 7F8756D8B27F46E3366F6CEA /* Pods */ = { - isa = PBXGroup; - children = ( - FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, - AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 504EC3031FED79650016851F /* App */ = { - isa = PBXNativeTarget; - buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; - buildPhases = ( - 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, - 504EC3001FED79650016851F /* Sources */, - 504EC3011FED79650016851F /* Frameworks */, - 504EC3021FED79650016851F /* Resources */, - 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = App; - productName = App; - productReference = 504EC3041FED79650016851F /* App.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 504EC2FC1FED79650016851F /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; - TargetAttributes = { - 504EC3031FED79650016851F = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - }; - }; - }; - buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; - compatibilityVersion = "Xcode 8.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 504EC2FB1FED79650016851F; - packageReferences = ( - ); - productRefGroup = 504EC3051FED79650016851F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 504EC3031FED79650016851F /* App */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 504EC3021FED79650016851F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, - 50B271D11FEDC1A000F3C39B /* public in Resources */, - 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, - 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, - 504EC30D1FED79650016851F /* Main.storyboard in Resources */, - 2FAD9763203C412B000D30F8 /* config.xml in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 504EC3001FED79650016851F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 504EC30B1FED79650016851F /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC30C1FED79650016851F /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 504EC3111FED79650016851F /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 504EC3141FED79650016851F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 504EC3151FED79650016851F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 504EC3171FED79650016851F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; - PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 504EC3181FED79650016851F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - INFOPLIST_FILE = App/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = io.ionic.starter; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3141FED79650016851F /* Debug */, - 504EC3151FED79650016851F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 504EC3171FED79650016851F /* Debug */, - 504EC3181FED79650016851F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 504EC2FC1FED79650016851F /* Project object */; -} diff --git a/03_source/mobile_baseline.bak/ios/App/App.xcworkspace/contents.xcworkspacedata b/03_source/mobile_baseline.bak/ios/App/App.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index b301e82..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/03_source/mobile_baseline.bak/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/03_source/mobile_baseline.bak/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/03_source/mobile_baseline.bak/ios/App/App/AppDelegate.swift b/03_source/mobile_baseline.bak/ios/App/App/AppDelegate.swift deleted file mode 100644 index c3cd83b..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App/AppDelegate.swift +++ /dev/null @@ -1,49 +0,0 @@ -import UIKit -import Capacitor - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { - // Called when the app was launched with a url. Feel free to add additional processing here, - // but if you want the App API to support tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(app, open: url, options: options) - } - - func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { - // Called when the app was launched with an activity, including Universal Links. - // Feel free to add additional processing here, but if you want the App API to support - // tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) - } - -} diff --git a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png deleted file mode 100644 index f6a7b1f..0000000 Binary files a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 9b7d382..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images" : [ - { - "filename" : "AppIcon-512@2x.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Contents.json b/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json deleted file mode 100644 index d7d96a6..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "splash-2732x2732-2.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "splash-2732x2732-1.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "splash-2732x2732.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png deleted file mode 100644 index 009110e..0000000 Binary files a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png deleted file mode 100644 index 009110e..0000000 Binary files a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png deleted file mode 100644 index 009110e..0000000 Binary files a/03_source/mobile_baseline.bak/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/ios/App/App/Base.lproj/LaunchScreen.storyboard b/03_source/mobile_baseline.bak/ios/App/App/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index e7ae5d7..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/03_source/mobile_baseline.bak/ios/App/App/Base.lproj/Main.storyboard b/03_source/mobile_baseline.bak/ios/App/App/Base.lproj/Main.storyboard deleted file mode 100644 index b44df7b..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App/Base.lproj/Main.storyboard +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/03_source/mobile_baseline.bak/ios/App/App/Info.plist b/03_source/mobile_baseline.bak/ios/App/App/Info.plist deleted file mode 100644 index 70a2849..0000000 --- a/03_source/mobile_baseline.bak/ios/App/App/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ionic-react-conference-app - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(MARKETING_VERSION) - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/03_source/mobile_baseline.bak/ios/App/Podfile b/03_source/mobile_baseline.bak/ios/App/Podfile deleted file mode 100644 index 0451e2c..0000000 --- a/03_source/mobile_baseline.bak/ios/App/Podfile +++ /dev/null @@ -1,24 +0,0 @@ -require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' - -platform :ios, '14.0' -use_frameworks! - -# workaround to avoid Xcode caching of Pods that requires -# Product -> Clean Build Folder after new Cordova plugins installed -# Requires CocoaPods 1.6 or newer -install! 'cocoapods', :disable_input_output_paths => true - -def capacitor_pods - pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorPreferences', :path => '../../node_modules/@capacitor/preferences' -end - -target 'App' do - capacitor_pods - # Add your Pods here -end - -post_install do |installer| - assertDeploymentTarget(installer) -end diff --git a/03_source/mobile_baseline.bak/ios/App/Podfile.lock b/03_source/mobile_baseline.bak/ios/App/Podfile.lock deleted file mode 100644 index 29efe53..0000000 --- a/03_source/mobile_baseline.bak/ios/App/Podfile.lock +++ /dev/null @@ -1,28 +0,0 @@ -PODS: - - Capacitor (7.0.1): - - CapacitorCordova - - CapacitorCordova (7.0.1) - - CapacitorPreferences (7.0.0): - - Capacitor - -DEPENDENCIES: - - "Capacitor (from `../../node_modules/@capacitor/ios`)" - - "CapacitorCordova (from `../../node_modules/@capacitor/ios`)" - - "CapacitorPreferences (from `../../node_modules/@capacitor/preferences`)" - -EXTERNAL SOURCES: - Capacitor: - :path: "../../node_modules/@capacitor/ios" - CapacitorCordova: - :path: "../../node_modules/@capacitor/ios" - CapacitorPreferences: - :path: "../../node_modules/@capacitor/preferences" - -SPEC CHECKSUMS: - Capacitor: de199cba6c8b20995428ad0b7cb0bc6ca625ffd4 - CapacitorCordova: 63d476958d5022d76f197031e8b7ea3519988c64 - CapacitorPreferences: 8e4bef1f937fc991a19d7ea99330c36a62edd24b - -PODFILE CHECKSUM: bc4412675d30bc194ab5961211929e1e7de79579 - -COCOAPODS: 1.16.2 diff --git a/03_source/mobile_baseline.bak/package-lock.json b/03_source/mobile_baseline.bak/package-lock.json deleted file mode 100644 index a482c6e..0000000 --- a/03_source/mobile_baseline.bak/package-lock.json +++ /dev/null @@ -1,5165 +0,0 @@ -{ - "name": "ionic-react-conference-app", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ionic-react-conference-app", - "version": "0.0.0", - "license": "MIT", - "dependencies": { - "@capacitor/android": "7.0.1", - "@capacitor/core": "^7.0.0", - "@capacitor/ios": "7.0.1", - "@capacitor/preferences": "^7.0.0", - "@ionic/react": "^8.5.0", - "@ionic/react-router": "^8.5.0", - "@types/leaflet": "^1.9.17", - "@types/react-redux": "^7.1.34", - "date-fns": "^2.25.0", - "ionicons": "^7.1.2", - "leaflet": "^1.9.4", - "react": "19.0.0", - "react-dom": "19.0.0", - "react-leaflet": "^5.0.0", - "react-redux": "^9.2.0", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "reselect": "^4.0.0", - "sass": "^1.85.1", - "swiper": "^9.1.1" - }, - "devDependencies": { - "@capacitor/cli": "^7.0.0", - "@testing-library/react": "^9.3.1", - "@types/jest": "24.0.18", - "@types/react": "19.0.10", - "@types/react-dom": "19.0.4", - "@types/react-router": "^5.1.20", - "@types/react-router-dom": "^5.3.3", - "@vitejs/plugin-react": "^4.3.4", - "lint-staged": "^13.2.0", - "prettier": "^2.8.6", - "typescript": "^5.8.2", - "vite": "^6.2.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", - "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helpers": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.1.tgz", - "integrity": "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@capacitor/android": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-7.0.1.tgz", - "integrity": "sha512-jukJJHfkcyEBOkFBJRD3EwXMIIQo7lSv0ExPWgsIliPdGXLAj6ElvK2JaYEzec3vKyLc4RTNFVv0PMEU0vnImg==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": "^7.0.0" - } - }, - "node_modules/@capacitor/cli": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.2.0.tgz", - "integrity": "sha512-RNW9vtYYYSDmOdguYBSW0VpRnG/d6lGydlc9DLrJ7qbSPxFrotTz9IjkM48O+SruUma61DyuSqJttdbay2xSxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/cli-framework-output": "^2.2.8", - "@ionic/utils-subprocess": "^3.0.1", - "@ionic/utils-terminal": "^2.3.5", - "commander": "^12.1.0", - "debug": "^4.4.0", - "env-paths": "^2.2.0", - "fs-extra": "^11.2.0", - "kleur": "^4.1.5", - "native-run": "^2.0.1", - "open": "^8.4.0", - "plist": "^3.1.0", - "prompts": "^2.4.2", - "rimraf": "^6.0.1", - "semver": "^7.6.3", - "tar": "^6.1.11", - "tslib": "^2.8.1", - "xml2js": "^0.6.2" - }, - "bin": { - "cap": "bin/capacitor", - "capacitor": "bin/capacitor" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@capacitor/core": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.2.0.tgz", - "integrity": "sha512-2zCnA6RJeZ9ec4470o8QMZEQTWpekw9FNoqm5TLc10jeCrhvHVI8MPgxdZVc3mOdFlyieYu4AS1fNxSqbS57Pw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@capacitor/ios": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-7.0.1.tgz", - "integrity": "sha512-RN6S1C1k7ue57DFmJM4EizzsYBrahTTiMhcnlHspFLaojgHbFWZbYq1VriuRKysPU1ka/P+klsdtRFsB5K9jyw==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": "^7.0.0" - } - }, - "node_modules/@capacitor/preferences": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@capacitor/preferences/-/preferences-7.0.1.tgz", - "integrity": "sha512-XF9jOHzvoIBZLwZr/EX6aVaUO1d8Mx7TwBLQS33pYHOliCW5knT5KUkFOXNNYxh9qqODYesee9xuQIKNJpQBag==", - "license": "MIT", - "peerDependencies": { - "@capacitor/core": ">=7.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@ionic/cli-framework-output": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", - "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-terminal": "2.3.5", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/core": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-8.5.7.tgz", - "integrity": "sha512-V5ZRYXD1MgAPdjfLyOejILAdTqIzpMY7/v6GSynFPPWoEpfFbGe/tNsimrYm1/D8iouigYLkJjWSeg2rpIpESA==", - "license": "MIT", - "dependencies": { - "@stencil/core": "4.20.0", - "ionicons": "^7.2.2", - "tslib": "^2.1.0" - } - }, - "node_modules/@ionic/react": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/react/-/react-8.5.7.tgz", - "integrity": "sha512-AgX4iu6SfuBhNgYr0H+K3oGsp7ESkCsnaqZdHRO2+GtKTmo4akMrFPihGj4LrZB/IaYwcvYQR/bPWHuZGJYsnw==", - "license": "MIT", - "dependencies": { - "@ionic/core": "8.5.7", - "ionicons": "^7.0.0", - "tslib": "*" - }, - "peerDependencies": { - "react": ">=16.8.6", - "react-dom": ">=16.8.6" - } - }, - "node_modules/@ionic/react-router": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@ionic/react-router/-/react-router-8.5.7.tgz", - "integrity": "sha512-REEnLRIWh23DnqTugNT7VIO2D49GtmSHvxOmmTmaFTjhMXQ1ilzM35oh+Fr2pWU5NmCqD8am+RLfITQhIJI1hA==", - "license": "MIT", - "dependencies": { - "@ionic/react": "8.5.7", - "tslib": "*" - }, - "peerDependencies": { - "react": ">=16.8.6", - "react-dom": ">=16.8.6", - "react-router": "^5.0.1", - "react-router-dom": "^5.0.1" - } - }, - "node_modules/@ionic/utils-array": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", - "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-fs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", - "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^8.0.0", - "debug": "^4.0.0", - "fs-extra": "^9.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-fs/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@ionic/utils-object": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", - "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-process": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", - "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-object": "2.1.6", - "@ionic/utils-terminal": "2.3.5", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "tree-kill": "^1.2.2", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", - "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-subprocess": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", - "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-array": "2.1.6", - "@ionic/utils-fs": "3.1.7", - "@ionic/utils-process": "2.1.12", - "@ionic/utils-stream": "3.1.7", - "@ionic/utils-terminal": "2.3.5", - "cross-spawn": "^7.0.3", - "debug": "^4.0.0", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@ionic/utils-terminal": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", - "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/slice-ansi": "^4.0.0", - "debug": "^4.0.0", - "signal-exit": "^3.0.3", - "slice-ansi": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "tslib": "^2.0.1", - "untildify": "^4.0.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jest/types": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", - "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@react-leaflet/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", - "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", - "license": "Hippocratic-2.1", - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^19.0.0", - "react-dom": "^19.0.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.9", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", - "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", - "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", - "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", - "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", - "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", - "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", - "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", - "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", - "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", - "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", - "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", - "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", - "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", - "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", - "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", - "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", - "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", - "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", - "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", - "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", - "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sheerun/mutationobserver-shim": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", - "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@stencil/core": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.20.0.tgz", - "integrity": "sha512-WPrTHFngvN081RY+dJPneKQLwnOFD60OMCOQGmmSHfCW0f4ujPMzzhwWU1gcSwXPWXz5O+8cBiiCaxAbJU7kAg==", - "license": "MIT", - "bin": { - "stencil": "bin/stencil" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=7.10.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.16.0.tgz", - "integrity": "sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4", - "@sheerun/mutationobserver-shim": "^0.3.2", - "@types/testing-library__dom": "^6.12.1", - "aria-query": "^4.0.2", - "dom-accessibility-api": "^0.3.0", - "pretty-format": "^25.1.0", - "wait-for-expect": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz", - "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4", - "@testing-library/dom": "^6.15.0", - "@types/testing-library__react": "^9.1.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", - "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "24.0.18", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.18.tgz", - "integrity": "sha512-jcDDXdjTcrQzdN06+TSVsPPqxvsZA/5QkYfIZlq1JMw7FdP5AZylbOc+6B/cuDurctRe+MziUMtQ3xQdrbjqyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/jest-diff": "*" - } - }, - "node_modules/@types/jest-diff": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", - "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/leaflet": { - "version": "1.9.18", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.18.tgz", - "integrity": "sha512-ht2vsoPjezor5Pmzi5hdsA7F++v5UGq9OlUduWHmMZiuQGIpJ2WS5+Gg9HaAA79gNh1AIPtCqhzejcIZ3lPzXQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/node": { - "version": "22.15.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", - "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/react": { - "version": "19.0.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", - "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.0.4.tgz", - "integrity": "sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@types/react-redux": { - "version": "7.1.34", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", - "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", - "license": "MIT", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "node_modules/@types/react-redux/node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/testing-library__dom": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz", - "integrity": "sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pretty-format": "^24.3.0" - } - }, - "node_modules/@types/testing-library__dom/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/testing-library__dom/node_modules/@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/testing-library__dom/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@types/testing-library__dom/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@types/testing-library__dom/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@types/testing-library__dom/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/testing-library__dom/node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/testing-library__react": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz", - "integrity": "sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react-dom": "*", - "@types/testing-library__dom": "*", - "pretty-format": "^25.1.0" - } - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.0.tgz", - "integrity": "sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@rolldown/pluginutils": "1.0.0-beta.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bplist-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", - "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "1.6.x" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-js-pure": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", - "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz", - "integrity": "sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.157", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.157.tgz", - "integrity": "sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==", - "dev": true, - "license": "ISC" - }, - "node_modules/elementtree": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", - "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "sax": "1.1.4" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", - "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/immutable": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", - "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", - "license": "MIT" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ionicons": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-7.4.0.tgz", - "integrity": "sha512-ZK94MMqgzMCPPMhmk8Ouu6goyVHFIlw/ACP6oe3FrikcI0N7CX0xcwVaEbUc0G/v3W0shI93vo+9ve/KpvcNhQ==", - "license": "MIT", - "dependencies": { - "@stencil/core": "^4.0.3" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", - "license": "BSD-2-Clause" - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lint-staged": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", - "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "5.3.0", - "commander": "11.0.0", - "debug": "4.3.4", - "execa": "7.2.0", - "lilconfig": "2.1.0", - "listr2": "6.6.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/lint-staged/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/lint-staged/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 14" - } - }, - "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^3.1.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", - "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/native-run": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.1.tgz", - "integrity": "sha512-XfG1FBZLM50J10xH9361whJRC9SHZ0Bub4iNRhhI61C8Jv0e1ud19muex6sNKB51ibQNUJNuYn25MuYET/rE6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ionic/utils-fs": "^3.1.7", - "@ionic/utils-terminal": "^2.3.4", - "bplist-parser": "^0.3.2", - "debug": "^4.3.4", - "elementtree": "^0.1.7", - "ini": "^4.1.1", - "plist": "^3.1.0", - "split2": "^4.2.0", - "through2": "^4.0.2", - "tslib": "^2.6.2", - "yauzl": "^2.10.0" - }, - "bin": { - "native-run": "bin/native-run" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/path-to-regexp": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", - "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-format": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", - "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^25.5.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - }, - "engines": { - "node": ">= 8.3" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prompts/node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", - "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.25.0" - }, - "peerDependencies": { - "react": "^19.0.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-leaflet": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", - "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", - "license": "Hippocratic-2.1", - "dependencies": { - "@react-leaflet/core": "^3.0.0" - }, - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^19.0.0", - "react-dom": "^19.0.0" - } - }, - "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", - "license": "MIT" - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "license": "MIT" - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.41.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", - "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.1", - "@rollup/rollup-android-arm64": "4.41.1", - "@rollup/rollup-darwin-arm64": "4.41.1", - "@rollup/rollup-darwin-x64": "4.41.1", - "@rollup/rollup-freebsd-arm64": "4.41.1", - "@rollup/rollup-freebsd-x64": "4.41.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", - "@rollup/rollup-linux-arm-musleabihf": "4.41.1", - "@rollup/rollup-linux-arm64-gnu": "4.41.1", - "@rollup/rollup-linux-arm64-musl": "4.41.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-gnu": "4.41.1", - "@rollup/rollup-linux-riscv64-musl": "4.41.1", - "@rollup/rollup-linux-s390x-gnu": "4.41.1", - "@rollup/rollup-linux-x64-gnu": "4.41.1", - "@rollup/rollup-linux-x64-musl": "4.41.1", - "@rollup/rollup-win32-arm64-msvc": "4.41.1", - "@rollup/rollup-win32-ia32-msvc": "4.41.1", - "@rollup/rollup-win32-x64-msvc": "4.41.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/sass": { - "version": "1.89.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.0.tgz", - "integrity": "sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==", - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sax": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", - "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", - "dev": true, - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/ssr-window": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", - "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==", - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/swiper": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/swiper/-/swiper-9.4.1.tgz", - "integrity": "sha512-1nT2T8EzUpZ0FagEqaN/YAhRj33F2x/lN6cyB0/xoYJDMf8KwTFT3hMOeoB8Tg4o3+P/CKqskP+WX0Df046fqA==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/swiperjs" - }, - { - "type": "open_collective", - "url": "http://opencollective.com/swiper" - } - ], - "license": "MIT", - "dependencies": { - "ssr-window": "^4.0.2" - }, - "engines": { - "node": ">= 4.7.0" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "license": "MIT" - }, - "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/wait-for-expect": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz", - "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==", - "dev": true, - "license": "MIT" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/03_source/mobile_baseline.bak/package.json b/03_source/mobile_baseline.bak/package.json deleted file mode 100644 index 8c51220..0000000 --- a/03_source/mobile_baseline.bak/package.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "name": "ionic-react-conference-app", - "version": "0.0.0", - "description": "Ionic Conference App", - "author": "Ionic Team ", - "license": "MIT", - "private": true, - "dependencies": { - "@capacitor/android": "7.0.1", - "@capacitor/core": "^7.0.0", - "@capacitor/ios": "7.0.1", - "@capacitor/preferences": "^7.0.0", - "@ionic/react": "^8.5.0", - "@ionic/react-router": "^8.5.0", - "@types/leaflet": "^1.9.17", - "@types/react-redux": "^7.1.34", - "date-fns": "^2.25.0", - "ionicons": "^7.1.2", - "leaflet": "^1.9.4", - "react": "19.0.0", - "react-dom": "19.0.0", - "react-leaflet": "^5.0.0", - "react-redux": "^9.2.0", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "reselect": "^4.0.0", - "sass": "^1.85.1", - "swiper": "^9.1.1" - }, - "scripts": { - "start": "npm run dev", - "dev": "vite", - "ionic:serve": "vite", - "ionic:build": "tsc && vite build", - "build": "tsc && vite build", - "preview": "vite preview", - "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,md}\"", - "precommit": "npm run format && lint-staged" - }, - "eslintConfig": { - "extends": "react-app" - }, - "browserslist": [ - ">0.2%", - "not dead", - "not ie <= 11", - "not op_mini all" - ], - "devDependencies": { - "@capacitor/cli": "^7.0.0", - "@testing-library/react": "^9.3.1", - "@types/jest": "24.0.18", - "@types/react": "19.0.10", - "@types/react-dom": "19.0.4", - "@types/react-router": "^5.1.20", - "@types/react-router-dom": "^5.3.3", - "@vitejs/plugin-react": "^4.3.4", - "lint-staged": "^13.2.0", - "prettier": "^2.8.6", - "typescript": "^5.8.2", - "vite": "^6.2.0" - }, - "lint-staged": { - "src/**/*.{js,jsx,ts,tsx,json,md}": [ - "prettier --write", - "git add" - ] - } -} diff --git a/03_source/mobile_baseline.bak/public/assets/data/data.json b/03_source/mobile_baseline.bak/public/assets/data/data.json deleted file mode 100644 index 44f6125..0000000 --- a/03_source/mobile_baseline.bak/public/assets/data/data.json +++ /dev/null @@ -1,467 +0,0 @@ -{ - "schedule": [ - { - "date": "2047-05-17", - "groups": [ - { - "time": "8:00 am", - "sessions": [ - { - "name": "Breakfast", - "timeStart": "8:00 am", - "timeEnd": "9:00 am", - "location": "Dining Hall", - "tracks": ["Food"], - "id": "1" - } - ] - }, - { - "time": "9:15 am", - "sessions": [ - { - "name": "Getting Started with Ionic", - "location": "Hall 2", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Ted Turtle"], - "timeStart": "9:30 am", - "timeEnd": "9:45 am", - "tracks": ["Ionic"], - "id": "2" - }, - { - "name": "Ionic Tooling", - "location": "Executive Ballroom", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Rachel Rabbit"], - "timeStart": "9:45 am", - "timeEnd": "10:00 am", - "tracks": ["Tooling"], - "id": "3" - }, - { - "name": "University of Ionic", - "location": "Hall 3", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Ellie Elephant"], - "timeStart": "9:15 am", - "timeEnd": "9:30 am", - "tracks": ["Ionic"], - "id": "4" - } - ] - }, - { - "time": "10:00 am", - "sessions": [ - { - "name": "Migrating to Ionic", - "location": "Hall 1", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Eva Eagle", "Lionel Lion"], - "timeStart": "10:00 am", - "timeEnd": "10:15 am", - "tracks": ["Ionic"], - "id": "5" - }, - { - "name": "What's New in React", - "location": "Hall 3", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Rachel Rabbit"], - "timeStart": "10:15 am", - "timeEnd": "10:30 am", - "tracks": ["React"], - "id": "6" - }, - { - "name": "The Evolution of Ionicons", - "location": "Hall 2", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Isabella Iguana", "Eva Eagle"], - "timeStart": "10:15 am", - "timeEnd": "10:30 am", - "tracks": ["Design"], - "id": "7" - }, - { - "name": "Ionic Pro", - "location": "Grand Ballroom A", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Charlie Cheetah"], - "timeStart": "10:45 am", - "timeEnd": "11:00 am", - "tracks": ["Services"], - "id": "8" - } - ] - }, - { - "time": "11:00 am", - "sessions": [ - { - "name": "Ionic Workshop", - "location": "Hall 1", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Karl Kitten", "Lionel Lion"], - "timeStart": "11:00 am", - "timeEnd": "11:45 am", - "tracks": ["Workshop"], - "id": "9" - }, - { - "name": "Community Interaction", - "location": "Hall 3", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Lionel Lion", "Gino Giraffe"], - "timeStart": "11:30 am", - "timeEnd": "11:50 am", - "tracks": ["Communication"], - "id": "10" - }, - { - "name": "Navigation in Ionic", - "location": "Grand Ballroom A", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Rachel Rabbit", "Eva Eagle"], - "timeStart": "11:30 am", - "timeEnd": "12:00 pm", - "tracks": ["Navigation"], - "id": "11" - } - ] - }, - { - "time": "12:00 pm", - "sessions": [ - { - "name": "Lunch", - "location": "Dining Hall", - "description": "Come grab lunch with all the Ionic fanatics and talk all things Ionic", - "timeStart": "12:00 pm", - "timeEnd": "1:00 pm", - "tracks": ["Food"], - "id": "12" - } - ] - }, - { - "time": "1:00 pm", - "sessions": [ - { - "name": "Ionic in the Enterprise", - "location": "Hall 1", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Paul Puppy"], - "timeStart": "1:00 pm", - "timeEnd": "1:15 pm", - "tracks": ["Communication"], - "id": "13" - }, - { - "name": "Ionic Worldwide", - "location": "Hall 1", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Gino Giraffe"], - "timeStart": "1:15 pm", - "timeEnd": "1:30 pm", - "tracks": ["Communication"], - "id": "14" - }, - { - "name": "The Ionic Package", - "location": "Grand Ballroom B", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Molly Mouse", "Burt Bear"], - "timeStart": "1:30 pm", - "timeEnd": "2:00 pm", - "tracks": ["Services"], - "id": "15" - } - ] - }, - { - "time": "2:00 pm", - "sessions": [ - { - "name": "Push Notifications in Ionic", - "location": "Hall 2", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Burt Bear", "Charlie Cheetah"], - "timeStart": "2:00 pm", - "timeEnd": "2:30 pm", - "tracks": ["Services"], - "id": "16" - }, - { - "name": "Ionic Documentation", - "location": "Grand Ballroom B", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Donald Duck"], - "timeStart": "2:30 pm", - "timeEnd": "2:45 pm", - "tracks": ["Documentation"], - "id": "17" - }, - { - "name": "UX in Ionic", - "location": "Hall 3", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Isabella Iguana", "Ellie Elephant"], - "timeStart": "2:45 pm", - "timeEnd": "3:00 pm", - "tracks": ["Design"], - "id": "18" - } - ] - }, - { - "time": "3:00 pm", - "sessions": [ - { - "name": "Building with React and Ionic", - "location": "Hall 1", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Ted Turtle"], - "timeStart": "3:00 pm", - "timeEnd": "3:30 pm", - "tracks": ["React"], - "id": "19" - }, - { - "name": "Mobile States", - "location": "Hall 2", - "description": "Mobile devices and browsers are now advanced enough that developers can build native-quality mobile apps using open web technologies like HTML5, Javascript, and CSS. In this talk, we’ll provide background on why and how we created Ionic, the design decisions made as we integrated Ionic with React, and the performance considerations for mobile platforms that our team had to overcome. We’ll also review new and upcoming Ionic features, and talk about the hidden powers and benefits of combining mobile app development and React.", - "speakerNames": ["Rachel Rabbit"], - "timeStart": "3:30 pm", - "timeEnd": "3:45 pm", - "tracks": ["Navigation"], - "id": "20" - } - ] - } - ] - } - ], - - "speakers": [ - { - "name": "Burt Bear", - "profilePic": "/assets/img/speakers/bear.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Burt is a Bear. Burt's interests include poetry, dashing space heroes, and lions.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "burt@example.com", - "phone": "+1-541-754-3010", - "id": "1" - }, - { - "name": "Charlie Cheetah", - "profilePic": "/assets/img/speakers/cheetah.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Charlie is a Cheetah. Charlie's interests include country music, plush animals, pyrotechnics, and skeletons.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "charlie@example.com", - "phone": "+1-541-754-3010", - "id": "2" - }, - { - "name": "Donald Duck", - "profilePic": "/assets/img/speakers/duck.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Donald is a Duck. Donald's interests include carpentry, superheroes, merpeople, and glam rock.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "donald@example.com", - "phone": "+1-541-754-3010", - "id": "3" - }, - { - "name": "Eva Eagle", - "profilePic": "/assets/img/speakers/eagle.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Eva is an Eagle. Eva's interests include ants, seashells, and cupcakes.", - "title": "Developer Advocate", - "location": "Everywhere", - "email": "eva@example.com", - "phone": "+1-541-754-3010", - "id": "4" - }, - { - "name": "Ellie Elephant", - "profilePic": "/assets/img/speakers/elephant.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Ellie is an Elephant. Ellie's interests include pocket watches, pool, hand fans, and ninjas.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "ellie@example.com", - "phone": "+1-541-754-3010", - "id": "5" - }, - { - "name": "Gino Giraffe", - "profilePic": "/assets/img/speakers/giraffe.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Gino is a Giraffe. Gino's interests include candy-making, unicorns, and birdhouses.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "gino@example.com", - "phone": "+1-541-754-3010", - "id": "6" - }, - { - "name": "Isabella Iguana", - "profilePic": "/assets/img/speakers/iguana.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Isabella is an Iguana. Isabella's interests include crystals, architecture, and candle-making.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "isabella@example.com", - "phone": "+1-541-754-3010", - "id": "7" - }, - { - "name": "Karl Kitten", - "profilePic": "/assets/img/speakers/kitten.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Karl is a Kitten. Karl's interests include skiing, jewelry, and needlepoint.", - "title": "Developer Advocate", - "location": "Everywhere", - "email": "karl@example.com", - "phone": "+1-541-754-3010", - "id": "8" - }, - { - "name": "Lionel Lion", - "profilePic": "/assets/img/speakers/lion.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Lionel is a Lion. Lionel's interests include lizards and mathematics.", - "title": "Developer Advocate", - "location": "Everywhere", - "email": "lionel@example.com", - "phone": "+1-541-754-3010", - "id": "9" - }, - { - "name": "Molly Mouse", - "profilePic": "/assets/img/speakers/mouse.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Molly is a Mouse. Molly's interests include werewolves and magic.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "molly@example.com", - "phone": "+1-541-754-3010", - "id": "10" - }, - { - "name": "Paul Puppy", - "profilePic": "/assets/img/speakers/puppy.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Paul is a Puppy. Paul's interests include maps, whales, and dragons.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "paul@example.com", - "phone": "+1-541-754-3010", - "id": "11" - }, - { - "name": "Rachel Rabbit", - "profilePic": "/assets/img/speakers/rabbit.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Rachel is a Rabbit. Rachel's interests include clowns, skeletons, and yo-yos.", - "title": "Senior Software Engineer", - "location": "Everywhere", - "email": "rachel@example.com", - "phone": "+1-541-754-3010", - "id": "12" - }, - { - "name": "Ted Turtle", - "profilePic": "/assets/img/speakers/turtle.jpg", - "instagram": "ionicframework", - "twitter": "ionicframework", - "about": "Ted is a Turtle. Ted's interests include butterflies, skiing, and cupcakes.", - "title": "Software Engineer", - "location": "Everywhere", - "email": "ted@example.com", - "phone": "+1-541-754-3010", - "id": "13" - } - ], - - "map": [ - { - "name": "Monona Terrace Convention Center", - "lat": 43.071584, - "lng": -89.38012, - "center": true - }, - { - "name": "Ionic HQ", - "lat": 43.074395, - "lng": -89.381056 - }, - { - "name": "Afterparty - Brocach Irish Pub", - "lat": 43.07336, - "lng": -89.38335 - } - ], - - "tracks": [ - { - "name": "React", - "icon": "logo-react" - }, - { - "name": "Documentation", - "icon": "document" - }, - { - "name": "Food", - "icon": "restaurant" - }, - { - "name": "Ionic", - "icon": "logo-ionic" - }, - { - "name": "Tooling", - "icon": "hammer" - }, - { - "name": "Design", - "icon": "color-palette" - }, - { - "name": "Services", - "icon": "cog" - }, - { - "name": "Workshop", - "icon": "construct" - }, - { - "name": "Communication", - "icon": "call" - }, - { - "name": "Navigation", - "icon": "compass" - } - ] -} diff --git a/03_source/mobile_baseline.bak/public/assets/data/locations.json b/03_source/mobile_baseline.bak/public/assets/data/locations.json deleted file mode 100644 index 7743cc9..0000000 --- a/03_source/mobile_baseline.bak/public/assets/data/locations.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "id": 1, - "name": "Map Center", - "lat": 43.071584, - "lng": -89.380120 - }, { - "id": 2, - "name": "Monona Terrace Convention Center", - "lat": 43.071584, - "lng": -89.380120 - }, { - "id": 3, - "name": "Ionic HQ", - "lat": 43.074395, - "lng": -89.381056 - }, { - "id": 4, - "name": "Afterparty - Brocach Irish Pub", - "lat": 43.07336, - "lng": -89.38335 - } -] diff --git a/03_source/mobile_baseline.bak/public/assets/icon/favicon.png b/03_source/mobile_baseline.bak/public/assets/icon/favicon.png deleted file mode 100644 index 51888a7..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/icon/favicon.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/about/austin.jpg b/03_source/mobile_baseline.bak/public/assets/img/about/austin.jpg deleted file mode 100644 index b4eb329..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/about/austin.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/about/chicago.jpg b/03_source/mobile_baseline.bak/public/assets/img/about/chicago.jpg deleted file mode 100644 index b982b65..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/about/chicago.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/about/madison.jpg b/03_source/mobile_baseline.bak/public/assets/img/about/madison.jpg deleted file mode 100644 index c46fbf0..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/about/madison.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/about/seattle.jpg b/03_source/mobile_baseline.bak/public/assets/img/about/seattle.jpg deleted file mode 100644 index 4c5946a..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/about/seattle.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/appicon.png b/03_source/mobile_baseline.bak/public/assets/img/appicon.png deleted file mode 100644 index 3aa6ee2..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/appicon.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/appicon.svg b/03_source/mobile_baseline.bak/public/assets/img/appicon.svg deleted file mode 100644 index 3d2a03b..0000000 --- a/03_source/mobile_baseline.bak/public/assets/img/appicon.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-1.png b/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-1.png deleted file mode 100644 index 9233602..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-1.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-2.png b/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-2.png deleted file mode 100644 index 2fdce7d..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-2.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-3.png b/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-3.png deleted file mode 100644 index a304e88..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-3.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-4.png b/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-4.png deleted file mode 100644 index 2f263d6..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/ica-slidebox-img-4.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/ionic-logo-white.svg b/03_source/mobile_baseline.bak/public/assets/img/ionic-logo-white.svg deleted file mode 100644 index 7ebf0cd..0000000 --- a/03_source/mobile_baseline.bak/public/assets/img/ionic-logo-white.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/03_source/mobile_baseline.bak/public/assets/img/speaker-background.png b/03_source/mobile_baseline.bak/public/assets/img/speaker-background.png deleted file mode 100644 index 220634e..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speaker-background.png and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/bear.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/bear.jpg deleted file mode 100755 index a968db7..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/bear.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/cheetah.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/cheetah.jpg deleted file mode 100755 index f188a81..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/cheetah.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/duck.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/duck.jpg deleted file mode 100755 index b8b7c52..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/duck.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/eagle.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/eagle.jpg deleted file mode 100755 index ac839a5..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/eagle.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/elephant.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/elephant.jpg deleted file mode 100755 index 0727847..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/elephant.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/giraffe.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/giraffe.jpg deleted file mode 100755 index 30a854c..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/giraffe.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/iguana.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/iguana.jpg deleted file mode 100755 index 75d528f..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/iguana.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/kitten.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/kitten.jpg deleted file mode 100755 index 3cc1359..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/kitten.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/lion.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/lion.jpg deleted file mode 100755 index f5eb632..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/lion.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/mouse.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/mouse.jpg deleted file mode 100755 index ca30177..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/mouse.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/puppy.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/puppy.jpg deleted file mode 100755 index d635a8a..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/puppy.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/rabbit.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/rabbit.jpg deleted file mode 100755 index 475d62c..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/rabbit.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/img/speakers/turtle.jpg b/03_source/mobile_baseline.bak/public/assets/img/speakers/turtle.jpg deleted file mode 100755 index 60c3496..0000000 Binary files a/03_source/mobile_baseline.bak/public/assets/img/speakers/turtle.jpg and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/assets/shapes.svg b/03_source/mobile_baseline.bak/public/assets/shapes.svg deleted file mode 100644 index d370b4d..0000000 --- a/03_source/mobile_baseline.bak/public/assets/shapes.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/03_source/mobile_baseline.bak/public/favicon.ico b/03_source/mobile_baseline.bak/public/favicon.ico deleted file mode 100644 index a11777c..0000000 Binary files a/03_source/mobile_baseline.bak/public/favicon.ico and /dev/null differ diff --git a/03_source/mobile_baseline.bak/public/manifest.json b/03_source/mobile_baseline.bak/public/manifest.json deleted file mode 100644 index ee4307c..0000000 --- a/03_source/mobile_baseline.bak/public/manifest.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "short_name": "Ionic React Conf", - "name": "Ionic React Conf", - "icons": [ - { - "src": "assets/icon/favicon.png", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "assets/icon/icon.png", - "type": "image/png", - "sizes": "512x512", - "purpose": "maskable" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#ffffff", - "background_color": "#ffffff" -} diff --git a/03_source/mobile_baseline.bak/src/App.scss b/03_source/mobile_baseline.bak/src/App.scss deleted file mode 100644 index 13076f3..0000000 --- a/03_source/mobile_baseline.bak/src/App.scss +++ /dev/null @@ -1,6 +0,0 @@ -/* - * App Global CSS - * ---------------------------------------------------------------------------- - * Put style rules here that you want to apply globally. These styles are for - * the entire app and not just one component. - */ diff --git a/03_source/mobile_baseline.bak/src/App.test.tsx b/03_source/mobile_baseline.bak/src/App.test.tsx deleted file mode 100644 index 2ae5593..0000000 --- a/03_source/mobile_baseline.bak/src/App.test.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import App from './App'; -import { render } from '@testing-library/react'; - -it('renders without crashing', () => { - const { asFragment, container } = render(); - expect(asFragment()).toMatchSnapshot(); -}); diff --git a/03_source/mobile_baseline.bak/src/App.tsx b/03_source/mobile_baseline.bak/src/App.tsx deleted file mode 100644 index 6c94c03..0000000 --- a/03_source/mobile_baseline.bak/src/App.tsx +++ /dev/null @@ -1,155 +0,0 @@ -import React, { useEffect } from 'react'; -import { Route } from 'react-router-dom'; -import { - IonApp, - IonRouterOutlet, - IonSplitPane, - setupIonicReact, -} from '@ionic/react'; -import { IonReactRouter } from '@ionic/react-router'; - -import Menu from './components/Menu'; - -/* Core CSS required for Ionic components to work properly */ -import '@ionic/react/css/core.css'; - -/* Basic CSS for apps built with Ionic */ -import '@ionic/react/css/normalize.css'; -import '@ionic/react/css/structure.css'; -import '@ionic/react/css/typography.css'; - -/* Optional CSS utils that can be commented out */ -import '@ionic/react/css/padding.css'; -import '@ionic/react/css/float-elements.css'; -import '@ionic/react/css/text-alignment.css'; -import '@ionic/react/css/text-transformation.css'; -import '@ionic/react/css/flex-utils.css'; -import '@ionic/react/css/display.css'; - -/** - * Ionic Dark Mode - * ----------------------------------------------------- - * For more info, please see: - * https://ionicframework.com/docs/theming/dark-mode - */ - -// import '@ionic/react/css/palettes/dark.always.css'; -// import '@ionic/react/css/palettes/dark.system.css'; -import '@ionic/react/css/palettes/dark.class.css'; - -/* Theme variables */ -import './theme/variables.css'; - -/* Leaflet CSS */ -import 'leaflet/dist/leaflet.css'; - -/* Global styles */ -import './App.scss'; -import MainTabs from './pages/MainTabs'; -import { connect } from './data/connect'; -import { AppContextProvider } from './data/AppContext'; -import { loadConfData } from './data/sessions/sessions.actions'; -import { - setIsLoggedIn, - setUsername, - loadUserData, -} from './data/user/user.actions'; -import Account from './pages/Account'; -import Login from './pages/Login'; -import Signup from './pages/Signup'; -import Support from './pages/Support'; -import Tutorial from './pages/Tutorial'; -import HomeOrTutorial from './components/HomeOrTutorial'; -import { Schedule } from './models/Schedule'; -import RedirectToLogin from './components/RedirectToLogin'; - -setupIonicReact(); - -const App: React.FC = () => { - return ( - - - - ); -}; - -interface StateProps { - darkMode: boolean; - schedule: Schedule; -} - -interface DispatchProps { - loadConfData: typeof loadConfData; - loadUserData: typeof loadUserData; - setIsLoggedIn: typeof setIsLoggedIn; - setUsername: typeof setUsername; -} - -interface IonicAppProps extends StateProps, DispatchProps {} - -const IonicApp: React.FC = ({ - darkMode, - schedule, - setIsLoggedIn, - setUsername, - loadConfData, - loadUserData, -}) => { - useEffect(() => { - loadUserData(); - loadConfData(); - // eslint-disable-next-line - }, []); - - return schedule.groups.length === 0 ? ( -
- ) : ( - - - - - - {/* - We use IonRoute here to keep the tabs state intact, - which makes transitions between tabs and non tab pages smooth - */} - } /> - - - - - - { - return ( - - ); - }} - /> - - - - - - ); -}; - -export default App; - -const IonicAppConnected = connect<{}, StateProps, DispatchProps>({ - mapStateToProps: (state) => ({ - darkMode: state.user.darkMode, - schedule: state.data.schedule, - }), - mapDispatchToProps: { - loadConfData, - loadUserData, - setIsLoggedIn, - setUsername, - }, - component: IonicApp, -}); diff --git a/03_source/mobile_baseline.bak/src/__snapshots__/App.test.tsx.snap b/03_source/mobile_baseline.bak/src/__snapshots__/App.test.tsx.snap deleted file mode 100644 index 444f038..0000000 --- a/03_source/mobile_baseline.bak/src/__snapshots__/App.test.tsx.snap +++ /dev/null @@ -1,280 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`renders without crashing 1`] = ` - - - - - - - - Menu - - - - - - - Navigate - - - - - - Schedule - - - - - - - - Speakers - - - - - - - - Map - - - - - - - - About - - - - - - - Account - - - - - - Account - - - - - - - - Support - - - - - - - - Logout - - - - - - - Tutorial - - - - Show Tutorial - - - - - -
-
- -
- - - - - - - - All - - - Favorites - - - - - - - - - - - - - - - - - - - No Sessions Found - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - - - Schedule - - - - - - Speakers - - - - - - Map - - - - - - About - - - -
-
-
-
-
-`; diff --git a/03_source/mobile_baseline.bak/src/components/AboutPopover.tsx b/03_source/mobile_baseline.bak/src/components/AboutPopover.tsx deleted file mode 100644 index fbfcb10..0000000 --- a/03_source/mobile_baseline.bak/src/components/AboutPopover.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import { IonList, IonItem, IonLabel } from '@ionic/react'; - -interface AboutPopoverProps { - dismiss: () => void; -} - -const AboutPopover: React.FC = ({ dismiss }) => { - const close = (url: string) => { - window.open(url, '_blank'); - dismiss(); - }; - - return ( - - close('https://ionicframework.com/docs')}> - Learn Ionic - - close('https://ionicframework.com/docs/react')} - > - Documentation - - close('https://showcase.ionicframework.com')} - > - Showcase - - close('https://github.com/ionic-team/ionic-framework')} - > - GitHub Repo - - - Support - - - ); -}; - -export default AboutPopover; diff --git a/03_source/mobile_baseline.bak/src/components/HomeOrTutorial.tsx b/03_source/mobile_baseline.bak/src/components/HomeOrTutorial.tsx deleted file mode 100644 index 210097a..0000000 --- a/03_source/mobile_baseline.bak/src/components/HomeOrTutorial.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import { connect } from '../data/connect'; -import { Redirect } from 'react-router'; - -interface StateProps { - hasSeenTutorial: boolean; -} - -const HomeOrTutorial: React.FC = ({ hasSeenTutorial }) => { - return hasSeenTutorial ? ( - - ) : ( - - ); -}; - -export default connect<{}, StateProps, {}>({ - mapStateToProps: (state) => ({ - hasSeenTutorial: state.user.hasSeenTutorial, - }), - component: HomeOrTutorial, -}); diff --git a/03_source/mobile_baseline.bak/src/components/Menu.css b/03_source/mobile_baseline.bak/src/components/Menu.css deleted file mode 100644 index cee89be..0000000 --- a/03_source/mobile_baseline.bak/src/components/Menu.css +++ /dev/null @@ -1,89 +0,0 @@ -ion-menu ion-content { - --padding-top: 20px; - --padding-bottom: 20px; - - --background: var(--ion-item-background, var(--ion-background-color, #fff)); -} - -/* Remove background transitions for switching themes */ -ion-menu ion-item { - --transition: none; -} - -ion-item.selected { - --color: var(--ion-color-primary); -} - -/* - * Material Design Menu -*/ -ion-menu.md ion-list { - padding: 20px 0; -} - -ion-menu.md ion-list-header { - padding-left: 18px; - padding-right: 18px; - - text-transform: uppercase; - letter-spacing: 0.1em; - font-size: min(0.875rem, 32px); - font-weight: 450; -} - -ion-menu.md ion-item { - --padding-start: 18px; - - margin-right: 10px; - - border-radius: 0 50px 50px 0; - - font-weight: 500; -} - -ion-menu.md ion-item.selected { - --background: rgba(var(--ion-color-primary-rgb), 0.14); -} - -ion-menu.md ion-item.selected ion-icon { - color: var(--ion-color-primary); -} - -ion-menu.md ion-list-header, -ion-menu.md ion-item ion-icon { - color: var(--ion-color-step-650, #5f6368); -} - -ion-menu.md ion-list:not(:last-of-type) { - border-bottom: 1px solid var(--ion-color-step-150, #d7d8da); -} - - -/* - * iOS Menu -*/ -ion-menu.ios ion-list-header { - padding-left: 16px; - padding-right: 16px; - - margin-bottom: 8px; - font-size: clamp(22px, 1.375rem, 40px); -} - -ion-menu.ios ion-list { - padding: 20px 0 0; -} - -ion-menu.ios ion-item { - --padding-start: 16px; - --min-height: 50px; -} - -ion-menu.ios ion-item ion-icon { - font-size: 24px; - color: #73849a; -} - -ion-menu.ios ion-item.selected ion-icon { - color: var(--ion-color-primary); -} diff --git a/03_source/mobile_baseline.bak/src/components/Menu.tsx b/03_source/mobile_baseline.bak/src/components/Menu.tsx deleted file mode 100644 index 6d58d83..0000000 --- a/03_source/mobile_baseline.bak/src/components/Menu.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import React from 'react'; -import { RouteComponentProps, withRouter, useLocation } from 'react-router'; - -import { - IonContent, - IonIcon, - IonItem, - IonLabel, - IonList, - IonListHeader, - IonMenu, - IonMenuToggle, - IonToggle, -} from '@ionic/react'; -import { - calendarOutline, - hammer, - moonOutline, - help, - informationCircleOutline, - logIn, - logOut, - mapOutline, - peopleOutline, - person, - personAdd, -} from 'ionicons/icons'; - -import { connect } from '../data/connect'; -import { setDarkMode } from '../data/user/user.actions'; - -import './Menu.css'; - -const routes = { - appPages: [ - { title: 'Schedule', path: '/tabs/schedule', icon: calendarOutline }, - { title: 'Speakers', path: '/tabs/speakers', icon: peopleOutline }, - { title: 'Map', path: '/tabs/map', icon: mapOutline }, - { title: 'About', path: '/tabs/about', icon: informationCircleOutline }, - ], - loggedInPages: [ - { title: 'Account', path: '/account', icon: person }, - { title: 'Support', path: '/support', icon: help }, - { title: 'Logout', path: '/logout', icon: logOut }, - ], - loggedOutPages: [ - { title: 'Login', path: '/login', icon: logIn }, - { title: 'Support', path: '/support', icon: help }, - { title: 'Signup', path: '/signup', icon: personAdd }, - ], -}; - -interface Pages { - title: string; - path: string; - icon: string; - routerDirection?: string; -} -interface StateProps { - darkMode: boolean; - isAuthenticated: boolean; - menuEnabled: boolean; -} - -interface DispatchProps { - setDarkMode: typeof setDarkMode; -} - -interface MenuProps extends RouteComponentProps, StateProps, DispatchProps {} - -const Menu: React.FC = ({ - darkMode, - history, - isAuthenticated, - setDarkMode, - menuEnabled, -}) => { - const location = useLocation(); - - function renderlistItems(list: Pages[]) { - return list - .filter((route) => !!route.path) - .map((p) => ( - - - - {p.title} - - - )); - } - - return ( - - - - Conference - {renderlistItems(routes.appPages)} - - - Account - {isAuthenticated - ? renderlistItems(routes.loggedInPages) - : renderlistItems(routes.loggedOutPages)} - - - setDarkMode(!darkMode)} - > - Dark Mode - - - - - Tutorial - { - history.push('/tutorial'); - }} - > - - Show Tutorial - - - - - ); -}; - -export default connect<{}, StateProps, {}>({ - mapStateToProps: (state) => ({ - darkMode: state.user.darkMode, - isAuthenticated: state.user.isLoggedin, - menuEnabled: state.data.menuEnabled, - }), - mapDispatchToProps: { - setDarkMode, - }, - component: withRouter(Menu), -}); diff --git a/03_source/mobile_baseline.bak/src/components/RedirectToLogin.tsx b/03_source/mobile_baseline.bak/src/components/RedirectToLogin.tsx deleted file mode 100644 index 7eda327..0000000 --- a/03_source/mobile_baseline.bak/src/components/RedirectToLogin.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React, { useEffect, useContext } from 'react'; -import { IonRouterContext } from '@ionic/react'; - -interface RedirectToLoginProps { - setIsLoggedIn: Function; - setUsername: Function; -} - -const RedirectToLogin: React.FC = ({ - setIsLoggedIn, - setUsername, -}) => { - const ionRouterContext = useContext(IonRouterContext); - useEffect(() => { - setIsLoggedIn(false); - setUsername(undefined); - ionRouterContext.push('/tabs/schedule'); - }, [setIsLoggedIn, setUsername]); - return null; -}; - -export default RedirectToLogin; diff --git a/03_source/mobile_baseline.bak/src/components/SessionList.tsx b/03_source/mobile_baseline.bak/src/components/SessionList.tsx deleted file mode 100644 index f61f219..0000000 --- a/03_source/mobile_baseline.bak/src/components/SessionList.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { - IonItemDivider, - IonItemGroup, - IonLabel, - IonList, - IonListHeader, - IonAlert, - AlertButton, -} from '@ionic/react'; -import React, { useState, useCallback, useRef, useEffect } from 'react'; -import { Schedule, Session } from '../models/Schedule'; -import SessionListItem from './SessionListItem'; -import { connect } from '../data/connect'; -import { addFavorite, removeFavorite } from '../data/sessions/sessions.actions'; - -interface OwnProps { - schedule: Schedule; - listType: 'all' | 'favorites'; - hide: boolean; -} - -interface StateProps { - favoriteSessions: number[]; -} - -interface DispatchProps { - addFavorite: typeof addFavorite; - removeFavorite: typeof removeFavorite; -} - -interface SessionListProps extends OwnProps, StateProps, DispatchProps {} - -const SessionList: React.FC = ({ - addFavorite, - removeFavorite, - favoriteSessions, - hide, - schedule, - listType, -}) => { - const scheduleListRef = useRef(null); - const [showAlert, setShowAlert] = useState(false); - const [alertHeader, setAlertHeader] = useState(''); - const [alertMessage, setAlertMessage] = useState(''); - const [alertButtons, setAlertButtons] = useState<(AlertButton | string)[]>( - [] - ); - - const handleShowAlert = useCallback( - (header: string, message: string, buttons: AlertButton[]) => { - setAlertHeader(header); - setAlertMessage(message); - setAlertButtons(buttons); - setShowAlert(true); - }, - [] - ); - - useEffect(() => { - if (scheduleListRef.current) { - scheduleListRef.current.closeSlidingItems(); - } - }, [hide]); - - if (schedule.groups.length === 0 && !hide) { - return ( - - No Sessions Found - - ); - } - - return ( - <> - - {schedule.groups.map((group, index: number) => ( - - - {group.time} - - {group.sessions.map((session: Session, sessionIndex: number) => ( - -1} - onAddFavorite={addFavorite} - onRemoveFavorite={removeFavorite} - key={`group-${index}-${sessionIndex}`} - session={session} - listType={listType} - /> - ))} - - ))} - - setShowAlert(false)} - > - - ); -}; - -export default connect({ - mapStateToProps: (state) => ({ - favoriteSessions: state.data.favorites, - }), - mapDispatchToProps: { - addFavorite, - removeFavorite, - }, - component: SessionList, -}); diff --git a/03_source/mobile_baseline.bak/src/components/SessionListFilter.css b/03_source/mobile_baseline.bak/src/components/SessionListFilter.css deleted file mode 100644 index 4516c7a..0000000 --- a/03_source/mobile_baseline.bak/src/components/SessionListFilter.css +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Material Design - */ - -.md .session-list-filter ion-toolbar ion-button { - text-transform: capitalize; - letter-spacing: 0; -} - -.md .session-list-filter ion-checkbox { - --checkbox-background-checked: transparent; - --border-color: transparent; - --border-color-checked: transparent; - --checkmark-color: var(--ion-color-primary); -} - -.md .session-list-filter ion-list { - background: inherit; -} - -/* - * iOS - */ - -.ios .session-list-filter ion-list-header { - margin-top: 10px; -} - -.ios .session-list-filter ion-checkbox { - color: var(--ion-color-primary); -} diff --git a/03_source/mobile_baseline.bak/src/components/SessionListFilter.tsx b/03_source/mobile_baseline.bak/src/components/SessionListFilter.tsx deleted file mode 100644 index 1d80cbc..0000000 --- a/03_source/mobile_baseline.bak/src/components/SessionListFilter.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import React from 'react'; - -import { getMode } from '@ionic/core'; -import { - IonHeader, - IonToolbar, - IonButtons, - IonButton, - IonTitle, - IonContent, - IonList, - IonListHeader, - IonItem, - IonLabel, - IonCheckbox, - IonFooter, - IonIcon, -} from '@ionic/react'; -import { - logoReact, - call, - document, - logoIonic, - hammer, - restaurant, - cog, - colorPalette, - construct, - compass, -} from 'ionicons/icons'; - -import './SessionListFilter.css'; - -import { connect } from '../data/connect'; -import { updateFilteredTracks } from '../data/sessions/sessions.actions'; - -interface OwnProps { - onDismissModal: () => void; -} - -interface StateProps { - allTracks: string[]; - filteredTracks: string[]; -} - -interface DispatchProps { - updateFilteredTracks: typeof updateFilteredTracks; -} - -type SessionListFilterProps = OwnProps & StateProps & DispatchProps; - -const SessionListFilter: React.FC = ({ - allTracks, - filteredTracks, - onDismissModal, - updateFilteredTracks, -}) => { - const ios = getMode() === 'ios'; - - const toggleTrackFilter = (track: string) => { - if (filteredTracks.indexOf(track) > -1) { - updateFilteredTracks(filteredTracks.filter((x) => x !== track)); - } else { - updateFilteredTracks([...filteredTracks, track]); - } - }; - - const handleDeselectAll = () => { - updateFilteredTracks([]); - }; - - const handleSelectAll = () => { - updateFilteredTracks([...allTracks]); - }; - - const iconMap: { [key: string]: any } = { - React: logoReact, - Documentation: document, - Food: restaurant, - Ionic: logoIonic, - Tooling: hammer, - Design: colorPalette, - Services: cog, - Workshop: construct, - Navigation: compass, - Communication: call, - }; - - return ( - <> - - - - {ios && Cancel} - {!ios && Reset} - - - Filter Sessions - - - - Done - - - - - - - - Tracks - - {allTracks.map((track) => ( - - {ios && ( - - ))} - - - - {ios && ( - - - - Deselect All - - - Select All - - - - )} - - ); -}; - -export default connect({ - mapStateToProps: (state) => ({ - allTracks: state.data.allTracks, - filteredTracks: state.data.filteredTracks, - }), - mapDispatchToProps: { - updateFilteredTracks, - }, - component: SessionListFilter, -}); diff --git a/03_source/mobile_baseline.bak/src/components/SessionListItem.tsx b/03_source/mobile_baseline.bak/src/components/SessionListItem.tsx deleted file mode 100644 index 911acbc..0000000 --- a/03_source/mobile_baseline.bak/src/components/SessionListItem.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import React, { useRef } from 'react'; -import { - IonItemSliding, - IonItem, - IonLabel, - IonItemOptions, - IonItemOption, - AlertButton, - useIonToast, -} from '@ionic/react'; -import { Session } from '../models/Schedule'; - -interface SessionListItemProps { - session: Session; - listType: 'all' | 'favorites'; - onAddFavorite: (id: number) => void; - onRemoveFavorite: (id: number) => void; - onShowAlert: ( - header: string, - message: string, - buttons: AlertButton[] - ) => void; - isFavorite: boolean; -} - -const SessionListItem: React.FC = ({ - isFavorite, - onAddFavorite, - onRemoveFavorite, - onShowAlert, - session, - listType, -}) => { - const [presentToast] = useIonToast(); - const ionItemSlidingRef = useRef(null); - - const dismissAlert = () => { - ionItemSlidingRef.current && ionItemSlidingRef.current.close(); - }; - - const removeFavoriteSession = (title: string) => { - onAddFavorite(session.id); - onShowAlert( - title, - 'Would you like to remove this session from your favorites?', - [ - { - text: 'Cancel', - handler: dismissAlert, - }, - { - text: 'Remove', - handler: () => { - onRemoveFavorite(session.id); - dismissAlert(); - }, - }, - ] - ); - }; - - const addFavoriteSession = async () => { - if (isFavorite) { - // Prompt to remove favorite - removeFavoriteSession('Favorite already added'); - } else { - // Add as a favorite - onAddFavorite(session.id); - - // Close the open item - ionItemSlidingRef.current && ionItemSlidingRef.current.close(); - - // Create a toast - presentToast({ - message: `${session.name} was successfully added as a favorite.`, - duration: 3000, - buttons: [ - { - text: 'Close', - role: 'cancel', - }, - ], - }); - } - }; - - return ( - - - -

{session.name}

-

- {session.timeStart} —  - {session.timeEnd}:  - {session.location} -

-
-
- - {listType === 'favorites' ? ( - removeFavoriteSession('Remove Favorite')} - > - Remove - - ) : ( - - Favorite - - )} - -
- ); -}; - -export default React.memo(SessionListItem); diff --git a/03_source/mobile_baseline.bak/src/components/ShareSocialFab.tsx b/03_source/mobile_baseline.bak/src/components/ShareSocialFab.tsx deleted file mode 100644 index fb80766..0000000 --- a/03_source/mobile_baseline.bak/src/components/ShareSocialFab.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { - IonLoading, - IonFab, - IonFabButton, - IonIcon, - IonFabList, -} from '@ionic/react'; -import { - shareSocial, - logoVimeo, - logoInstagram, - logoTwitter, - logoFacebook, -} from 'ionicons/icons'; -import React, { useState } from 'react'; - -const ShareSocialFab: React.FC = () => { - const [loadingMessage, setLoadingMessage] = useState(''); - const [showLoading, setShowLoading] = useState(false); - - const openSocial = (network: string) => { - setLoadingMessage(`Posting to ${network}`); - setShowLoading(true); - }; - - return ( - <> - setShowLoading(false)} - /> - - - - - - openSocial('Vimeo')}> - - - openSocial('Instagram')} - > - - - openSocial('Twitter')}> - - - openSocial('Facebook')}> - - - - - - ); -}; - -export default ShareSocialFab; diff --git a/03_source/mobile_baseline.bak/src/components/SpeakerItem.tsx b/03_source/mobile_baseline.bak/src/components/SpeakerItem.tsx deleted file mode 100644 index 242a9df..0000000 --- a/03_source/mobile_baseline.bak/src/components/SpeakerItem.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React from 'react'; -import { Session } from '../models/Schedule'; -import { Speaker } from '../models/Speaker'; -import { - IonCard, - IonCardHeader, - IonItem, - IonLabel, - IonAvatar, - IonCardContent, - IonList, -} from '@ionic/react'; - -interface SpeakerItemProps { - speaker: Speaker; - sessions: Session[]; -} - -const SpeakerItem: React.FC = ({ speaker, sessions }) => { - return ( - <> - - - - - Speaker profile pic - - -

{speaker.name}

-

{speaker.title}

-
-
-
- - - - {sessions.map((session) => ( - - -

{session.name}

-
-
- ))} - - -

About {speaker.name}

-
-
-
-
-
- - ); -}; - -export default SpeakerItem; diff --git a/03_source/mobile_baseline.bak/src/data/AppContext.tsx b/03_source/mobile_baseline.bak/src/data/AppContext.tsx deleted file mode 100644 index 45777d5..0000000 --- a/03_source/mobile_baseline.bak/src/data/AppContext.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { createContext, PropsWithChildren, useReducer } from 'react'; -import { initialState, AppState, reducers } from './state'; - -export interface AppContextState { - state: AppState; - dispatch: React.Dispatch; -} - -export const AppContext = createContext({ - state: initialState, - dispatch: () => undefined, -}); - -export const AppContextProvider: React.FC = ({ - children, -}) => { - const [store, dispatch] = useReducer(reducers, initialState); - - return ( - - {children} - - ); -}; diff --git a/03_source/mobile_baseline.bak/src/data/combineReducers.ts b/03_source/mobile_baseline.bak/src/data/combineReducers.ts deleted file mode 100644 index 44769b0..0000000 --- a/03_source/mobile_baseline.bak/src/data/combineReducers.ts +++ /dev/null @@ -1,18 +0,0 @@ -interface R { - [key: string]: (...args: any) => any; -} - -export function combineReducers(reducers: R) { - type keys = keyof typeof reducers; - type returnType = { [K in keys]: ReturnType<(typeof reducers)[K]> }; - const combinedReducer = (state: any, action: any) => { - const newState: returnType = {} as any; - const keys = Object.keys(reducers); - keys.forEach((key) => { - const result = reducers[key](state[key], action); - newState[key as keys] = result || state[key]; - }); - return newState; - }; - return combinedReducer; -} diff --git a/03_source/mobile_baseline.bak/src/data/connect.tsx b/03_source/mobile_baseline.bak/src/data/connect.tsx deleted file mode 100644 index a4ae695..0000000 --- a/03_source/mobile_baseline.bak/src/data/connect.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import React, { useContext, useMemo } from 'react'; -import { AppContext } from './AppContext'; -import { DispatchObject } from '../util/types'; -import { AppState } from './state'; - -interface ConnectParams { - mapStateToProps?: (state: AppState, props: TOwnProps) => TStateProps; - mapDispatchToProps?: TDispatchProps; - component: React.ComponentType; -} - -export function connect< - TOwnProps = any, - TStateProps = any, - TDispatchProps = any ->({ - mapStateToProps = () => ({} as TStateProps), - mapDispatchToProps = {} as TDispatchProps, - component, -}: ConnectParams< - TOwnProps, - TStateProps, - TDispatchProps ->): React.FunctionComponent { - const Connect = (ownProps: TOwnProps) => { - const context = useContext(AppContext); - - const dispatchFuncs = useMemo(() => { - const dispatchFuncs: { [key: string]: any } = {}; - if (mapDispatchToProps) { - Object.keys(mapDispatchToProps).forEach((key) => { - const oldFunc = (mapDispatchToProps as any)[key]; - const newFunc = (...args: any) => { - const dispatchFunc = oldFunc(...args); - if (typeof dispatchFunc === 'object') { - context.dispatch(dispatchFunc); - } else { - const result = dispatchFunc(context.dispatch); - if (typeof result === 'object' && result.then) { - result.then((dispatchObject?: DispatchObject) => { - if (dispatchObject && dispatchObject.type) { - context.dispatch(dispatchObject); - } - }); - } - } - }; - dispatchFuncs[key] = newFunc; - }); - } - return dispatchFuncs; - // eslint-disable-next-line - }, [mapDispatchToProps]); - - const props = useMemo(() => { - return Object.assign( - {}, - ownProps, - mapStateToProps(context.state, ownProps), - dispatchFuncs - ); - // eslint-disable-next-line - }, [ownProps, context.state]); - - return React.createElement(component, props); - }; - return React.memo(Connect as any); -} diff --git a/03_source/mobile_baseline.bak/src/data/dataApi.ts b/03_source/mobile_baseline.bak/src/data/dataApi.ts deleted file mode 100644 index f489461..0000000 --- a/03_source/mobile_baseline.bak/src/data/dataApi.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Preferences as Storage } from '@capacitor/preferences'; -import { Schedule, Session } from '../models/Schedule'; -import { Speaker } from '../models/Speaker'; -import { Location } from '../models/Location'; - -const dataUrl = '/assets/data/data.json'; -const locationsUrl = '/assets/data/locations.json'; - -const HAS_LOGGED_IN = 'hasLoggedIn'; -const HAS_SEEN_TUTORIAL = 'hasSeenTutorial'; -const USERNAME = 'username'; - -export const getConfData = async () => { - const response = await Promise.all([fetch(dataUrl), fetch(locationsUrl)]); - const responseData = await response[0].json(); - const schedule = responseData.schedule[0] as Schedule; - const sessions = parseSessions(schedule); - const speakers = responseData.speakers as Speaker[]; - const locations = (await response[1].json()) as Location[]; - const allTracks = sessions - .reduce((all, session) => all.concat(session.tracks), [] as string[]) - .filter((trackName, index, array) => array.indexOf(trackName) === index) - .sort(); - - const data = { - schedule, - sessions, - locations, - speakers, - allTracks, - filteredTracks: [...allTracks], - }; - return data; -}; - -export const getUserData = async () => { - const response = await Promise.all([ - Storage.get({ key: HAS_LOGGED_IN }), - Storage.get({ key: HAS_SEEN_TUTORIAL }), - Storage.get({ key: USERNAME }), - ]); - const isLoggedin = (await response[0].value) === 'true'; - const hasSeenTutorial = (await response[1].value) === 'true'; - const username = (await response[2].value) || undefined; - const data = { - isLoggedin, - hasSeenTutorial, - username, - }; - return data; -}; - -export const setIsLoggedInData = async (isLoggedIn: boolean) => { - await Storage.set({ key: HAS_LOGGED_IN, value: JSON.stringify(isLoggedIn) }); -}; - -export const setHasSeenTutorialData = async (hasSeenTutorial: boolean) => { - await Storage.set({ - key: HAS_SEEN_TUTORIAL, - value: JSON.stringify(hasSeenTutorial), - }); -}; - -export const setUsernameData = async (username?: string) => { - if (!username) { - await Storage.remove({ key: USERNAME }); - } else { - await Storage.set({ key: USERNAME, value: username }); - } -}; - -function parseSessions(schedule: Schedule) { - const sessions: Session[] = []; - schedule.groups.forEach((g) => { - g.sessions.forEach((s) => sessions.push(s)); - }); - return sessions; -} diff --git a/03_source/mobile_baseline.bak/src/data/locations/locations.actions.ts b/03_source/mobile_baseline.bak/src/data/locations/locations.actions.ts deleted file mode 100644 index c2f4234..0000000 --- a/03_source/mobile_baseline.bak/src/data/locations/locations.actions.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { DispatchObject } from '../../util/types'; -import { Location } from '../../models/Location'; - -export const SET_LOCATIONS = 'SET_LOCATIONS'; - -export const setLocations = (locations: Location[]): DispatchObject => ({ - type: SET_LOCATIONS, - payload: locations, -}); - -export const loadLocations = - () => async (dispatch: (action: DispatchObject) => void) => { - try { - const response = await fetch('/assets/data/locations.json'); - const locations = await response.json(); - dispatch(setLocations(locations)); - } catch (error) { - console.error('Error loading locations:', error); - // Set default locations if data cannot be loaded - dispatch( - setLocations([ - { - id: 1, - name: 'Monona Terrace Convention Center', - lat: 43.071584, - lng: -89.38012, - center: true, - }, - ]) - ); - } - }; diff --git a/03_source/mobile_baseline.bak/src/data/locations/locations.reducer.ts b/03_source/mobile_baseline.bak/src/data/locations/locations.reducer.ts deleted file mode 100644 index 87cbf78..0000000 --- a/03_source/mobile_baseline.bak/src/data/locations/locations.reducer.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { LocationState, initialState } from '../../models/Location'; -import { SET_LOCATIONS } from './locations.actions'; - -export const locationsReducer = ( - state: LocationState = initialState, - action: { type: string; payload: any } -): LocationState => { - switch (action.type) { - case SET_LOCATIONS: - return { - ...state, - locations: action.payload, - }; - default: - return state; - } -}; diff --git a/03_source/mobile_baseline.bak/src/data/selectors.ts b/03_source/mobile_baseline.bak/src/data/selectors.ts deleted file mode 100644 index 9ab8f26..0000000 --- a/03_source/mobile_baseline.bak/src/data/selectors.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { createSelector } from 'reselect'; -import { Schedule, Session, ScheduleGroup } from '../models/Schedule'; -import { Speaker } from '../models/Speaker'; -import { Location } from '../models/Location'; -import { AppState } from './state'; - -const getSchedule = (state: AppState) => { - return state.data.schedule; -}; -export const getSpeakers = (state: AppState) => state.data.speakers; -const getSessions = (state: AppState) => state.data.sessions; -const getFilteredTracks = (state: AppState) => state.data.filteredTracks; -const getFavoriteIds = (state: AppState) => state.data.favorites; -const getSearchText = (state: AppState) => state.data.searchText; - -export const getFilteredSchedule = createSelector( - getSchedule, - getFilteredTracks, - (schedule, filteredTracks) => { - const groups: ScheduleGroup[] = []; - - // Helper function to convert 12-hour time to 24-hour time for proper sorting - const convertTo24Hour = (timeStr: string) => { - const [time, period] = timeStr.toLowerCase().split(' '); - let [hours, minutes] = time.split(':').map(Number); - - if (period === 'pm' && hours !== 12) { - hours += 12; - } else if (period === 'am' && hours === 12) { - hours = 0; - } - - return `${hours.toString().padStart(2, '0')}:${minutes || '00'}`; - }; - - // Sort the groups by time - const sortedGroups = [...schedule.groups].sort((a, b) => { - const timeA = convertTo24Hour(a.time); - const timeB = convertTo24Hour(b.time); - return timeA.localeCompare(timeB); - }); - - sortedGroups.forEach((group: ScheduleGroup) => { - const sessions: Session[] = []; - group.sessions.forEach((session) => { - session.tracks.forEach((track) => { - if (filteredTracks.indexOf(track) > -1) { - sessions.push(session); - } - }); - }); - - if (sessions.length) { - // Sort sessions within each group by start time - const sortedSessions = sessions.sort((a, b) => { - const timeA = convertTo24Hour(a.timeStart); - const timeB = convertTo24Hour(b.timeStart); - return timeA.localeCompare(timeB); - }); - - const groupToAdd: ScheduleGroup = { - time: group.time, - sessions: sortedSessions, - }; - groups.push(groupToAdd); - } - }); - - return { - date: schedule.date, - groups, - } as Schedule; - } -); - -export const getSearchedSchedule = createSelector( - getFilteredSchedule, - getSearchText, - (schedule, searchText) => { - if (!searchText) { - return schedule; - } - const groups: ScheduleGroup[] = []; - schedule.groups.forEach((group) => { - const sessions = group.sessions.filter( - (s) => s.name.toLowerCase().indexOf(searchText.toLowerCase()) > -1 - ); - if (sessions.length) { - const groupToAdd: ScheduleGroup = { - time: group.time, - sessions, - }; - groups.push(groupToAdd); - } - }); - return { - date: schedule.date, - groups, - } as Schedule; - } -); - -export const getScheduleList = createSelector( - getSearchedSchedule, - (schedule) => schedule -); - -export const getGroupedFavorites = createSelector( - getScheduleList, - getFavoriteIds, - (schedule, favoriteIds) => { - const groups: ScheduleGroup[] = []; - schedule.groups.forEach((group) => { - const sessions = group.sessions.filter( - (s) => favoriteIds.indexOf(s.id) > -1 - ); - if (sessions.length) { - const groupToAdd: ScheduleGroup = { - time: group.time, - sessions, - }; - groups.push(groupToAdd); - } - }); - return { - date: schedule.date, - groups, - } as Schedule; - } -); - -const getIdParam = (_state: AppState, props: any) => { - return props.match.params['id']; -}; - -export const getSession = createSelector( - getSessions, - getIdParam, - (sessions, id) => { - return sessions.find((s: Session) => s.id === id); - } -); - -export const getSpeaker = createSelector( - getSpeakers, - getIdParam, - (speakers, id) => speakers.find((x: Speaker) => x.id === id) -); - -export const getSpeakerSessions = createSelector(getSessions, (sessions) => { - const speakerSessions: { [key: string]: Session[] } = {}; - - sessions.forEach((session: Session) => { - session.speakerNames && - session.speakerNames.forEach((name) => { - if (speakerSessions[name]) { - speakerSessions[name].push(session); - } else { - speakerSessions[name] = [session]; - } - }); - }); - return speakerSessions; -}); - -export const mapCenter = (state: AppState) => { - const item = state.data.locations.find( - (l: Location) => l.id === state.data.mapCenterId - ); - if (item == null) { - return { - id: 1, - name: 'Map Center', - lat: 43.071584, - lng: -89.38012, - }; - } - return item; -}; diff --git a/03_source/mobile_baseline.bak/src/data/sessions/conf.state.ts b/03_source/mobile_baseline.bak/src/data/sessions/conf.state.ts deleted file mode 100644 index 1217baf..0000000 --- a/03_source/mobile_baseline.bak/src/data/sessions/conf.state.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Location } from '../../models/Location'; -import { Speaker } from '../../models/Speaker'; -import { Schedule, Session } from '../../models/Schedule'; -export interface ConfState { - schedule: Schedule; - sessions: Session[]; - speakers: Speaker[]; - favorites: number[]; - locations: Location[]; - filteredTracks: string[]; - searchText?: string; - mapCenterId?: number; - loading?: boolean; - allTracks: string[]; - menuEnabled: boolean; -} diff --git a/03_source/mobile_baseline.bak/src/data/sessions/sessions.actions.ts b/03_source/mobile_baseline.bak/src/data/sessions/sessions.actions.ts deleted file mode 100644 index daea818..0000000 --- a/03_source/mobile_baseline.bak/src/data/sessions/sessions.actions.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { getConfData } from '../dataApi'; -import { ActionType } from '../../util/types'; -import { ConfState } from './conf.state'; - -export const loadConfData = () => async (dispatch: React.Dispatch) => { - dispatch(setLoading(true)); - const data = await getConfData(); - dispatch(setData(data)); - dispatch(setLoading(false)); -}; - -export const setLoading = (isLoading: boolean) => - ({ - type: 'set-conf-loading', - isLoading, - } as const); - -export const setData = (data: Partial) => - ({ - type: 'set-conf-data', - data, - } as const); - -export const addFavorite = (sessionId: number) => - ({ - type: 'add-favorite', - sessionId, - } as const); - -export const removeFavorite = (sessionId: number) => - ({ - type: 'remove-favorite', - sessionId, - } as const); - -export const updateFilteredTracks = (filteredTracks: string[]) => - ({ - type: 'update-filtered-tracks', - filteredTracks, - } as const); - -export const setSearchText = (searchText?: string) => - ({ - type: 'set-search-text', - searchText, - } as const); - -export const setMenuEnabled = (menuEnabled: boolean) => - ({ - type: 'set-menu-enabled', - menuEnabled, - } as const); - -export type SessionsActions = - | ActionType - | ActionType - | ActionType - | ActionType - | ActionType - | ActionType - | ActionType; diff --git a/03_source/mobile_baseline.bak/src/data/sessions/sessions.reducer.ts b/03_source/mobile_baseline.bak/src/data/sessions/sessions.reducer.ts deleted file mode 100644 index 7fa7c1a..0000000 --- a/03_source/mobile_baseline.bak/src/data/sessions/sessions.reducer.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { SessionsActions } from './sessions.actions'; -import { ConfState } from './conf.state'; - -export const sessionsReducer = ( - state: ConfState, - action: SessionsActions -): ConfState => { - switch (action.type) { - case 'set-conf-loading': { - return { ...state, loading: action.isLoading }; - } - case 'set-conf-data': { - return { ...state, ...action.data }; - } - case 'add-favorite': { - return { ...state, favorites: [...state.favorites, action.sessionId] }; - } - case 'remove-favorite': { - return { - ...state, - favorites: [...state.favorites.filter((x) => x !== action.sessionId)], - }; - } - case 'update-filtered-tracks': { - return { ...state, filteredTracks: action.filteredTracks }; - } - case 'set-search-text': { - return { ...state, searchText: action.searchText }; - } - case 'set-menu-enabled': { - return { ...state, menuEnabled: action.menuEnabled }; - } - } -}; diff --git a/03_source/mobile_baseline.bak/src/data/state.ts b/03_source/mobile_baseline.bak/src/data/state.ts deleted file mode 100644 index fe9c7a7..0000000 --- a/03_source/mobile_baseline.bak/src/data/state.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { combineReducers } from './combineReducers'; -import { sessionsReducer } from './sessions/sessions.reducer'; -import { userReducer } from './user/user.reducer'; -import { locationsReducer } from './locations/locations.reducer'; - -export const initialState: AppState = { - data: { - schedule: { groups: [] } as any, - sessions: [], - speakers: [], - favorites: [], - locations: [], - allTracks: [], - filteredTracks: [], - mapCenterId: 0, - loading: false, - menuEnabled: true, - }, - user: { - hasSeenTutorial: false, - darkMode: false, - isLoggedin: false, - loading: false, - }, - locations: { - locations: [], - }, -}; - -export const reducers = combineReducers({ - data: sessionsReducer, - user: userReducer, - locations: locationsReducer, -}); - -export type AppState = ReturnType; diff --git a/03_source/mobile_baseline.bak/src/data/user/user.actions.ts b/03_source/mobile_baseline.bak/src/data/user/user.actions.ts deleted file mode 100644 index adeb56d..0000000 --- a/03_source/mobile_baseline.bak/src/data/user/user.actions.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - getUserData, - setIsLoggedInData, - setUsernameData, - setHasSeenTutorialData, -} from '../dataApi'; -import { ActionType } from '../../util/types'; -import { UserState } from './user.state'; - -export const loadUserData = () => async (dispatch: React.Dispatch) => { - dispatch(setLoading(true)); - const data = await getUserData(); - dispatch(setData(data)); - dispatch(setLoading(false)); -}; - -export const setLoading = (isLoading: boolean) => - ({ - type: 'set-user-loading', - isLoading, - } as const); - -export const setData = (data: Partial) => - ({ - type: 'set-user-data', - data, - } as const); - -export const logoutUser = () => async (dispatch: React.Dispatch) => { - await setIsLoggedInData(false); - dispatch(setUsername()); -}; - -export const setIsLoggedIn = - (loggedIn: boolean) => async (dispatch: React.Dispatch) => { - await setIsLoggedInData(loggedIn); - return { - type: 'set-is-loggedin', - loggedIn, - } as const; - }; - -export const setUsername = - (username?: string) => async (dispatch: React.Dispatch) => { - await setUsernameData(username); - return { - type: 'set-username', - username, - } as const; - }; - -export const setHasSeenTutorial = - (hasSeenTutorial: boolean) => async (dispatch: React.Dispatch) => { - await setHasSeenTutorialData(hasSeenTutorial); - return { - type: 'set-has-seen-tutorial', - hasSeenTutorial, - } as const; - }; - -export const setDarkMode = (darkMode: boolean) => - ({ - type: 'set-dark-mode', - darkMode, - } as const); - -export type UserActions = - | ActionType - | ActionType - | ActionType - | ActionType - | ActionType - | ActionType; diff --git a/03_source/mobile_baseline.bak/src/data/user/user.reducer.ts b/03_source/mobile_baseline.bak/src/data/user/user.reducer.ts deleted file mode 100644 index 9f0247d..0000000 --- a/03_source/mobile_baseline.bak/src/data/user/user.reducer.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { UserActions } from './user.actions'; -import { UserState } from './user.state'; - -export function userReducer(state: UserState, action: UserActions): UserState { - switch (action.type) { - case 'set-user-loading': - return { ...state, loading: action.isLoading }; - case 'set-user-data': - return { ...state, ...action.data }; - case 'set-username': - return { ...state, username: action.username }; - case 'set-has-seen-tutorial': - return { ...state, hasSeenTutorial: action.hasSeenTutorial }; - case 'set-dark-mode': - return { ...state, darkMode: action.darkMode }; - case 'set-is-loggedin': - return { ...state, isLoggedin: action.loggedIn }; - } -} diff --git a/03_source/mobile_baseline.bak/src/data/user/user.state.ts b/03_source/mobile_baseline.bak/src/data/user/user.state.ts deleted file mode 100644 index e8a1f8e..0000000 --- a/03_source/mobile_baseline.bak/src/data/user/user.state.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface UserState { - isLoggedin: boolean; - username?: string; - darkMode: boolean; - hasSeenTutorial: boolean; - loading: boolean; -} diff --git a/03_source/mobile_baseline.bak/src/declarations.ts b/03_source/mobile_baseline.bak/src/declarations.ts deleted file mode 100644 index dbe667a..0000000 --- a/03_source/mobile_baseline.bak/src/declarations.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface AppPage { - url: string; - icon: object; - title: string; -} diff --git a/03_source/mobile_baseline.bak/src/main.tsx b/03_source/mobile_baseline.bak/src/main.tsx deleted file mode 100644 index 964b804..0000000 --- a/03_source/mobile_baseline.bak/src/main.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import App from './App'; -import * as serviceWorker from './serviceWorker'; - -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - -); -// If you want your app to work offline and load faster, you can change -// unregister() to register() below. Note this comes with some pitfalls. -// Learn more about service workers: https://bit.ly/CRA-PWA -serviceWorker.register(); diff --git a/03_source/mobile_baseline.bak/src/models/Location.ts b/03_source/mobile_baseline.bak/src/models/Location.ts deleted file mode 100644 index 9bc6d77..0000000 --- a/03_source/mobile_baseline.bak/src/models/Location.ts +++ /dev/null @@ -1,15 +0,0 @@ -export interface Location { - id: number; - name: string; - lat: number; - lng: number; - center?: boolean; -} - -export interface LocationState { - locations: Location[]; -} - -export const initialState: LocationState = { - locations: [], -}; diff --git a/03_source/mobile_baseline.bak/src/models/Schedule.ts b/03_source/mobile_baseline.bak/src/models/Schedule.ts deleted file mode 100644 index f210ff8..0000000 --- a/03_source/mobile_baseline.bak/src/models/Schedule.ts +++ /dev/null @@ -1,20 +0,0 @@ -export interface Schedule { - date: string; - groups: ScheduleGroup[]; -} - -export interface ScheduleGroup { - time: string; - sessions: Session[]; -} - -export interface Session { - id: number; - timeStart: string; - timeEnd: string; - name: string; - location: string; - description: string; - speakerNames: string[]; - tracks: string[]; -} diff --git a/03_source/mobile_baseline.bak/src/models/SessionGroup.ts b/03_source/mobile_baseline.bak/src/models/SessionGroup.ts deleted file mode 100644 index 93d46ad..0000000 --- a/03_source/mobile_baseline.bak/src/models/SessionGroup.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Session } from './Schedule'; -export interface SessionGroup { - startTime: string; - sessions: Session[]; -} diff --git a/03_source/mobile_baseline.bak/src/models/Speaker.ts b/03_source/mobile_baseline.bak/src/models/Speaker.ts deleted file mode 100644 index 35d8c78..0000000 --- a/03_source/mobile_baseline.bak/src/models/Speaker.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface Speaker { - id: number; - name: string; - profilePic: string; - twitter: string; - instagram: string; - about: string; - title: string; - location: string; - email: string; - phone: string; -} diff --git a/03_source/mobile_baseline.bak/src/pages/About.scss b/03_source/mobile_baseline.bak/src/pages/About.scss deleted file mode 100644 index f7d1ac0..0000000 --- a/03_source/mobile_baseline.bak/src/pages/About.scss +++ /dev/null @@ -1,103 +0,0 @@ -#about-page { - ion-toolbar { - position: absolute; - - top: 0; - left: 0; - right: 0; - - --background: transparent; - --color: white; - } - - ion-toolbar ion-back-button, - ion-toolbar ion-button, - ion-toolbar ion-menu-button { - --color: white; - } - - .about-header { - position: relative; - - width: 100%; - height: 30%; - } - - .about-header .about-image { - position: absolute; - - top: 0; - left: 0; - bottom: 0; - right: 0; - - background-position: center; - background-size: cover; - background-repeat: no-repeat; - - opacity: 0; - - transition: opacity 500ms ease-in-out; - } - - .about-header .madison { - background-image: url("/assets/img/about/madison.jpg"); - } - - .about-header .austin { - background-image: url("/assets/img/about/austin.jpg"); - } - - .about-header .chicago { - background-image: url("/assets/img/about/chicago.jpg"); - } - - .about-header .seattle { - background-image: url("/assets/img/about/seattle.jpg"); - } - - .about-info { - position: relative; - margin-top: -10px; - border-radius: 10px; - background: var(--ion-background-color, #fff); - z-index: 2; // display rounded border above header image - } - - .about-info h3 { - margin-top: 0; - } - - .about-info ion-list { - padding-top: 0; - } - - .about-info p { - line-height: 130%; - - color: var(--ion-color-dark); - } - - .about-info ion-icon { - margin-inline-end: 32px; - } - - /* - * iOS Only - */ - - .ios .about-info { - --ion-padding: 19px; - } - - .ios .about-info h3 { - font-weight: 700; - } -} - -#date-input-popover { - --offset-y: -var(--ion-safe-area-bottom); - - --max-width: 90%; - --width: 336px; -} diff --git a/03_source/mobile_baseline.bak/src/pages/About.tsx b/03_source/mobile_baseline.bak/src/pages/About.tsx deleted file mode 100644 index 2c45965..0000000 --- a/03_source/mobile_baseline.bak/src/pages/About.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import React, { useState } from 'react'; -import { - IonHeader, - IonToolbar, - IonContent, - IonPage, - IonButtons, - IonMenuButton, - IonButton, - IonIcon, - IonDatetime, - IonSelectOption, - IonList, - IonItem, - IonLabel, - IonSelect, - IonPopover, - IonText, -} from '@ionic/react'; -import './About.scss'; -import { ellipsisHorizontal, ellipsisVertical } from 'ionicons/icons'; -import AboutPopover from '../components/AboutPopover'; -import { format, parseISO } from 'date-fns'; - -interface AboutProps {} - -const About: React.FC = () => { - const [showPopover, setShowPopover] = useState(false); - const [popoverEvent, setPopoverEvent] = useState(); - const [location, setLocation] = useState< - 'madison' | 'austin' | 'chicago' | 'seattle' - >('madison'); - const [conferenceDate, setConferenceDate] = useState( - '2047-05-17T00:00:00-05:00' - ); - - const selectOptions = { - header: 'Select a Location', - }; - - const presentPopover = (e: React.MouseEvent) => { - setPopoverEvent(e.nativeEvent); - setShowPopover(true); - }; - - function displayDate(date: string, dateFormat: string) { - return format(parseISO(date), dateFormat); - } - - return ( - - - - - - - - - - - - - - - -
- {/* Instead of loading an image each time the select changes, use opacity to transition them */} -
-
-
-
-
-
-

About

- -

- The Ionic Conference is a one-day event happening on {' '} - {displayDate(conferenceDate, 'MMM dd, yyyy')}, featuring talks from the - Ionic team. The conference focuses on building applications with Ionic - Framework, including topics such as app migration to the latest version, - React best practices, Webpack, Sass, and other technologies - commonly used in the Ionic ecosystem. Tickets are completely sold out, - and we're expecting over 1,000 developers — making this the largest - Ionic conference to date! -

- -

Details

- - - - setLocation(e.detail.value as any)} - > - Madison, WI - Austin, TX - Chicago, IL - Seattle, WA - - - - Date - - {displayDate(conferenceDate, 'MMM dd, yyyy')} - - - - setConferenceDate(e.detail.value! as string) - } - presentation="date" - > - - - - -

Internet

- - - - Wifi network - - ica{displayDate(conferenceDate, 'y')} - - - - Password - makegoodthings - - -
-
- - setShowPopover(false)} - > - setShowPopover(false)} /> - -
- ); -}; - -export default React.memo(About); diff --git a/03_source/mobile_baseline.bak/src/pages/Account.scss b/03_source/mobile_baseline.bak/src/pages/Account.scss deleted file mode 100644 index e3c2761..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Account.scss +++ /dev/null @@ -1,6 +0,0 @@ -#account-page { - img { - max-width: 140px; - border-radius: 50%; - } -} \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/src/pages/Account.tsx b/03_source/mobile_baseline.bak/src/pages/Account.tsx deleted file mode 100644 index 56f89e0..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Account.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import React, { useState } from 'react'; -import { - IonHeader, - IonToolbar, - IonTitle, - IonContent, - IonPage, - IonButtons, - IonMenuButton, - IonList, - IonItem, - IonAlert, -} from '@ionic/react'; -import './Account.scss'; -import { setUsername } from '../data/user/user.actions'; -import { connect } from '../data/connect'; -import { RouteComponentProps } from 'react-router'; - -interface OwnProps extends RouteComponentProps {} - -interface StateProps { - username?: string; -} - -interface DispatchProps { - setUsername: typeof setUsername; -} - -interface AccountProps extends OwnProps, StateProps, DispatchProps {} - -const Account: React.FC = ({ setUsername, username }) => { - const [showAlert, setShowAlert] = useState(false); - - const clicked = (text: string) => { - console.log(`Clicked ${text}`); - }; - - return ( - - - - - - - Account - - - - {username && ( -
- avatar -

{username}

- - clicked('Update Picture')}> - Update Picture - - setShowAlert(true)}> - Change Username - - clicked('Change Password')}> - Change Password - - - Support - - - Logout - - -
- )} -
- { - setUsername(data.username); - }, - }, - ]} - inputs={[ - { - type: 'text', - name: 'username', - value: username, - placeholder: 'username', - }, - ]} - onDidDismiss={() => setShowAlert(false)} - /> -
- ); -}; - -export default connect({ - mapStateToProps: (state) => ({ - username: state.user.username, - }), - mapDispatchToProps: { - setUsername, - }, - component: Account, -}); diff --git a/03_source/mobile_baseline.bak/src/pages/Login.scss b/03_source/mobile_baseline.bak/src/pages/Login.scss deleted file mode 100644 index 9a56dc7..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Login.scss +++ /dev/null @@ -1,23 +0,0 @@ -#login-page, #signup-page, #support-page { - .login-logo { - min-height: 200px; - padding: 20px 0; - text-align: center; - } - - .login-logo img { - max-width: 150px; - } - - .list { - margin-bottom: 0; - } - - .login-form { - padding: 16px; - } - - ion-input { - margin-bottom: 10px; - } -} diff --git a/03_source/mobile_baseline.bak/src/pages/Login.tsx b/03_source/mobile_baseline.bak/src/pages/Login.tsx deleted file mode 100644 index 399f71c..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Login.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import React, { useState } from 'react'; -import { - IonHeader, - IonToolbar, - IonTitle, - IonContent, - IonPage, - IonButtons, - IonMenuButton, - IonRow, - IonCol, - IonButton, - IonInput, -} from '@ionic/react'; -import { useHistory } from 'react-router'; -import './Login.scss'; -import { setIsLoggedIn, setUsername } from '../data/user/user.actions'; -import { connect } from '../data/connect'; - -interface LoginProps { - setIsLoggedIn: typeof setIsLoggedIn; - setUsername: typeof setUsername; -} - -const Login: React.FC = ({ - setIsLoggedIn, - setUsername: setUsernameAction, -}) => { - const history = useHistory(); - const [login, setLogin] = useState({ username: '', password: '' }); - const [submitted, setSubmitted] = useState(false); - - const onLogin = async (e: React.FormEvent) => { - e.preventDefault(); - setSubmitted(true); - - if (login.username && login.password) { - await setIsLoggedIn(true); - await setUsernameAction(login.username); - history.push('/tabs/schedule'); - } - }; - - const onSignup = () => { - history.push('/signup'); - }; - - return ( - - - - - - - Login - - - -
- Ionic logo -
- -
-
- - setLogin({ ...login, username: e.detail.value! }) - } - required - /> - - - setLogin({ ...login, password: e.detail.value! }) - } - required - /> - - - - - Login - - - - - Signup - - - - -
-
-
- ); -}; - -export default connect<{}, {}, LoginProps>({ - mapDispatchToProps: { - setIsLoggedIn, - setUsername, - }, - component: Login, -}); diff --git a/03_source/mobile_baseline.bak/src/pages/MainTabs.tsx b/03_source/mobile_baseline.bak/src/pages/MainTabs.tsx deleted file mode 100644 index 9880498..0000000 --- a/03_source/mobile_baseline.bak/src/pages/MainTabs.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react'; -import { - IonTabs, - IonRouterOutlet, - IonTabBar, - IonTabButton, - IonIcon, - IonLabel, -} from '@ionic/react'; -import { Route, Redirect } from 'react-router'; -import { calendar, location, informationCircle, people } from 'ionicons/icons'; -import SchedulePage from './SchedulePage'; -import SpeakerList from './SpeakerList'; -import SpeakerDetail from './SpeakerDetail'; -import SessionDetail from './SessionDetail'; -import MapView from './MapView'; -import About from './About'; - -interface MainTabsProps {} - -const MainTabs: React.FC = () => { - return ( - - - - {/* - Using the render method prop cuts down the number of renders your components will have due to route changes. - Use the component prop when your component depends on the RouterComponentProps passed in automatically. - */} - } - exact={true} - /> - } - exact={true} - /> - - - - } exact={true} /> - } exact={true} /> - - - - - Schedule - - - - Speakers - - - - Map - - - - About - - - - ); -}; - -export default MainTabs; diff --git a/03_source/mobile_baseline.bak/src/pages/MapView.scss b/03_source/mobile_baseline.bak/src/pages/MapView.scss deleted file mode 100644 index 33d0ebc..0000000 --- a/03_source/mobile_baseline.bak/src/pages/MapView.scss +++ /dev/null @@ -1,18 +0,0 @@ -.map-canvas { - position: absolute; - - top: 0; - left: 0; - right: 0; - bottom: 0; - - background-color: transparent; - - opacity: 0; - - transition: opacity 150ms ease-in; -} - -.show-map { - opacity: 1; -} diff --git a/03_source/mobile_baseline.bak/src/pages/MapView.tsx b/03_source/mobile_baseline.bak/src/pages/MapView.tsx deleted file mode 100644 index 54e61e7..0000000 --- a/03_source/mobile_baseline.bak/src/pages/MapView.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import React, { useEffect, useRef } from 'react'; -import { - IonContent, - IonHeader, - IonPage, - IonTitle, - IonToolbar, - useIonViewDidEnter, -} from '@ionic/react'; -import { Location } from '../models/Location'; -import { connect } from '../data/connect'; -import { loadLocations } from '../data/locations/locations.actions'; -import L from 'leaflet'; -import 'leaflet/dist/leaflet.css'; -import markerIconUrl from "leaflet/dist/images/marker-icon.png"; -import markerIconRetinaUrl from "leaflet/dist/images/marker-icon-2x.png"; -import markerShadowUrl from "leaflet/dist/images/marker-shadow.png"; -import './MapView.scss'; - -// Fix for marker icons in Vite -L.Icon.Default.prototype.options.iconUrl = markerIconUrl; -L.Icon.Default.prototype.options.iconRetinaUrl = markerIconRetinaUrl; -L.Icon.Default.prototype.options.shadowUrl = markerShadowUrl; -L.Icon.Default.imagePath = ""; - -interface StateProps { - locations: Location[]; -} - -interface DispatchProps { - loadLocations: typeof loadLocations; -} - -const MapView: React.FC = ({ - locations, - loadLocations, -}) => { - const mapCanvas = useRef(null); - const map = useRef(null); - const markers = useRef([]); - - // Add useEffect to load locations when component mounts - useEffect(() => { - loadLocations(); - }, []); - - const initMap = () => { - if (!locations?.length || !mapCanvas.current || map.current) return; - - map.current = L.map(mapCanvas.current, { - zoomControl: true, - attributionControl: true, - }); - - // Get the center location (first item marked as center, or first item if none marked) - const centerLocation = locations.find((loc) => loc.center) || locations[0]; - map.current.setView([centerLocation.lat, centerLocation.lng], 16); - - // Add tile layer - L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { - attribution: '© OpenStreetMap contributors', - }).addTo(map.current); - - // Add markers for all locations - locations.forEach((location: Location) => { - const marker = L.marker([location.lat, location.lng]) - .addTo(map.current!) - .bindPopup(`${location.name}`); - markers.current.push(marker); - }); - - // Show map - mapCanvas.current.classList.add('show-map'); - }; - - const resizeMap = () => { - if (map.current) { - map.current.invalidateSize(); - } - }; - - // Initialize map - useEffect(() => { - initMap(); - return () => { - if (map.current) { - markers.current.forEach((marker) => marker.remove()); - map.current.remove(); - map.current = null; - } - }; - }, [locations]); - - // Handle resize after content is visible - useEffect(() => { - const timer = setTimeout(() => { - resizeMap(); - }, 300); - - return () => clearTimeout(timer); - }, []); - - useIonViewDidEnter(() => { - resizeMap(); - }); - - return ( - - - - Map - - - -
-
-
- ); -}; - -export default connect<{}, StateProps, DispatchProps>({ - mapStateToProps: (state) => ({ - locations: state.locations.locations, - }), - mapDispatchToProps: { - loadLocations, - }, - component: MapView, -}); diff --git a/03_source/mobile_baseline.bak/src/pages/SchedulePage.scss b/03_source/mobile_baseline.bak/src/pages/SchedulePage.scss deleted file mode 100644 index aa89750..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SchedulePage.scss +++ /dev/null @@ -1,58 +0,0 @@ -#schedule-page { - ion-fab-button { - --background: var(--ion-color-step-150, #fff); - --background-hover: var(--ion-color-step-200, #f2f2f2); - --background-focused: var(--ion-color-step-250, #d9d9d9); - - --color: var(--ion-color-primary, #3880ff); - } - - /* - * Material Design uses the ripple for activated - * so only style the iOS activated background - */ - .ios ion-fab-button { - --background-activated: var(--ion-color-step-250, #d9d9d9); - } - - ion-item-sliding.track-ionic ion-label { - border-left: 2px solid var(--ion-color-primary); - padding-left: 10px; - } - ion-item-sliding.track-react ion-label { - border-left: 2px solid var(--ion-color-react); - padding-left: 10px; - } - ion-item-sliding.track-communication ion-label { - border-left: 2px solid var(--ion-color-communication); - padding-left: 10px; - } - ion-item-sliding.track-tooling ion-label { - border-left: 2px solid var(--ion-color-tooling); - padding-left: 10px; - } - ion-item-sliding.track-services ion-label { - border-left: 2px solid var(--ion-color-services); - padding-left: 10px; - } - ion-item-sliding.track-design ion-label { - border-left: 2px solid var(--ion-color-design); - padding-left: 10px; - } - ion-item-sliding.track-workshop ion-label { - border-left: 2px solid var(--ion-color-workshop); - padding-left: 10px; - } - ion-item-sliding.track-food ion-label { - border-left: 2px solid var(--ion-color-food); - padding-left: 10px; - } - ion-item-sliding.track-documentation ion-label { - border-left: 2px solid var(--ion-color-documentation); - padding-left: 10px; - } - ion-item-sliding.track-navigation ion-label { - border-left: 2px solid var(--ion-color-navigation); - padding-left: 10px; - } -} diff --git a/03_source/mobile_baseline.bak/src/pages/SchedulePage.tsx b/03_source/mobile_baseline.bak/src/pages/SchedulePage.tsx deleted file mode 100644 index 25751c6..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SchedulePage.tsx +++ /dev/null @@ -1,194 +0,0 @@ -import React, { useState, useRef } from 'react'; - -import { - IonToolbar, - IonContent, - IonPage, - IonButtons, - IonTitle, - IonMenuButton, - IonSegment, - IonSegmentButton, - IonButton, - IonIcon, - IonSearchbar, - IonRefresher, - IonRefresherContent, - IonToast, - IonModal, - IonHeader, - getConfig, -} from '@ionic/react'; -import { options, search } from 'ionicons/icons'; - -import SessionList from '../components/SessionList'; -import SessionListFilter from '../components/SessionListFilter'; -import './SchedulePage.scss'; - -import ShareSocialFab from '../components/ShareSocialFab'; - -import * as selectors from '../data/selectors'; -import { connect } from '../data/connect'; -import { setSearchText } from '../data/sessions/sessions.actions'; -import { Schedule } from '../models/Schedule'; - -interface OwnProps {} - -interface StateProps { - schedule: Schedule; - favoritesSchedule: Schedule; - mode: 'ios' | 'md'; -} - -interface DispatchProps { - setSearchText: typeof setSearchText; -} - -type SchedulePageProps = OwnProps & StateProps & DispatchProps; - -const SchedulePage: React.FC = ({ - favoritesSchedule, - schedule, - setSearchText, - mode, -}) => { - const [segment, setSegment] = useState<'all' | 'favorites'>('all'); - const [showSearchbar, setShowSearchbar] = useState(false); - const [showFilterModal, setShowFilterModal] = useState(false); - const ionRefresherRef = useRef(null); - const [showCompleteToast, setShowCompleteToast] = useState(false); - - const pageRef = useRef(null); - - const ios = mode === 'ios'; - - const doRefresh = () => { - setTimeout(() => { - ionRefresherRef.current!.complete(); - setShowCompleteToast(true); - }, 2500); - }; - - return ( - - - - {!showSearchbar && ( - - - - )} - {ios && ( - setSegment(e.detail.value as any)} - > - All - Favorites - - )} - {!ios && !showSearchbar && Schedule} - {showSearchbar && ( - setSearchText(e.detail.value)} - onIonCancel={() => setShowSearchbar(false)} - > - )} - - - {!ios && !showSearchbar && ( - setShowSearchbar(true)}> - - - )} - {!showSearchbar && ( - setShowFilterModal(true)}> - {mode === 'ios' ? ( - 'Filter' - ) : ( - - )} - - )} - - - - {!ios && ( - - setSegment(e.detail.value as any)} - > - All - Favorites - - - )} - - - - - - Schedule - - - setSearchText(e.detail.value)} - > - - - - - - - - setShowCompleteToast(false)} - /> - - - - - - setShowFilterModal(false)} - presentingElement={pageRef.current!} - > - setShowFilterModal(false)} /> - - - - - ); -}; - -export default connect({ - mapStateToProps: (state) => ({ - schedule: selectors.getSearchedSchedule(state), - favoritesSchedule: selectors.getGroupedFavorites(state), - mode: getConfig()!.get('mode'), - }), - mapDispatchToProps: { - setSearchText, - }, - component: React.memo(SchedulePage), -}); diff --git a/03_source/mobile_baseline.bak/src/pages/SessionDetail.scss b/03_source/mobile_baseline.bak/src/pages/SessionDetail.scss deleted file mode 100644 index 9b09f82..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SessionDetail.scss +++ /dev/null @@ -1,73 +0,0 @@ -#session-detail-page { - .session-track-ionic { - color: var(--ion-color-primary); - } - - .session-track-react { - color: var(--ion-color-react); - } - - .session-track-communication { - color: var(--ion-color-communication); - } - - .session-track-tooling { - color: var(--ion-color-tooling); - } - - .session-track-services { - color: var(--ion-color-services); - } - - .session-track-design { - color: var(--ion-color-design); - } - - .session-track-workshop { - color: var(--ion-color-workshop); - } - - .session-track-food { - color: var(--ion-color-food); - } - - .session-track-documentation { - color: var(--ion-color-documentation); - } - - .session-track-navigation { - color: var(--ion-color-navigation); - } - - .show-favorite { - position: relative; - } - - .icon-heart-empty { - position: absolute; - top: 5px; - right: 5px; - transform: scale(1); - transition: transform 0.3s ease; - } - - .icon-heart { - position: absolute; - top: 5px; - right: 5px; - transform: scale(0); - transition: transform 0.3s ease; - } - - .show-favorite .icon-heart { - transform: scale(1); - } - - .show-favorite .icon-heart-empty { - transform: scale(0); - } - - h1 { - margin: 0; - } -} diff --git a/03_source/mobile_baseline.bak/src/pages/SessionDetail.tsx b/03_source/mobile_baseline.bak/src/pages/SessionDetail.tsx deleted file mode 100644 index 28f92d4..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SessionDetail.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import React from 'react'; -import { - IonHeader, - IonToolbar, - IonContent, - IonPage, - IonButtons, - IonBackButton, - IonButton, - IonIcon, - IonText, - IonList, - IonItem, - IonLabel, -} from '@ionic/react'; -import { connect } from '../data/connect'; -import { withRouter, RouteComponentProps } from 'react-router'; -import * as selectors from '../data/selectors'; -import { starOutline, star, share, cloudDownload } from 'ionicons/icons'; -import './SessionDetail.scss'; -import { addFavorite, removeFavorite } from '../data/sessions/sessions.actions'; -import { Session } from '../models/Schedule'; - -interface OwnProps extends RouteComponentProps {} - -interface StateProps { - session?: Session; - favoriteSessions: number[]; -} - -interface DispatchProps { - addFavorite: typeof addFavorite; - removeFavorite: typeof removeFavorite; -} - -type SessionDetailProps = OwnProps & StateProps & DispatchProps; - -const SessionDetail: React.FC = ({ - session, - addFavorite, - removeFavorite, - favoriteSessions, -}) => { - if (!session) { - return
Session not found
; - } - - const isFavorite = favoriteSessions.indexOf(session.id) > -1; - - const toggleFavorite = () => { - isFavorite ? removeFavorite(session.id) : addFavorite(session.id); - }; - const shareSession = () => {}; - const sessionClick = (text: string) => { - console.log(`Clicked ${text}`); - }; - - return ( - - - - - - - - toggleFavorite()}> - {isFavorite ? ( - - ) : ( - - )} - - shareSession}> - - - - - - -
-

{session.name}

- {session.tracks.map((track) => ( - - {track} - - ))} -

{session.description}

- - {session.timeStart} – {session.timeEnd} -
- {session.location} -
-
- - sessionClick('watch')} button> - Watch - - sessionClick('add to calendar')} button> - Add to Calendar - - sessionClick('mark as unwatched')} button> - Mark as Unwatched - - sessionClick('download video')} button> - Download Video - - - sessionClick('leave feedback')} button> - Leave Feedback - - -
-
- ); -}; - -export default connect({ - mapStateToProps: (state, ownProps) => ({ - session: selectors.getSession(state, ownProps), - favoriteSessions: state.data.favorites - }), - mapDispatchToProps: { - addFavorite, - removeFavorite, - }, - component: withRouter(SessionDetail), -}); diff --git a/03_source/mobile_baseline.bak/src/pages/Signup.scss b/03_source/mobile_baseline.bak/src/pages/Signup.scss deleted file mode 100644 index be8bb75..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Signup.scss +++ /dev/null @@ -1,17 +0,0 @@ -.signup-logo { - min-height: 200px; - padding: 20px 0; - text-align: center; -} - -.signup-logo img { - max-width: 150px; -} - -.signup-form { - padding: 16px; -} - -ion-input { - margin-bottom: 10px; -} diff --git a/03_source/mobile_baseline.bak/src/pages/Signup.tsx b/03_source/mobile_baseline.bak/src/pages/Signup.tsx deleted file mode 100644 index c8d1ee4..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Signup.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import React, { useState } from 'react'; -import { - IonHeader, - IonToolbar, - IonTitle, - IonContent, - IonPage, - IonButtons, - IonMenuButton, - IonRow, - IonCol, - IonButton, - IonInput, -} from '@ionic/react'; -import { useHistory } from 'react-router'; -import './Signup.scss'; -import { setIsLoggedIn, setUsername } from '../data/user/user.actions'; -import { connect } from '../data/connect'; - -interface SignupProps { - setIsLoggedIn: typeof setIsLoggedIn; - setUsername: typeof setUsername; -} - -const Signup: React.FC = ({ - setIsLoggedIn, - setUsername: setUsernameAction, -}) => { - const history = useHistory(); - const [signup, setSignup] = useState({ username: '', password: '' }); - const [submitted, setSubmitted] = useState(false); - - const onSignup = async (e: React.FormEvent) => { - e.preventDefault(); - setSubmitted(true); - - if (signup.username && signup.password) { - await setIsLoggedIn(true); - await setUsernameAction(signup.username); - history.push('/tabs/schedule'); - } - }; - - return ( - - - - - - - Signup - - - -
- Ionic Logo -
- -
-
- - setSignup({ ...signup, username: e.detail.value! }) - } - required - /> - - - setSignup({ ...signup, password: e.detail.value! }) - } - required - /> - - - - - Create - - - - -
-
-
- ); -}; - -export default connect<{}, {}, SignupProps>({ - mapDispatchToProps: { - setIsLoggedIn, - setUsername, - }, - component: Signup, -}); diff --git a/03_source/mobile_baseline.bak/src/pages/SpeakerDetail.scss b/03_source/mobile_baseline.bak/src/pages/SpeakerDetail.scss deleted file mode 100644 index c077e0b..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SpeakerDetail.scss +++ /dev/null @@ -1,79 +0,0 @@ -#speaker-detail { - /* - * Speaker Background - */ - - ion-toolbar { - position: absolute; - - top: 0; - left: 0; - right: 0; - - --background: transparent; - --color: white; - } - - ion-toolbar ion-back-button, - ion-toolbar ion-button, - ion-toolbar ion-menu-button { - --color: white; - } - - .speaker-background { - position: relative; - - display: flex; - - padding-top: var(--ion-safe-area-top); - - align-items: center; - justify-content: center; - - flex-direction: column; - - height: calc(250px + var(--ion-safe-area-top)); - - background: center / cover url("/assets/img/speaker-background.png") - no-repeat; - } - - .speaker-background img { - width: 70px; - border-radius: 50%; - margin-top: calc(-1 * var(--ion-safe-area-top)); - } - - .speaker-background h2 { - position: absolute; - - bottom: 10px; - - color: white; - } - - .md .speaker-background { - box-shadow: rgba(0, 0, 0, 0.2) 0 3px 1px -2px, - rgba(0, 0, 0, 0.14) 0 2px 2px 0px, rgba(0, 0, 0, 0.12) 0 1px 5px 0; - } - - .ios .speaker-background { - box-shadow: rgba(0, 0, 0, 0.12) 0 4px 16px; - } - - /* - * Speaker Details - */ - - .speaker-detail p { - margin-left: 6px; - margin-right: 6px; - } - - .speaker-detail hr { - margin-top: 20px; - margin-bottom: 20px; - - background: var(--ion-color-step-150, #d7d8da); - } -} diff --git a/03_source/mobile_baseline.bak/src/pages/SpeakerDetail.tsx b/03_source/mobile_baseline.bak/src/pages/SpeakerDetail.tsx deleted file mode 100644 index a89095f..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SpeakerDetail.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import React, { useState } from 'react'; -import { RouteComponentProps } from 'react-router'; - -import './SpeakerDetail.scss'; - -import { ActionSheetButton } from '@ionic/core'; -import { - IonActionSheet, - IonChip, - IonIcon, - IonHeader, - IonLabel, - IonToolbar, - IonButtons, - IonContent, - IonButton, - IonBackButton, - IonPage, -} from '@ionic/react'; -import { - callOutline, - callSharp, - logoTwitter, - logoGithub, - logoInstagram, - shareOutline, - shareSharp, -} from 'ionicons/icons'; - -import { connect } from '../data/connect'; -import * as selectors from '../data/selectors'; - -import { Speaker } from '../models/Speaker'; - -interface OwnProps extends RouteComponentProps { - speaker?: Speaker; -} - -interface StateProps {} - -interface DispatchProps {} - -interface SpeakerDetailProps extends OwnProps, StateProps, DispatchProps {} - -const SpeakerDetail: React.FC = ({ speaker }) => { - const [showActionSheet, setShowActionSheet] = useState(false); - const [actionSheetButtons, setActionSheetButtons] = useState< - ActionSheetButton[] - >([]); - const [actionSheetHeader, setActionSheetHeader] = useState(''); - - function openSpeakerShare(speaker: Speaker) { - setActionSheetButtons([ - { - text: 'Copy Link', - handler: () => { - console.log('Copy Link clicked'); - }, - }, - { - text: 'Share via ...', - handler: () => { - console.log('Share via clicked'); - }, - }, - { - text: 'Cancel', - role: 'cancel', - handler: () => { - console.log('Cancel clicked'); - }, - }, - ]); - setActionSheetHeader(`Share ${speaker.name}`); - setShowActionSheet(true); - } - - function openContact(speaker: Speaker) { - setActionSheetButtons([ - { - text: `Email ( ${speaker.email} )`, - handler: () => { - window.open('mailto:' + speaker.email); - }, - }, - { - text: `Call ( ${speaker.phone} )`, - handler: () => { - window.open('tel:' + speaker.phone); - }, - }, - ]); - setActionSheetHeader(`Share ${speaker.name}`); - setShowActionSheet(true); - } - - function openExternalUrl(url: string) { - window.open(url, '_blank'); - } - - if (!speaker) { - return
Speaker not found
; - } - - return ( - - - - - - - - - openContact(speaker)}> - - - openSpeakerShare(speaker)}> - - - - - - -
- {speaker.name} -

{speaker.name}

-
- -
-

{speaker.about} Say hello on social media!

- -
- - - openExternalUrl(`https://twitter.com/${speaker.twitter}`) - } - > - - Twitter - - - - openExternalUrl('https://github.com/ionic-team/ionic-framework') - } - > - - GitHub - - - - openExternalUrl('https://instagram.com/ionicframework') - } - > - - Instagram - -
-
- setShowActionSheet(false)} - buttons={actionSheetButtons} - /> -
- ); -}; - -export default connect({ - mapStateToProps: (state, ownProps) => ({ - speaker: selectors.getSpeaker(state, ownProps), - }), - component: SpeakerDetail, -}); diff --git a/03_source/mobile_baseline.bak/src/pages/SpeakerList.scss b/03_source/mobile_baseline.bak/src/pages/SpeakerList.scss deleted file mode 100644 index 64b9fa3..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SpeakerList.scss +++ /dev/null @@ -1,48 +0,0 @@ -#speaker-list { - .speaker-card { - display: flex; - flex-direction: column; - } - - /* Due to the fact the cards are inside of columns the margins don't overlap - * properly so we want to remove the extra margin between cards - */ - ion-col:not(:last-of-type) .speaker-card { - margin-bottom: 0; - } - - .speaker-card .speaker-item { - --min-height: 85px; - } - - .speaker-card .speaker-item h2 { - font-size: 18px; - font-weight: 500; - letter-spacing: 0.02em; - } - - .speaker-card .speaker-item p { - font-size: 13px; - letter-spacing: 0.02em; - } - - .speaker-card ion-card-header { - padding: 0; - } - - .speaker-card ion-card-content { - flex: 1 1 auto; - - padding: 0; - } - - .ios ion-list { - margin-bottom: 10px; - } - - .md ion-list { - border-top: 1px solid var(--ion-color-step-150, #d7d8da); - - padding: 0; - } -} \ No newline at end of file diff --git a/03_source/mobile_baseline.bak/src/pages/SpeakerList.tsx b/03_source/mobile_baseline.bak/src/pages/SpeakerList.tsx deleted file mode 100644 index 9e6f3bc..0000000 --- a/03_source/mobile_baseline.bak/src/pages/SpeakerList.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from 'react'; -import { - IonHeader, - IonToolbar, - IonTitle, - IonContent, - IonPage, - IonButtons, - IonMenuButton, - IonGrid, - IonRow, - IonCol, -} from '@ionic/react'; -import SpeakerItem from '../components/SpeakerItem'; -import { Speaker } from '../models/Speaker'; -import { Session } from '../models/Schedule'; -import { connect } from '../data/connect'; -import * as selectors from '../data/selectors'; -import './SpeakerList.scss'; - -interface OwnProps {} - -interface StateProps { - speakers: Speaker[]; - speakerSessions: { [key: string]: Session[] }; -} - -interface DispatchProps {} - -interface SpeakerListProps extends OwnProps, StateProps, DispatchProps {} - -const SpeakerList: React.FC = ({ - speakers, - speakerSessions, -}) => { - return ( - - - - - - - Speakers - - - - - - - Speakers - - - - - - {speakers.map((speaker) => ( - - - - ))} - - - - - ); -}; - -export default connect({ - mapStateToProps: (state) => ({ - speakers: selectors.getSpeakers(state), - speakerSessions: selectors.getSpeakerSessions(state), - }), - component: React.memo(SpeakerList), -}); diff --git a/03_source/mobile_baseline.bak/src/pages/Support.scss b/03_source/mobile_baseline.bak/src/pages/Support.scss deleted file mode 100644 index db1f9db..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Support.scss +++ /dev/null @@ -1,17 +0,0 @@ -.support-logo { - min-height: 200px; - padding: 20px 0; - text-align: center; -} - -.support-logo img { - max-width: 150px; -} - -.list { - margin-bottom: 0; -} - -.support-form { - padding: 16px; -} diff --git a/03_source/mobile_baseline.bak/src/pages/Support.tsx b/03_source/mobile_baseline.bak/src/pages/Support.tsx deleted file mode 100644 index ac71d6b..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Support.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React, { useState } from 'react'; -import { - IonHeader, - IonToolbar, - IonTitle, - IonContent, - IonPage, - IonButtons, - IonMenuButton, - IonRow, - IonCol, - IonButton, - IonTextarea, - useIonToast, - useIonViewWillEnter, -} from '@ionic/react'; -import './Support.scss'; - -const Support: React.FC = () => { - const [present] = useIonToast(); - const [supportMessage, setSupportMessage] = useState(''); - const [submitted, setSubmitted] = useState(false); - - useIonViewWillEnter(() => { - present({ - message: 'This does not actually send a support request.', - duration: 3000, - }); - }); - - const submit = async (e: React.FormEvent) => { - e.preventDefault(); - setSubmitted(true); - - if (supportMessage) { - setSupportMessage(''); - setSubmitted(false); - - present({ - message: 'Your support request has been sent.', - duration: 3000, - }); - } - }; - - return ( - - - - - - - Support - - - -
- Ionic Logo -
- -
-
- setSupportMessage(e.detail.value!)} - required - /> - - - - - Submit - - - - -
-
-
- ); -}; - -export default Support; diff --git a/03_source/mobile_baseline.bak/src/pages/Tutorial.scss b/03_source/mobile_baseline.bak/src/pages/Tutorial.scss deleted file mode 100644 index 5b9f8a7..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Tutorial.scss +++ /dev/null @@ -1,56 +0,0 @@ -#tutorial-page { - ion-toolbar { - --background: transparent; - --border-color: transparent; - } - - .slide-title { - margin-top: 2.8rem; - } - - .slider { - display: grid; - grid-template-columns: repeat(4, 100%); - grid-template-rows: 1fr; - - height: 100%; - - overflow: scroll; - scroll-snap-type: x mandatory; - } - - section { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - text-align: center; - - width: 100%; - - scroll-snap-align: center; - scroll-snap-stop: always; - } - - .slide-image { - max-height: 50%; - max-width: 60%; - margin: -5vh 0 0; - pointer-events: none; - } - - b { - font-weight: 500; - } - - p { - padding: 0 40px; - font-size: 14px; - line-height: 1.5; - color: var(--ion-color-step-600, #60646b); - - b { - color: var(--ion-text-color, #000000); - } - } -} diff --git a/03_source/mobile_baseline.bak/src/pages/Tutorial.tsx b/03_source/mobile_baseline.bak/src/pages/Tutorial.tsx deleted file mode 100644 index 4e9b389..0000000 --- a/03_source/mobile_baseline.bak/src/pages/Tutorial.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import React, { useRef, useEffect } from 'react'; -import { - IonContent, - IonPage, - IonHeader, - IonToolbar, - IonButtons, - IonButton, - IonIcon, - useIonViewWillEnter, -} from '@ionic/react'; -import { arrowForward } from 'ionicons/icons'; -import { setMenuEnabled } from '../data/sessions/sessions.actions'; -import { setHasSeenTutorial } from '../data/user/user.actions'; -import './Tutorial.scss'; -import { connect } from '../data/connect'; -import { RouteComponentProps } from 'react-router'; - -interface OwnProps extends RouteComponentProps {} -interface DispatchProps { - setHasSeenTutorial: typeof setHasSeenTutorial; - setMenuEnabled: typeof setMenuEnabled; -} - -interface TutorialProps extends OwnProps, DispatchProps {} - -const Tutorial: React.FC = ({ - history, - setHasSeenTutorial, - setMenuEnabled, -}) => { - const sliderRef = useRef(null); - - useIonViewWillEnter(() => { - setMenuEnabled(false); - // Scroll to first slide when entering the tutorial - if (sliderRef.current) { - sliderRef.current.scrollTo({ - left: 0, - behavior: 'smooth' - }); - } - }); - - const startApp = async () => { - await setHasSeenTutorial(true); - await setMenuEnabled(true); - history.push('/tabs/schedule', { direction: 'none' }); - }; - - return ( - - - - - - Skip - - - - - -
-
-
- -

- Welcome to ICA -

-

- The ionic conference app is a practical preview of the - ionic framework in action, and a demonstration of proper code - use. -

-
-
-
-
- -

What is Ionic?

-

- Ionic Framework is an open source SDK that enables - developers to build high quality mobile apps with web - technologies like HTML, CSS, and JavaScript. -

-
-
-
-
- -

What is Ionic Appflow?

-

- Ionic Appflow is a powerful set of services and features - built on top of Ionic Framework that brings a totally new level - of app development agility to mobile dev teams. -

-
-
-
-
- -

Ready to Play?

- - Continue - - -
-
-
-
-
- ); -}; - -export default connect({ - mapDispatchToProps: { - setHasSeenTutorial, - setMenuEnabled, - }, - component: Tutorial, -}); diff --git a/03_source/mobile_baseline.bak/src/react-app-env.d.ts b/03_source/mobile_baseline.bak/src/react-app-env.d.ts deleted file mode 100644 index 6431bc5..0000000 --- a/03_source/mobile_baseline.bak/src/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/03_source/mobile_baseline.bak/src/serviceWorker.ts b/03_source/mobile_baseline.bak/src/serviceWorker.ts deleted file mode 100644 index bdab413..0000000 --- a/03_source/mobile_baseline.bak/src/serviceWorker.ts +++ /dev/null @@ -1,143 +0,0 @@ -// This optional code is used to register a service worker. -// register() is not called by default. - -// This lets the app load faster on subsequent visits in production, and gives -// it offline capabilities. However, it also means that developers (and users) -// will only see deployed updates on subsequent visits to a page, after all the -// existing tabs open on the page have been closed, since previously cached -// resources are updated in the background. - -// To learn more about the benefits of this model and instructions on how to -// opt-in, read https://bit.ly/CRA-PWA - -const isLocalhost = Boolean( - window.location.hostname === 'localhost' || - // [::1] is the IPv6 localhost address. - window.location.hostname === '[::1]' || - // 127.0.0.1/8 is considered localhost for IPv4. - window.location.hostname.match( - /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ - ) -); - -type Config = { - onSuccess?: (registration: ServiceWorkerRegistration) => void; - onUpdate?: (registration: ServiceWorkerRegistration) => void; -}; - -export function register(config?: Config) { - if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { - // The URL constructor is available in all browsers that support SW. - const publicUrl = new URL( - (process as { env: { [key: string]: string } }).env.PUBLIC_URL, - window.location.href - ); - if (publicUrl.origin !== window.location.origin) { - // Our service worker won't work if PUBLIC_URL is on a different origin - // from what our page is served on. This might happen if a CDN is used to - // serve assets; see https://github.com/facebook/create-react-app/issues/2374 - return; - } - - window.addEventListener('load', () => { - const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; - - if (isLocalhost) { - // This is running on localhost. Let's check if a service worker still exists or not. - checkValidServiceWorker(swUrl, config); - - // Add some additional logging to localhost, pointing developers to the - // service worker/PWA documentation. - navigator.serviceWorker.ready.then(() => { - console.log( - 'This web app is being served cache-first by a service ' + - 'worker. To learn more, visit https://bit.ly/CRA-PWA' - ); - }); - } else { - // Is not localhost. Just register service worker - registerValidSW(swUrl, config); - } - }); - } -} - -function registerValidSW(swUrl: string, config?: Config) { - navigator.serviceWorker - .register(swUrl) - .then((registration) => { - registration.onupdatefound = () => { - const installingWorker = registration.installing; - if (installingWorker == null) { - return; - } - installingWorker.onstatechange = () => { - if (installingWorker.state === 'installed') { - if (navigator.serviceWorker.controller) { - // At this point, the updated precached content has been fetched, - // but the previous service worker will still serve the older - // content until all client tabs are closed. - console.log( - 'New content is available and will be used when all ' + - 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' - ); - - // Execute callback - if (config && config.onUpdate) { - config.onUpdate(registration); - } - } else { - // At this point, everything has been precached. - // It's the perfect time to display a - // "Content is cached for offline use." message. - console.log('Content is cached for offline use.'); - - // Execute callback - if (config && config.onSuccess) { - config.onSuccess(registration); - } - } - } - }; - }; - }) - .catch((error) => { - console.error('Error during service worker registration:', error); - }); -} - -function checkValidServiceWorker(swUrl: string, config?: Config) { - // Check if the service worker can be found. If it can't reload the page. - fetch(swUrl) - .then((response) => { - // Ensure service worker exists, and that we really are getting a JS file. - const contentType = response.headers.get('content-type'); - if ( - response.status === 404 || - (contentType != null && contentType.indexOf('javascript') === -1) - ) { - // No service worker found. Probably a different app. Reload the page. - navigator.serviceWorker.ready.then((registration) => { - registration.unregister().then(() => { - window.location.reload(); - }); - }); - } else { - // Service worker found. Proceed as normal. - registerValidSW(swUrl, config); - } - }) - .catch(() => { - console.log( - 'No internet connection found. App is running in offline mode.' - ); - }); -} - -export function unregister() { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.ready.then((registration) => { - registration.unregister(); - }); - } -} diff --git a/03_source/mobile_baseline.bak/src/theme/variables.css b/03_source/mobile_baseline.bak/src/theme/variables.css deleted file mode 100644 index 48d1f13..0000000 --- a/03_source/mobile_baseline.bak/src/theme/variables.css +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Ionic Variables and Theming - * ---------------------------------------------------------------------------- - * For more information, please see - * https://www.ionicframework.com/docs/theming/ - */ - -/* - * Additional Ionic Colors - * ---------------------------------------------------------------------------- - * In order to add colors to be used within Ionic components, - * the color should be added as a class with the convention `.ion-color-{COLOR}` - * where `{COLOR}` is the color to be used on the Ionic component. - * For more information on adding new colors, please see - * https://ionicframework.com/docs/theming/colors#adding-colors - * - * To generate the code for a new color, check out our new color creator: - * https://ionicframework.com/docs/theming/colors#new-color-creator - */ - - :root { - --ion-color-favorite: #69bb7b; - --ion-color-favorite-rgb: 105,187,123; - --ion-color-favorite-contrast: #ffffff; - --ion-color-favorite-contrast-rgb: 255,255,255; - --ion-color-favorite-shade: #5ca56c; - --ion-color-favorite-tint: #78c288; - - --ion-color-twitter: #1da1f4; - --ion-color-twitter-rgb: 29,161,244; - --ion-color-twitter-contrast: #ffffff; - --ion-color-twitter-contrast-rgb: 255,255,255; - --ion-color-twitter-shade: #1a8ed7; - --ion-color-twitter-tint: #34aaf5; - - --ion-color-instagram: #5956d8; - --ion-color-instagram-rgb: 89,86,216; - --ion-color-instagram-contrast: #ffffff; - --ion-color-instagram-contrast-rgb: 255,255,255; - --ion-color-instagram-shade: #4e4cbe; - --ion-color-instagram-tint: #6a67dc; - - --ion-color-vimeo: #23b6ea; - --ion-color-vimeo-rgb: 35,182,234; - --ion-color-vimeo-contrast: #ffffff; - --ion-color-vimeo-contrast-rgb: 255,255,255; - --ion-color-vimeo-shade: #1fa0ce; - --ion-color-vimeo-tint: #39bdec; - - --ion-color-facebook: #3b5998; - --ion-color-facebook-rgb: 59,89,152; - --ion-color-facebook-contrast: #ffffff; - --ion-color-facebook-contrast-rgb: 255,255,255; - --ion-color-facebook-shade: #344e86; - --ion-color-facebook-tint: #4f6aa2; -} - -.ion-color-favorite { - --ion-color-base: var(--ion-color-favorite); - --ion-color-base-rgb: var(--ion-color-favorite-rgb); - --ion-color-contrast: var(--ion-color-favorite-contrast); - --ion-color-contrast-rgb: var(--ion-color-favorite-contrast-rgb); - --ion-color-shade: var(--ion-color-favorite-shade); - --ion-color-tint: var(--ion-color-favorite-tint); -} - -.ion-color-twitter { - --ion-color-base: var(--ion-color-twitter); - --ion-color-base-rgb: var(--ion-color-twitter-rgb); - --ion-color-contrast: var(--ion-color-twitter-contrast); - --ion-color-contrast-rgb: var(--ion-color-twitter-contrast-rgb); - --ion-color-shade: var(--ion-color-twitter-shade); - --ion-color-tint: var(--ion-color-twitter-tint); -} - -.ion-color-google { - --ion-color-base: var(--ion-color-google); - --ion-color-base-rgb: var(--ion-color-google-rgb); - --ion-color-contrast: var(--ion-color-google-contrast); - --ion-color-contrast-rgb: var(--ion-color-google-contrast-rgb); - --ion-color-shade: var(--ion-color-google-shade); - --ion-color-tint: var(--ion-color-google-tint); -} - -.ion-color-instagram { - --ion-color-base: var(--ion-color-instagram); - --ion-color-base-rgb: var(--ion-color-instagram-rgb); - --ion-color-contrast: var(--ion-color-instagram-contrast); - --ion-color-contrast-rgb: var(--ion-color-instagram-contrast-rgb); - --ion-color-shade: var(--ion-color-instagram-shade); - --ion-color-tint: var(--ion-color-instagram-tint); -} - -.ion-color-vimeo { - --ion-color-base: var(--ion-color-vimeo); - --ion-color-base-rgb: var(--ion-color-vimeo-rgb); - --ion-color-contrast: var(--ion-color-vimeo-contrast); - --ion-color-contrast-rgb: var(--ion-color-vimeo-contrast-rgb); - --ion-color-shade: var(--ion-color-vimeo-shade); - --ion-color-tint: var(--ion-color-vimeo-tint); -} - -.ion-color-facebook { - --ion-color-base: var(--ion-color-facebook); - --ion-color-base-rgb: var(--ion-color-facebook-rgb); - --ion-color-contrast: var(--ion-color-facebook-contrast); - --ion-color-contrast-rgb: var(--ion-color-facebook-contrast-rgb); - --ion-color-shade: var(--ion-color-facebook-shade); - --ion-color-tint: var(--ion-color-facebook-tint); -} - -.ion-color-github { - --ion-color-base: #211F1F; - --ion-color-base-rgb: 33,31,31; - --ion-color-contrast: #ffffff; - --ion-color-contrast-rgb: 255,255,255; - --ion-color-shade: #1d1b1b; - --ion-color-tint: #373535; -} - -.ion-color-instagram { - --ion-color-base: #9537BC; - --ion-color-base-rgb: 149,55,188; - --ion-color-contrast: #ffffff; - --ion-color-contrast-rgb: 255,255,255; - --ion-color-shade: #8330a5; - --ion-color-tint: #a04bc3; -} - -/* - * Shared Variables - * ---------------------------------------------------------------------------- - * To customize the look and feel of this app, you can override - * the CSS variables found in Ionic's source files. - * To view all of the possible Ionic variables, see: - * https://ionicframework.com/docs/theming/css-variables#ionic-variables - */ - -:root { - --ion-headings-font-weight: 300; - - --ion-color-react: #61dbfb; - --ion-color-communication: #8e8d93; - --ion-color-tooling: #fe4c52; - --ion-color-services: #fd8b2d; - --ion-color-design: #fed035; - --ion-color-workshop: #69bb7b; - --ion-color-food: #3bc7c4; - --ion-color-documentation: #b16be3; - --ion-color-navigation: #6600cc; -} - -/* - * App iOS Variables - * ---------------------------------------------------------------------------- - * iOS only CSS variables can go here - */ - -.ios { - -} - -/* - * App Material Design Variables - * ---------------------------------------------------------------------------- - * Material Design only CSS variables can go here - */ - -.md { - -} diff --git a/03_source/mobile_baseline.bak/src/types/images.d.ts b/03_source/mobile_baseline.bak/src/types/images.d.ts deleted file mode 100644 index 403b544..0000000 --- a/03_source/mobile_baseline.bak/src/types/images.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.png' { - const content: string; - export default content; -} diff --git a/03_source/mobile_baseline.bak/src/util/types.ts b/03_source/mobile_baseline.bak/src/util/types.ts deleted file mode 100644 index 592d86c..0000000 --- a/03_source/mobile_baseline.bak/src/util/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface DispatchObject { - [key: string]: any; - type: string; -} - -type PromiseResolveValue = T extends Promise ? R : T; -type EffectType any> = ReturnType>; -type EffectReturnValue any> = PromiseResolveValue< - EffectType ->; -export type ActionType any> = - ReturnType extends DispatchObject ? ReturnType : EffectReturnValue; diff --git a/03_source/mobile_baseline.bak/tsconfig.json b/03_source/mobile_baseline.bak/tsconfig.json deleted file mode 100644 index 3d0a51a..0000000 --- a/03_source/mobile_baseline.bak/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx" - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/03_source/mobile_baseline.bak/tsconfig.node.json b/03_source/mobile_baseline.bak/tsconfig.node.json deleted file mode 100644 index 9d31e2a..0000000 --- a/03_source/mobile_baseline.bak/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "ESNext", - "moduleResolution": "Node", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/03_source/mobile_baseline.bak/vercel.json b/03_source/mobile_baseline.bak/vercel.json deleted file mode 100644 index 6a92648..0000000 --- a/03_source/mobile_baseline.bak/vercel.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rewrites": [ - { "source": "/(.*)", "destination": "/" } - ] -} diff --git a/03_source/mobile_baseline.bak/vite.config.ts b/03_source/mobile_baseline.bak/vite.config.ts deleted file mode 100644 index 68a8911..0000000 --- a/03_source/mobile_baseline.bak/vite.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], - server: { - port: 3000 - }, - define: { - 'process.env': process.env, - __HMR_CONFIG_NAME__: JSON.stringify('vite') - }, - css: { - preprocessorOptions: { - scss: { - api: 'modern', - }, - }, - } -})