commit e1b4c2ed9d5fe118b11458d2247d06729dd8e812 Author: Sergey Krylov Date: Sun Apr 30 16:37:12 2023 +0300 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b167e2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts +.idea diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..df09d60 --- /dev/null +++ b/index.ts @@ -0,0 +1,26 @@ +import express from 'express'; +import cors from 'cors'; +import * as path from 'path'; +import apiRouter from './src/api'; +import bodyParser from 'body-parser'; + +const app = express(); +const port = 5000; + +app.use(cors()) +app.use('/static', express.static(path.join(__dirname, 'static'))) +// app.use(express.static(path.join(__dirname, 'static'))) +// @ts-ignore +app.use(bodyParser.raw({ type: 'application/soap+xml' })); +app.use(bodyParser.json({ limit: '20mb' })); +// app.use(express.urlencoded({ extended: false })); +// @ts-ignore +app.use(express.json()); + +app.use('/api', apiRouter) + + +app.listen(port, () => { + console.log(`Arkids backend app start on port ${port}`); +}); + diff --git a/package.json b/package.json new file mode 100644 index 0000000..2e3ee8e --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "arkids-main-app-backend", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "@types/body-parser": "^1.19.2", + "@types/node": "^18.16.3", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "express": "^4.18.2", + "nodemon": "^2.0.22", + "ts-node": "^10.9.1", + "typescript": "^5.0.4", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@types/cors": "^2.8.13", + "@types/express": "types/express", + "@types/uuid": "^9.0.1" + }, + "scripts": { + "dev": "nodemon index.ts", + "start": "ts-node --esm index.ts" + } +} diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..ac25a11 --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,29 @@ +import express, { Router } from 'express'; +import { ApiRoute } from '../constants'; + +import hallsRouter from './routes/halls'; +import questRouter from './routes/quests'; +import rateRouter from './routes/rate'; +import statisticsRouter from './routes/statistic'; +import storiesRouter from './routes/stories'; +import textRouter from './routes/text'; +import infoRouter from './routes/info'; +import breadcrumbsRouter from './routes/breadcrumbs'; +import servicesRouter from './routes/services'; +import faqRouter from './routes/faq'; + +const apiRouter = express.Router() + +apiRouter.use(ApiRoute.BREADCRUMBS, breadcrumbsRouter) +apiRouter.use(ApiRoute.FAQ, faqRouter) +apiRouter.use(ApiRoute.INFO, infoRouter) +apiRouter.use(ApiRoute.SERVICES, servicesRouter) +apiRouter.use(ApiRoute.TEXT, textRouter) +apiRouter.use(ApiRoute.HALLS, hallsRouter) +apiRouter.use(ApiRoute.RATE, rateRouter) +apiRouter.use(ApiRoute.STORIES, storiesRouter) +apiRouter.use(ApiRoute.STATISTIC_INFO, statisticsRouter) +apiRouter.use(ApiRoute.QUESTS, questRouter) + + +export default apiRouter; diff --git a/src/api/routes/breadcrumbs/controller.ts b/src/api/routes/breadcrumbs/controller.ts new file mode 100644 index 0000000..0e2e9ae --- /dev/null +++ b/src/api/routes/breadcrumbs/controller.ts @@ -0,0 +1,57 @@ +import { Request, Response } from 'express'; +import { PAGE_LINK, PAGE_LINK_LABEL } from '../../../constants'; + +export type BreadcrumbsType = { + href?: string; + label: string; +}; + +const birthdayPageBreadcrumbs: BreadcrumbsType[] = [ + { href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] }, + { href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] }, + { href: PAGE_LINK.BIRTHDAY, label: PAGE_LINK_LABEL[PAGE_LINK.BIRTHDAY] }, +]; + +const graduationPageBreadcrumbs: BreadcrumbsType[] = [ + { href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] }, + { href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] }, + { href: PAGE_LINK.GRADUATION, label: PAGE_LINK_LABEL[PAGE_LINK.GRADUATION] }, +]; + +const outdoorsPageBreadcrumbs: BreadcrumbsType[] = [ + { href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] }, + { href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] }, + { href: PAGE_LINK.OUTDOORS, label: PAGE_LINK_LABEL[PAGE_LINK.OUTDOORS] }, +]; + +const questsPageBreadcrumbs: BreadcrumbsType[] = [ + { href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] }, + { href: PAGE_LINK.QUESTS, label: PAGE_LINK_LABEL[PAGE_LINK.QUESTS] }, +]; + + +export const getBreadcrumbs = (req: Request, res: Response) => { + // @ts-ignore + const {page} = req.body; + + switch (page) { + case PAGE_LINK.BIRTHDAY: { + return res.status(200).json(birthdayPageBreadcrumbs); + } + + case PAGE_LINK.GRADUATION: { + return res.status(200).json(graduationPageBreadcrumbs); + } + + case PAGE_LINK.OUTDOORS: { + return res.status(200).json(outdoorsPageBreadcrumbs); + } + + case PAGE_LINK.QUESTS: { + return res.status(200).json(questsPageBreadcrumbs); + } + + default: + return res.status(404); + } +} diff --git a/src/api/routes/breadcrumbs/index.ts b/src/api/routes/breadcrumbs/index.ts new file mode 100644 index 0000000..5c7fec7 --- /dev/null +++ b/src/api/routes/breadcrumbs/index.ts @@ -0,0 +1,10 @@ +import express, { Request, Response } from 'express'; +import { getBreadcrumbs } from './controller'; + +const router = express.Router() + +router.post('/', (req: Request, res: Response) => { + return getBreadcrumbs(req, res); +}) + +export default router; diff --git a/src/api/routes/faq/controller.ts b/src/api/routes/faq/controller.ts new file mode 100644 index 0000000..02945bc --- /dev/null +++ b/src/api/routes/faq/controller.ts @@ -0,0 +1,93 @@ +import { Request, Response } from 'express'; +import { PAGE_LINK } from '../../../constants'; + +export type QuestionType = { + answer: string; + question: string; +}; + +const birthdayQuestions: QuestionType[] = [ + { + answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?', + question: 'Как забронировать зал для проведения Дня рождения?', + }, + { + answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. ' + + 'Мероприятие оплачивается на месте перед его началом.', + question: 'Как производится оплата мероприятия?', + }, + { + answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?', + question: 'Какое максимальное количество детей допустимо на празднике?', + }, +]; + +const graduationQuestions: QuestionType[] = [ + { + answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?', + question: 'Как забронировать зал для проведения Дня рождения?', + }, + { + answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона.' + + ' Мероприятие оплачивается на месте перед его началом.', + question: 'Как производится оплата мероприятия?', + }, + { + answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?', + question: 'Какое максимальное количество детей допустимо на празднике?', + }, +]; + +const outdoorsQuestions: QuestionType[] = [ + { + answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?', + question: 'Как забронировать зал для проведения Дня рождения?', + }, + { + answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. ' + + 'Мероприятие оплачивается на месте перед его началом.', + question: 'Как производится оплата мероприятия?', + }, + { + answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?', + question: 'Какое максимальное количество детей допустимо на празднике?', + }, +]; + +export const getFaq = (req: Request, res: Response) => { + // @ts-ignore + const { id, page } = req.body; + + switch (page) { + case PAGE_LINK.BIRTHDAY: { + return res.status(200).json(birthdayQuestions); + } + + case PAGE_LINK.GRADUATION: { + return res.status(200).json(graduationQuestions); + } + + case PAGE_LINK.OUTDOORS: { + return res.status(200).json(outdoorsQuestions); + } + + case PAGE_LINK.QUESTS: { + switch (id) { + case 'eger': + return res.status(200).json(outdoorsQuestions); + + case 'mult': + return res.status(200).json(outdoorsQuestions); + + case 'faraon': + return res.status(200).json(outdoorsQuestions); + + default: + return res.status(404); + } + } + + default: + return res.status(404); + } +} diff --git a/src/api/routes/faq/index.ts b/src/api/routes/faq/index.ts new file mode 100644 index 0000000..2288903 --- /dev/null +++ b/src/api/routes/faq/index.ts @@ -0,0 +1,9 @@ +import express, { Request, Response } from 'express'; +import { getFaq } from './controller'; +const router = express.Router() + +router.post('/', (req: Request, res: Response) => { + return getFaq(req, res) +}) + +export default router; diff --git a/src/api/routes/halls/controller.ts b/src/api/routes/halls/controller.ts new file mode 100644 index 0000000..f1450cc --- /dev/null +++ b/src/api/routes/halls/controller.ts @@ -0,0 +1,28 @@ +import { Request, Response } from 'express'; +import * as path from 'path'; + + +const imageRootDir = 'static/images/information/halls/'; + +const Hall1Image = path.join(imageRootDir, 'hall1.jpg') +const Hall2Image = path.join(imageRootDir, 'hall2.jpg') +const Hall3Image = path.join(imageRootDir, 'hall3.jpg') + +export type HallType = { + area: number; + img: { + alt: string; + src: string; + }; + name: string; +}; + +const halls: HallType[] = [ + { area: 25, img: { alt: 'Средний Зал', src: Hall1Image }, name: 'Средний Зал' }, + { area: 50, img: { alt: 'Большой Зал', src: Hall2Image }, name: 'Большой Зал' }, + { area: 60, img: { alt: 'Зал Лофт', src: Hall3Image }, name: 'Зал Лофт' }, +]; + +export const getHalls = (req: Request, res: Response) => { + return res.status(200).json(halls); +} diff --git a/src/api/routes/halls/index.ts b/src/api/routes/halls/index.ts new file mode 100644 index 0000000..23bff35 --- /dev/null +++ b/src/api/routes/halls/index.ts @@ -0,0 +1,9 @@ +import express, { Request, Response } from 'express'; +import { getHalls } from './controller'; +const hallsRouter = express.Router() + +hallsRouter.get('/', (req: Request, res: Response) => { + return getHalls(req, res) +}) + +export default hallsRouter; diff --git a/src/api/routes/info/controller.ts b/src/api/routes/info/controller.ts new file mode 100644 index 0000000..f80efcd --- /dev/null +++ b/src/api/routes/info/controller.ts @@ -0,0 +1,25 @@ +import { Request, Response } from 'express'; +import { PAGE_LINK } from '../../../constants'; + +const videoLink = 'https://www.youtube.com/watch?v=VqWkQCRsKD0'; + +type HomeInfo = { + video: string; +}; +type ReturnInfoType = HomeInfo; + +export const getInfo = (req: Request, res: Response) => { + // @ts-ignore + const body = req.body; + + const { page } = body; + + switch (page) { + case PAGE_LINK.HOME: + return res.status(200).json({ video: videoLink }); + + default: + return res.status(404); + } + +} diff --git a/src/api/routes/info/index.ts b/src/api/routes/info/index.ts new file mode 100644 index 0000000..9334d87 --- /dev/null +++ b/src/api/routes/info/index.ts @@ -0,0 +1,10 @@ +import express, { Request, Response } from 'express'; +import { getInfo } from './controller'; + +const router = express.Router() + +router.post('/', (req: Request, res: Response) => { + return getInfo(req, res); +}) + +export default router; diff --git a/src/api/routes/quests/controller.ts b/src/api/routes/quests/controller.ts new file mode 100644 index 0000000..67e8c9d --- /dev/null +++ b/src/api/routes/quests/controller.ts @@ -0,0 +1,432 @@ +import { Request, Response } from 'express'; +import * as path from 'path'; +import { COLORS, ColorVariant } from '../../../constants'; +import { StoryType } from '../stories/controller'; +import {v4 as uuid} from 'uuid'; + +const imageRootDir = 'static/images/quests/'; + +const egerFeedbackImage = path.join(imageRootDir, 'stories/eger/desktop/feedback.png'); +const egerGalleryImage = path.join(imageRootDir, 'stories/eger/desktop/gallery.png'); +const egerPlotImage = path.join(imageRootDir, 'stories/eger/desktop/plot.png'); +const egerFeedbackMobileImage = path.join(imageRootDir, 'stories/eger/mobile/feedback.png'); +const egerGalleryMobileImage = path.join(imageRootDir, 'stories/eger/mobile/gallery.png'); +const egerPlotMobileImage = path.join(imageRootDir, 'stories/eger/mobile/plot.png'); + +const egerBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/eger/desktop/background.png') +const egerBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/eger/mobile/background.png') + +const egerCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/eger-card.png') +const egerCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/eger-card.png') + +const faraonFeedbackImage = path.join(imageRootDir, 'stories/faraon/desktop/feedback.png'); +const faraonGalleryImage = path.join(imageRootDir, 'stories/faraon/desktop/gallery.png'); +const faraonPlotImage = path.join(imageRootDir, 'stories/faraon/desktop/plot.png'); +const faraonFeedbackMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/feedback.png'); +const faraonGalleryMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/gallery.png'); +const faraonPlotMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/plot.png'); + +const faraonBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/faraon/desktop/background.png') +const faraonBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/faraon/mobile/background.png') + +const faraonCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/faraon-card.png') +const faraonCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/faraon-card.png') + +const multFeedbackImage = path.join(imageRootDir, '/stories/mult/desktop/feedback.png'); +const multGalleryImage = path.join(imageRootDir, '/stories/mult/desktop/gallery.png'); +const multPlotImage = path.join(imageRootDir, '/stories/mult/desktop/plot.png'); +const multFeedbackMobileImage = path.join(imageRootDir, '/stories/mult/mobile/feedback.png'); +const multGalleryMobileImage = path.join(imageRootDir, '/stories/mult/mobile/gallery.png'); +const multPlotMobileImage = path.join(imageRootDir, '/stories/mult/mobile/plot.png'); + +const multBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/mult/desktop/background.png') +const multBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/mult/mobile/background.png') + +const multCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/mult-card.png') +const multCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/mult-card.png') + +export type QuestItemType = { + age: { + styles?: object; + text: string; + }; + backgrounds?: { + mobileSrc: string; + src: string; + }; + cardBgImg: { + mobileSrc: string; + src: string; + }; + description: string; + id: string; + labels: { + items: { + mark?: true; + markMobile?: true; + text: string; + }[]; + styles?: object; + }; + partySize: { + max: number; + min: number; + styles?: object; + }; + price: number; + rating: number; + statisticsBackground: string; + stories?: StoryType[]; + time: { + styles?: object; + text: string; + }; + title: { + styles?: object; + text: string; + }; + type: { + styles?: object; + text: string; + }; +}; + +const egerStories: StoryType[] = [ + { + id: uuid(), + img: { + alt: 'Сюжет', + src: egerPlotImage, + }, + imgMobile: { + alt: 'Сюжет', + src: egerPlotMobileImage, + }, + modal: { + type: 'questPlot', + }, + title: 'Сюжет', + }, + { + id: uuid(), + img: { + alt: 'Отзывы наших клиентов', + src: egerFeedbackImage, + }, + imgMobile: { + alt: 'Отзывы наших клиентов', + src: egerFeedbackMobileImage, + }, + modal: { + type: 'feedback', + }, + title: 'Отзывы\\n наших клиентов', + }, + { + id: uuid(), + img: { + alt: 'Фотографии и видео', + src: egerGalleryImage, + }, + imgMobile: { + alt: 'Фотографии и видео', + src: egerGalleryMobileImage, + }, + modal: { + type: 'gallery', + }, + title: 'Фотографии\\n и видео', + }, +]; +export const egerQuest: QuestItemType = { + age: { + text: '10+', + }, + backgrounds: { + mobileSrc: egerBackgroundMobileImage, + src: egerBackgroundDesktopImage, + }, + cardBgImg: { + mobileSrc: egerCardBackgroundMobileImage, + src: egerCardBackgroundDesktopImage, + }, + description: 'Команда попадает в дом лесника с множеством спецэффектов и скрытых ходов. ' + + 'Есть возможность выбрать уровень сложности: от детского до самого страшного', + id: 'eger', + labels: { + items: [ + { text: 'страшный' }, + { mark: true, markMobile: true, text: 'для большой компании' }, + { mark: true, text: 'дымовые и световые спецэффекты' }, + { text: 'уровни с актёрами' }, + { mark: true, markMobile: true, text: 'подойдёт детям' }, + { mark: true, text: 'квест на день рождения' }, + { mark: true, markMobile: true, text: 'подвижный' }, + ], + }, + partySize: { + max: 12, + min: 2, + }, + price: 3500, + rating: 230, + statisticsBackground: COLORS[ColorVariant.GRADIENT_PERI4], + stories: egerStories, + time: { + text: '60 минут', + }, + title: { + styles: { + color: '#fff', + fontFamily: 'DwarvenStonecraftCyr', + fontSize: 45, + }, + text: 'Егерь', + }, + type: { + text: 'квест\\n с актёрами', + }, +}; + +const faraonStories: StoryType[] = [ + { + id: uuid(), + img: { + alt: 'Сюжет', + src: faraonPlotImage, + }, + imgMobile: { + alt: 'Сюжет', + src: faraonPlotMobileImage, + }, + modal: { + type: 'questPlot', + }, + title: 'Сюжет', + }, + { + id: uuid(), + img: { + alt: 'Отзывы наших клиентов', + src: faraonFeedbackImage, + }, + imgMobile: { + alt: 'Отзывы наших клиентов', + src: faraonFeedbackMobileImage, + }, + modal: { + type: 'feedback', + }, + title: 'Отзывы\\n наших клиентов', + }, + { + id: uuid(), + img: { + alt: 'Фотографии и видео', + src: faraonGalleryImage, + }, + imgMobile: { + alt: 'Фотографии и видео', + src: faraonGalleryMobileImage, + }, + modal: { + type: 'gallery', + }, + title: 'Фотографии\\n и видео', + }, +]; + +export const faraonQuest: QuestItemType = { + age: { + styles: { + borderColor: COLORS[ColorVariant.VERI_PERI], + color: COLORS[ColorVariant.VERI_PERI], + }, + text: '5+', + }, + backgrounds: { + mobileSrc: faraonBackgroundMobileImage, + src: faraonBackgroundDesktopImage, + }, + cardBgImg: { + mobileSrc: faraonCardBackgroundMobileImage, + src: faraonCardBackgroundDesktopImage, + }, + description: 'Команда попадает в пирамиду: тоннели, лабиринты, спуски и подъёмы, продуманная ' + + 'электроника и задания как в настоящем фильме про Египет', + id: 'faraon', + labels: { + items: [ + { text: 'древний египет' }, + { mark: true, markMobile: true, text: 'уровни с актёрами' }, + { mark: true, text: 'логический квест' }, + { mark: true, markMobile: true, text: 'подойдёт детям' }, + { text: 'подвижный' }, + { mark: true, markMobile: true, text: 'для большой компании' }, + { mark: true, text: 'квест на день рождения' }, + ], + styles: { + color: COLORS[ColorVariant.VERI_PERI], + }, + }, + partySize: { + max: 15, + min: 6, + styles: { + borderColor: COLORS[ColorVariant.VERI_PERI], + color: COLORS[ColorVariant.VERI_PERI], + }, + }, + price: 4500, + rating: 230, + statisticsBackground: COLORS[ColorVariant.GRADIENT_ORANGE], + stories: faraonStories, + time: { + styles: { + borderColor: COLORS[ColorVariant.VERI_PERI], + color: COLORS[ColorVariant.VERI_PERI], + }, + text: '60 минут', + }, + title: { + styles: { + border: '3px #fff', + color: 'linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)', + fontFamily: 'Angry', + fontSize: 45, + }, + text: 'Фараон', + }, + type: { + styles: { + color: COLORS[ColorVariant.VERI_PERI], + }, + text: 'экшн-квест', + }, +}; + +const stories: StoryType[] = [ + { + id: uuid(), + img: { + alt: 'Сюжет', + src: multPlotImage, + }, + imgMobile: { + alt: 'Сюжет', + src: multPlotMobileImage, + }, + modal: { + type: 'questPlot', + }, + title: 'Сюжет', + }, + { + id: uuid(), + img: { + alt: 'Отзывы наших клиентов', + src: multFeedbackImage, + }, + imgMobile: { + alt: 'Отзывы наших клиентов', + src: multFeedbackMobileImage, + }, + modal: { + type: 'feedback', + }, + title: 'Отзывы\\n наших клиентов', + }, + { + id: uuid(), + img: { + alt: 'Фотографии и видео', + src: multGalleryImage, + }, + imgMobile: { + alt: 'Фотографии и видео', + src: multGalleryMobileImage, + }, + modal: { + type: 'gallery', + }, + title: 'Фотографии\\n и видео', + }, +]; + +export const multQuest: QuestItemType = { + age: { + text: '5+', + }, + backgrounds: { + mobileSrc: multBackgroundMobileImage, + src: multBackgroundDesktopImage, + }, + cardBgImg: { + mobileSrc: multCardBackgroundMobileImage, + src: multCardBackgroundDesktopImage, + }, + description: 'Команда попадает в мультвселенную, где собраны самые популярные сюжеты мультфильмов и детские герои: ' + + 'Гравити Фолз, Алиса, Миньоны и Холодное сердце', + id: 'mult', + labels: { + items: [ + { text: 'детский квест' }, + { mark: true, markMobile: true, text: 'с сопровождающим' }, + { mark: true, text: 'логический квест' }, + { mark: true, markMobile: true, text: 'подойдёт детям' }, + { text: 'подвижный' }, + { mark: true, markMobile: true, text: 'для большой компании' }, + { mark: true, text: 'квест на день рождения' }, + ], + }, + partySize: { + max: 60, + min: 3, + }, + price: 7500, + rating: 230, + statisticsBackground: COLORS[ColorVariant.GRADIENT_GREEN], + stories, + time: { + text: '60 минут', + }, + title: { + styles: { + border: '4px #fff', + color: 'linear-gradient(134.56deg, #FFF500 11.78%, #FF3399 84.81%)', + fontFamily: 'Airfool', + fontSize: 54, + }, + text: 'Мульт', + }, + type: { + text: 'детский квест', + }, +}; + +export const getOne = (req: Request, res: Response) => { + const {id} = req.params; + + switch (id) { + case 'eger': + return res.status(200).json(egerQuest); + + case 'faraon': + return res.status(200).json(faraonQuest); + + case 'mult': + return res.status(200).json(multQuest); + + default: + return res.status(404); + } +} + + +export const getAll = (req: Request, res: Response) => { + return res.status(200).json([ + egerQuest, + faraonQuest, + multQuest, + ]) +} diff --git a/src/api/routes/quests/index.ts b/src/api/routes/quests/index.ts new file mode 100644 index 0000000..e2a2059 --- /dev/null +++ b/src/api/routes/quests/index.ts @@ -0,0 +1,14 @@ +import express, { Request, Response } from 'express'; +import { getAll, getOne } from './controller'; + +const questRouter = express.Router() + +questRouter.get('/', (req: Request, res: Response) => { + return getAll(req, res); +}) + +questRouter.get('/:id', (req: Request, res: Response) => { + return getOne(req, res); +}) + +export default questRouter; diff --git a/src/api/routes/rate/controller.ts b/src/api/routes/rate/controller.ts new file mode 100644 index 0000000..4ed68ad --- /dev/null +++ b/src/api/routes/rate/controller.ts @@ -0,0 +1,532 @@ +import { Request, Response } from 'express'; +import * as path from 'path'; +import { PAGE_LINK, SERVICE } from '../../../constants'; + +const imageRootDir = 'static/images/rate/'; + +const BaseImg = path.join(imageRootDir, 'base.png'); +const PremiumImg = path.join(imageRootDir, 'premium.png'); +const StandartImg = path.join(imageRootDir, 'standart.png'); +const VipImg = path.join(imageRootDir, 'vip.png'); + +export type SingleItemServiceType = { + enable: boolean; + price?: number; + startPrice?: number; + value?: string; +}; +export type ItemServiceType = { + [name: string]: SingleItemServiceType; +}; +export type RateItemType = { + id: string; + img: { + alt: string; + height?: number; + src: string; + width?: number; + }; + maxPeople: number; + overpayment: number; + price?: number; + pricePerPerson?: number; + services: ItemServiceType; + title: string; +}; + +const birthdayPageRate: RateItemType[] = [ + { + id: 'base', + img: { + alt: 'Базовый', + src: BaseImg, + }, + maxPeople: 6, + overpayment: 500, + price: 9900, + services: { + [SERVICE.ANIMATOR]: { + enable: true, + }, + [SERVICE.CRYO_SHOW]: { + enable: false, + price: 1000, + }, + [SERVICE.DECORATION]: { + enable: true, + }, + [SERVICE.HALL]: { + enable: true, + value: '1,5 часа', + }, + [SERVICE.MASTERCLASS]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.PHOTOS]: { + enable: false, + price: 1000, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SCREENWRITER]: { + enable: false, + price: 1000, + }, + [SERVICE.SHOW_DISCO]: { + enable: false, + price: 4000, + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enable: true, + }, + }, + title: 'Базовый', + }, + { + id: 'standart', + img: { + alt: 'Стандарт', + src: StandartImg, + }, + maxPeople: 10, + overpayment: 500, + price: 13900, + services: { + [SERVICE.ANIMATOR]: { + enable: true, + }, + [SERVICE.CRYO_SHOW]: { + enable: false, + price: 1000, + }, + [SERVICE.DECORATION]: { + enable: true, + }, + [SERVICE.HALL]: { + enable: true, + value: '2 часа', + }, + [SERVICE.MASTERCLASS]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.PHOTOS]: { + enable: true, + price: 1000, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SCREENWRITER]: { + enable: false, + price: 1000, + }, + [SERVICE.SHOW_DISCO]: { + enable: true, + price: 4000, + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enable: true, + }, + }, + title: 'Стандарт', + }, + { + id: 'premium', + img: { + alt: 'Премиум', + src: PremiumImg, + }, + maxPeople: 12, + overpayment: 500, + price: 19900, + services: { + [SERVICE.ANIMATOR]: { + enable: true, + }, + [SERVICE.CRYO_SHOW]: { + enable: false, + price: 1000, + }, + [SERVICE.DECORATION]: { + enable: true, + }, + [SERVICE.HALL]: { + enable: true, + value: '3 часа', + }, + [SERVICE.MASTERCLASS]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.PHOTOS]: { + enable: true, + price: 1000, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SCREENWRITER]: { + enable: true, + price: 1000, + }, + [SERVICE.SHOW_DISCO]: { + enable: true, + price: 4000, + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enable: true, + }, + }, + title: 'Премиум', + }, + { + id: 'vip', + img: { + alt: 'VIP', + src: VipImg, + }, + maxPeople: 20, + overpayment: 500, + price: 29900, + services: { + [SERVICE.ANIMATOR]: { + enable: true, + }, + [SERVICE.CRYO_SHOW]: { + enable: true, + price: 1000, + }, + [SERVICE.DECORATION]: { + enable: true, + }, + [SERVICE.HALL]: { + enable: true, + value: '4 часа', + }, + [SERVICE.MASTERCLASS]: { + enable: true, + startPrice: 1000, + }, + [SERVICE.PHOTOS]: { + enable: true, + price: 1000, + }, + [SERVICE.QUEST]: { + enable: true, + value: '2 квеста', + }, + [SERVICE.SCREENWRITER]: { + enable: true, + price: 1000, + }, + [SERVICE.SHOW_DISCO]: { + enable: true, + price: 4000, + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enable: true, + }, + }, + title: 'Вип', + }, +]; +const graduationPageRate: RateItemType[] = [ + { + id: 'base', + img: { + alt: 'Базовый', + src: BaseImg, + }, + maxPeople: 6, + overpayment: 500, + pricePerPerson: 1390, + services: { + [SERVICE.ANIMATION]: { + enable: true, + }, + [SERVICE.CRYO_SHOW]: { + enable: false, + price: 4000, + }, + [SERVICE.DECORATION]: { + enable: true, + }, + [SERVICE.DIPLOMA]: { + enable: true, + }, + [SERVICE.FACE_PAINTING]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.HALL]: { + enable: true, + value: '1,5 часа', + }, + [SERVICE.MASTERCLASS]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.PHOTOGRAPHER]: { + enable: true, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SCREENWRITER]: { + enable: false, + price: 1000, + }, + [SERVICE.SHOW_DISCO]: { + enable: false, + price: 4000, + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enable: true, + }, + }, + title: 'Базовый', + }, + { + id: 'standart', + img: { + alt: 'Стандарт', + src: StandartImg, + }, + maxPeople: 10, + overpayment: 500, + pricePerPerson: 1990, + services: { + [SERVICE.ANIMATION]: { + enable: true, + }, + [SERVICE.CRYO_SHOW]: { + enable: false, + price: 4000, + }, + [SERVICE.DECORATION]: { + enable: true, + }, + [SERVICE.DIPLOMA]: { + enable: true, + }, + [SERVICE.FACE_PAINTING]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.HALL]: { + enable: true, + value: '2 часа', + }, + [SERVICE.MASTERCLASS]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.PHOTOGRAPHER]: { + enable: true, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SCREENWRITER]: { + enable: true, + }, + [SERVICE.SHOW_DISCO]: { + enable: true, + price: 4000, + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enable: true, + }, + }, + title: 'Стандарт', + }, + { + id: 'premium', + img: { + alt: 'Премиум', + src: PremiumImg, + }, + maxPeople: 12, + overpayment: 500, + pricePerPerson: 2990, + services: { + [SERVICE.ANIMATION]: { + enable: true, + }, + [SERVICE.CRYO_SHOW]: { + enable: true, + }, + [SERVICE.DECORATION]: { + enable: true, + }, + [SERVICE.DIPLOMA]: { + enable: true, + }, + [SERVICE.FACE_PAINTING]: { + enable: true, + }, + [SERVICE.HALL]: { + enable: true, + value: '3 часа', + }, + [SERVICE.MASTERCLASS]: { + enable: true, + }, + [SERVICE.PHOTOGRAPHER]: { + enable: true, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SCREENWRITER]: { + enable: true, + price: 1000, + }, + [SERVICE.SHOW_DISCO]: { + enable: true, + price: 4000, + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enable: true, + }, + }, + title: 'Премиум', + }, +]; +const outdoorsPageRate: RateItemType[] = [ + { + id: 'base', + img: { + alt: 'Базовый', + src: BaseImg, + }, + maxPeople: 6, + overpayment: 500, + price: 9900, + services: { + [SERVICE.ANIMATION]: { + enable: true, + }, + [SERVICE.DURATION]: { + enable: true, + value: '2 часа', + }, + [SERVICE.FACE_PAINTING]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.PHOTOGRAPHER]: { + enable: true, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SHOW_DISCO]: { + enable: false, + price: 4000, + }, + [SERVICE.TEAM_BUILDING]: { + enable: true, + }, + }, + title: 'Базовый', + }, + { + id: 'standart', + img: { + alt: 'Стандарт', + src: StandartImg, + }, + maxPeople: 10, + overpayment: 500, + price: 13900, + services: { + [SERVICE.ANIMATION]: { + enable: true, + }, + [SERVICE.DURATION]: { + enable: true, + value: '3 часа', + }, + [SERVICE.FACE_PAINTING]: { + enable: false, + startPrice: 4900, + }, + [SERVICE.PHOTOGRAPHER]: { + enable: true, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SHOW_DISCO]: { + enable: true, + price: 4000, + }, + [SERVICE.TEAM_BUILDING]: { + enable: true, + }, + }, + title: 'Стандарт', + }, + { + id: 'premium', + img: { + alt: 'Премиум', + src: PremiumImg, + }, + maxPeople: 12, + overpayment: 500, + price: 19900, + services: { + [SERVICE.ANIMATION]: { + enable: true, + }, + [SERVICE.DURATION]: { + enable: true, + value: '4 часа', + }, + [SERVICE.FACE_PAINTING]: { + enable: true, + }, + [SERVICE.PHOTOGRAPHER]: { + enable: true, + }, + [SERVICE.QUEST]: { + enable: true, + }, + [SERVICE.SHOW_DISCO]: { + enable: true, + price: 4000, + }, + [SERVICE.TEAM_BUILDING]: { + enable: true, + }, + }, + title: 'Премиум', + }, +]; + +export const getRate = (req: Request, res: Response) => { + // @ts-ignore + const {page} = req.body; + + switch (page) { + case PAGE_LINK.BIRTHDAY: { + return res.status(200).json(birthdayPageRate); + } + + case PAGE_LINK.GRADUATION: { + return res.status(200).json(graduationPageRate); + } + + case PAGE_LINK.OUTDOORS: { + return res.status(200).json(outdoorsPageRate); + } + + default: + return res.status(404); + } +} diff --git a/src/api/routes/rate/index.ts b/src/api/routes/rate/index.ts new file mode 100644 index 0000000..124477d --- /dev/null +++ b/src/api/routes/rate/index.ts @@ -0,0 +1,10 @@ +import express, { Request, Response } from 'express'; +import { getRate } from './controller'; + +const rateRouter = express.Router() + +rateRouter.post('/', (req: Request, res: Response) => { + return getRate(req, res); +}) + +export default rateRouter; diff --git a/src/api/routes/services/controller.ts b/src/api/routes/services/controller.ts new file mode 100644 index 0000000..9fa7618 --- /dev/null +++ b/src/api/routes/services/controller.ts @@ -0,0 +1,64 @@ +import { Request, Response } from 'express'; +import { PAGE_LINK, SERVICE, servicesList, ServiceType } from '../../../constants'; + + +const birthdayPageServices: ServiceType[] = [ + servicesList[SERVICE.QUEST], + servicesList[SERVICE.HALL], + servicesList[SERVICE.ANIMATOR], + servicesList[SERVICE.DECORATION], + servicesList[SERVICE.TABLEWARE_FESTIVE], + servicesList[SERVICE.PHOTOS], + servicesList[SERVICE.SHOW_DISCO], + servicesList[SERVICE.SCREENWRITER], + servicesList[SERVICE.MASTERCLASS], + servicesList[SERVICE.CRYO_SHOW], +]; + +const graduationPageServices: ServiceType[] = [ + servicesList[SERVICE.QUEST], + servicesList[SERVICE.HALL], + servicesList[SERVICE.ANIMATION], + servicesList[SERVICE.PHOTOGRAPHER], + servicesList[SERVICE.DECORATION], + servicesList[SERVICE.TABLEWARE_FESTIVE], + servicesList[SERVICE.DIPLOMA], + servicesList[SERVICE.SHOW_DISCO], + servicesList[SERVICE.SCREENWRITER], + servicesList[SERVICE.MASTERCLASS], + servicesList[SERVICE.FACE_PAINTING], + servicesList[SERVICE.CRYO_SHOW], +]; + +const outdoorsPageServices: ServiceType[] = [ + servicesList[SERVICE.QUEST], + servicesList[SERVICE.DURATION], + servicesList[SERVICE.ANIMATION], + servicesList[SERVICE.PHOTOGRAPHER], + servicesList[SERVICE.TEAM_BUILDING], + servicesList[SERVICE.SHOW_DISCO], + servicesList[SERVICE.FACE_PAINTING], +]; + +export const getServices = (req: Request, res: Response) => { + // @ts-ignore + const {page} = req.body; + // @ts-ignore + console.log('Body', req.body); + switch (page) { + case PAGE_LINK.BIRTHDAY: { + return res.status(200).json(birthdayPageServices); + } + + case PAGE_LINK.GRADUATION: { + return res.status(200).json(graduationPageServices); + } + + case PAGE_LINK.OUTDOORS: { + return res.status(200).json(outdoorsPageServices); + } + + default: + return res.status(404); + } +} diff --git a/src/api/routes/services/index.ts b/src/api/routes/services/index.ts new file mode 100644 index 0000000..9c40452 --- /dev/null +++ b/src/api/routes/services/index.ts @@ -0,0 +1,11 @@ +import express, { Request, Response } from 'express'; +import { + getServices } from './controller'; + +const router = express.Router() + +router.post('/', (req: Request, res: Response) => { + return getServices(req, res); +}) + +export default router; diff --git a/src/api/routes/statistic/controller.ts b/src/api/routes/statistic/controller.ts new file mode 100644 index 0000000..e89a777 --- /dev/null +++ b/src/api/routes/statistic/controller.ts @@ -0,0 +1,939 @@ +import { Request, Response } from 'express'; +import * as path from 'path'; +import { PAGE_LINK } from '../../../constants'; + +const imageRootDir = 'static/images/information/statistics'; + +const DecorationDesktopImg = path.join(imageRootDir, 'desktop/decoration.png'); +const DiplomaDesktopImg = path.join(imageRootDir, 'desktop/graduation/diploma.png'); +const KidsDesktopImg = path.join(imageRootDir, 'desktop/kids.png'); +const LikeDesktopImg = path.join(imageRootDir, 'desktop/like.png'); +const StatDecorDesktopImg = path.join(imageRootDir, 'desktop/outdoors/decoration.png'); +const StatScooterDesktopImg = path.join(imageRootDir, 'desktop/outdoors/scooter.png'); +const PinataDesktopImg = path.join(imageRootDir, 'desktop/pinata.png'); +const ProgramsDesktopImg = path.join(imageRootDir, 'desktop/programms.png'); +const BooksDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/books.png'); +const KeysDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/keys.png'); +const MapDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/map.png'); +const RateDesktopImg = path.join(imageRootDir, 'desktop/rate.png'); +const StarDesktopImg = path.join(imageRootDir, 'desktop/star.png'); + +const CupMobileImg = path.join(imageRootDir, 'mobile/cup.png'); +const DecorationMobileImg = path.join(imageRootDir, 'mobile/decoration.png'); +const DiplomaMobileImg = path.join(imageRootDir, 'mobile/graduation/diploma.png'); +const KidsMobileImg = path.join(imageRootDir, 'mobile/kids.png'); +const Kids2MobileImg = path.join(imageRootDir, 'mobile/kids2.png'); +const LikeMobileImg = path.join(imageRootDir, 'mobile/like.png'); +const StatDecorMobileImg = path.join(imageRootDir, 'mobile/outdoors/decoration.png'); +const StatScooterMobileImg = path.join(imageRootDir, 'mobile/outdoors/scooter.png'); +const PinataMobileImg = path.join(imageRootDir, 'mobile/pinata.png'); +const ProgramsMobileImg = path.join(imageRootDir, 'mobile/programms.png'); +const BooksMobileImg = path.join(imageRootDir, 'mobile/quests/eger/books.png'); +const KeysMobileImg = path.join(imageRootDir, 'mobile/quests/eger/keys.png'); +const MapMobileImg = path.join(imageRootDir, 'mobile/quests/eger/map.png'); +const RateMobileImg = path.join(imageRootDir, 'mobile/rate.png'); +const StarMobileImg = path.join(imageRootDir, 'mobile/star.png'); + +export type StatisticsItem = { + img?: { + alt: string; + mobilePosition?: { + bottom?: number; + left?: number; + right?: number; + top?: number; + }; + mobileSrc?: string; + position?: { + bottom?: number; + left?: number; + right?: number; + top?: number; + }; + src: string; + height: number; + mobileHeight?: number; + mobileWidth?: number; + width: number; + }; + mobileOrder?: number; + mobileText?: string; + order?: number; + size: { + sm: number | 'auto'; + width: number | 'auto'; + xs: number; + }; + text: string; + title: string; +}; + +const birthdayItems: StatisticsItem[] = [ + { + size: { + sm: 'auto', + width: 'auto', + xs: 12, + }, + text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:', + title: 'Доверьтесь лидеру\\n в сфере развлечений', + }, + { + img: { + alt: 'combo', + mobilePosition: { + right: 12, + top: -10, + }, + mobileSrc: RateMobileImg, + mobileHeight: 106, + mobileWidth: 60, + position: { + right: 22, + top: 15, + }, + src: RateDesktopImg, + width: 80, + height: 90 + }, + size: { + sm: 2, + width: 130, + xs: 5, + }, + text: 'комбо для\\n лучшего праздника', + title: 'Выгодные', + }, + { + img: { + alt: 'programs', + mobilePosition: { + right: 10, + top: -20, + }, + mobileSrc: ProgramsMobileImg, + mobileHeight: 84, + mobileWidth: 110, + position: { + right: 0, + top: 15, + }, + src: ProgramsDesktopImg, + width: 72, + height: 96 + }, + size: { + sm: 2, + width: 210, + xs: 6, + }, + text: 'индивидуальные программы', + title: 'Тематические', + }, + { + img: { + alt: 'decor', + mobilePosition: { + right: 10, + top: 10, + }, + mobileSrc: DecorationMobileImg, + mobileHeight: 116, + mobileWidth: 90, + position: { + right: 35, + top: 15, + }, + src: DecorationDesktopImg, + width: 106, + height: 80 + }, + size: { + sm: 2, + width: 180, + xs: 5, + }, + text: 'украшенные\\n и просторные', + title: 'Залы', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 26, + top: -10, + }, + mobileSrc: KidsMobileImg, + mobileHeight: 108, + mobileWidth: 74, + position: { + right: -10, + top: 16, + }, + src: KidsDesktopImg, + width: 90, + height: 94 + }, + mobileText: 'для детей разных возрастов', + size: { + sm: 2, + width: 160, + xs: 6, + }, + text: 'для детей\\n разных возрастов', + title: 'Развлечения', + }, +]; + +const homeItems: StatisticsItem[] = [ + { + size: { + sm: 'auto', + width: 'auto', + xs: 12, + }, + text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:', + title: 'Доверьтесь лидеру\\n в сфере развлечений', + }, + { + img: { + alt: 'pinata', + mobilePosition: { + left: 37, + top: -40, + }, + mobileSrc: PinataMobileImg, + mobileHeight: 131, + mobileWidth: 128, + src: PinataDesktopImg, + width: 123, + height: 120 + }, + size: { + sm: 2, + width: 150, + xs: 5, + }, + text: 'праздников\\n проведено', + title: '5700 +', + }, + { + img: { + alt: 'star', + mobilePosition: { + right: 6, + top: -20, + }, + mobileSrc: StarMobileImg, + mobileHeight: 112, + mobileWidth: 112, + position: { + right: 35, + top: 15, + }, + src: StarDesktopImg, + width: 66, + height: 66 + }, + size: { + sm: 2, + width: 190, + xs: 6, + }, + text: 'отзывы клиентов\\n на Яндекс', + title: '5 звёзд', + }, + { + img: { + alt: 'like', + mobilePosition: { + right: 17, + top: -14, + }, + mobileSrc: LikeMobileImg, + mobileHeight: 89, + mobileWidth: 87, + position: { + right: 5, + top: 15, + }, + src: LikeDesktopImg, + width: 76, + height: 72 + }, + size: { + sm: 2, + width: 150, + xs: 5, + }, + text: 'цены и гибкий\\n подход к клиенту', + title: 'Выгодные', + }, + { + img: { + alt: 'cup', + mobilePosition: { + right: 3, + top: -29, + }, + src: CupMobileImg, + height: 101, + width: 101, + mobileHeight: 131, + mobileWidth: 131 + }, + size: { + sm: 2, + width: 190, + xs: 6, + }, + text: 'успешной работы\\n в сфере развлечений', + title: '6 лет', + }, +]; + +const graduationItems: StatisticsItem[] = [ + { + size: { + sm: 'auto', + width: 'auto', + xs: 12, + }, + text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:', + title: 'Доверьтесь лидеру в сфере развлечений', + }, + { + img: { + alt: 'combo', + mobilePosition: { + left: 12, + top: -10, + }, + mobileSrc: RateMobileImg, + mobileHeight: 106, + mobileWidth: 60, + position: { + right: 22, + top: 5, + }, + src: RateDesktopImg, + width: 80, + height: 90 + }, + size: { + sm: 2, + width: 130, + xs: 5, + }, + text: 'комбо для лучшего праздника', + title: 'Выгодные', + }, + { + img: { + alt: 'diploma', + mobilePosition: { + right: 10, + top: -10, + }, + mobileSrc: DiplomaMobileImg, + mobileHeight: 90, + mobileWidth: 100, + position: { + right: 22, + top: 15, + }, + src: DiplomaDesktopImg, + width: 76, + height: 85 + }, + size: { + sm: 2, + width: 210, + xs: 6, + }, + text: 'индивидуальных\\n дипломов', + title: 'Вручение', + }, + { + img: { + alt: 'decor', + mobilePosition: { + right: 10, + top: 10, + }, + mobileSrc: DecorationMobileImg, + mobileHeight: 116, + mobileWidth: 90, + position: { + right: 35, + top: 10, + }, + src: DecorationDesktopImg, + width: 106, + height: 80 + }, + size: { + sm: 2, + width: 180, + xs: 5, + }, + text: 'украшенные и просторные', + title: 'Залы', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 10, + top: -10, + }, + mobileSrc: KidsMobileImg, + mobileHeight: 108, + mobileWidth: 74, + position: { + right: -10, + top: 15, + }, + src: KidsDesktopImg, + width: 90, + height: 94 + }, + size: { + sm: 2, + width: 160, + xs: 6, + }, + text: 'для больших\\n команд', + title: 'Квесты', + }, +]; + +const outdoorsItems: StatisticsItem[] = [ + { + size: { + sm: 'auto', + width: 'auto', + xs: 12, + }, + text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:', + title: 'Доверьтесь лидеру\\n в сфере развлечений', + }, + { + img: { + alt: 'combo', + mobilePosition: { + left: 12, + top: -10, + }, + mobileSrc: RateMobileImg, + mobileHeight: 106, + mobileWidth: 60, + position: { + right: 22, + top: 5, + }, + src: RateDesktopImg, + width: 80, + height: 90 + }, + size: { + sm: 2, + width: 130, + xs: 5, + }, + text: 'комбо для\\n лучшего праздника', + title: 'Выгодные', + }, + { + img: { + alt: 'programs', + mobilePosition: { + right: 10, + top: -10, + }, + mobileSrc: StatScooterMobileImg, + mobileHeight: 116, + mobileWidth: 114, + position: { + right: 22, + top: 15, + }, + src: StatScooterDesktopImg, + width: 94, + height: 98 + }, + size: { + sm: 2, + width: 210, + xs: 6, + }, + text: 'по Москве\\n и Московской области', + title: 'Выезд', + }, + { + img: { + alt: 'decor', + mobilePosition: { + right: 14, + top: 10, + }, + mobileSrc: StatDecorMobileImg, + mobileHeight: 76, + mobileWidth: 136, + position: { + right: 35, + top: 10, + }, + src: StatDecorDesktopImg, + width: 60, + height: 108 + }, + size: { + sm: 2, + width: 180, + xs: 5, + }, + text: 'реквизит\\n на заказ', + title: 'Проф', + }, + { + img: { + alt: 'kids', + mobilePosition: { + left: 28, + top: -10, + }, + mobileSrc: KidsMobileImg, + mobileHeight: 108, + mobileWidth: 74, + position: { + right: -10, + top: 15, + }, + src: KidsDesktopImg, + width: 90, + height: 94 + }, + size: { + sm: 2, + width: 160, + xs: 6, + }, + text: 'для детей\\n разных возрастов', + title: 'Развлечения', + }, +]; + +const egerQuestItems: StatisticsItem[] = [ + { + size: { + sm: 'auto', + width: 'auto', + xs: 12, + }, + text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:', + title: 'Доверьтесь лидеру\\n в сфере развлечений', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 15, + top: -20, + }, + mobileSrc: Kids2MobileImg, + mobileHeight: 106, + mobileWidth: 110, + position: { + right: 22, + top: 20, + }, + src: KidsDesktopImg, + width: 90, + height: 94 + }, + mobileOrder: 1, + order: 1, + size: { + sm: 2, + width: 200, + xs: 5, + }, + text: 'для детей\\n разных возрастов', + title: 'Задания', + }, + { + img: { + alt: 'programs', + mobilePosition: { + right: -20, + top: 5, + }, + mobileSrc: BooksMobileImg, + mobileHeight: 116, + mobileWidth: 122, + position: { + right: 22, + top: 15, + }, + src: BooksDesktopImg, + width: 109, + height: 90 + }, + mobileOrder: 4, + order: 2, + size: { + sm: 2, + width: 180, + xs: 6, + }, + text: 'сюжет\\n каждый год', + title: 'Новый', + }, + { + img: { + alt: 'decor', + mobilePosition: { + right: 14, + top: 10, + }, + mobileSrc: MapMobileImg, + mobileHeight: 68, + mobileWidth: 94, + position: { + right: 35, + top: 10, + }, + src: MapDesktopImg, + width: 69, + height: 94 + }, + mobileOrder: 3, + order: 3, + size: { + sm: 2, + width: 160, + xs: 5, + }, + text: 'различных\\n локаций', + title: 'Шесть', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 0, + top: -15, + }, + mobileSrc: KeysMobileImg, + mobileHeight: 64, + mobileWidth: 94, + position: { + right: 30, + top: 15, + }, + src: KeysDesktopImg, + width: 69, + height: 94 + }, + mobileOrder: 2, + order: 4, + size: { + sm: 2, + width: 140, + xs: 6, + }, + text: 'система\\n бронирования', + title: 'Быстрая', + }, +]; + +const faraonQuestItems: StatisticsItem[] = [ + { + size: { + sm: 'auto', + width: 'auto', + xs: 12, + }, + text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:', + title: 'Доверьтесь лидеру\\n в сфере развлечений', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 15, + top: -20, + }, + mobileSrc: Kids2MobileImg, + mobileHeight: 106, + mobileWidth: 110, + position: { + right: 22, + top: 20, + }, + src: KidsDesktopImg, + width: 90, + height: 94 + }, + mobileOrder: 1, + order: 1, + size: { + sm: 2, + width: 200, + xs: 5, + }, + text: 'для детей\\n разных возрастов', + title: 'Задания', + }, + { + img: { + alt: 'programs', + mobilePosition: { + right: -20, + top: 5, + }, + mobileSrc: BooksMobileImg, + mobileHeight: 116, + mobileWidth: 122, + position: { + right: 22, + top: 15, + }, + src: BooksDesktopImg, + width: 109, + height: 90 + }, + mobileOrder: 4, + order: 2, + size: { + sm: 2, + width: 180, + xs: 6, + }, + text: 'сюжет\\n каждый год', + title: 'Новый', + }, + { + img: { + alt: 'decor', + mobilePosition: { + right: 14, + top: 10, + }, + mobileSrc: MapMobileImg, + mobileHeight: 68, + mobileWidth: 94, + position: { + right: 35, + top: 10, + }, + src: MapDesktopImg, + width: 69, + height: 94 + }, + mobileOrder: 3, + order: 3, + size: { + sm: 2, + width: 160, + xs: 5, + }, + text: 'различных\\n локаций', + title: 'Шесть', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 0, + top: -15, + }, + mobileSrc: KeysMobileImg, + mobileHeight: 64, + mobileWidth: 94, + position: { + right: 30, + top: 15, + }, + src: KeysDesktopImg, + width: 69, + height: 94 + }, + mobileOrder: 2, + order: 4, + size: { + sm: 2, + width: 140, + xs: 6, + }, + text: 'система\\n бронирования', + title: 'Быстрая', + }, +]; + +const multQuestItems: StatisticsItem[] = [ + { + size: { + sm: 'auto', + width: 'auto', + xs: 12, + }, + text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:', + title: 'Доверьтесь лидеру\\n в сфере развлечений', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 15, + top: -20, + }, + mobileSrc: Kids2MobileImg, + mobileHeight: 106, + mobileWidth: 110, + position: { + right: 22, + top: 20, + }, + src: KidsDesktopImg, + width: 90, + height: 94 + }, + mobileOrder: 1, + order: 1, + size: { + sm: 2, + width: 200, + xs: 5, + }, + text: 'для детей\\n разных возрастов', + title: 'Задания', + }, + { + img: { + alt: 'programs', + mobilePosition: { + right: -20, + top: 5, + }, + mobileSrc: BooksMobileImg, + mobileHeight: 116, + mobileWidth: 122, + position: { + right: 22, + top: 15, + }, + src: BooksDesktopImg, + width: 109, + height: 90 + }, + mobileOrder: 4, + order: 2, + size: { + sm: 2, + width: 180, + xs: 6, + }, + text: 'сюжет\\n каждый год', + title: 'Новый', + }, + { + img: { + alt: 'decor', + mobilePosition: { + right: 14, + top: 10, + }, + mobileSrc: MapMobileImg, + mobileHeight: 68, + mobileWidth: 94, + position: { + right: 35, + top: 10, + }, + src: MapDesktopImg, + width: 69, + height: 94 + }, + mobileOrder: 3, + order: 3, + size: { + sm: 2, + width: 160, + xs: 5, + }, + text: 'различных\\n локаций', + title: 'Шесть', + }, + { + img: { + alt: 'kids', + mobilePosition: { + right: 0, + top: -15, + }, + mobileSrc: KeysMobileImg, + mobileHeight: 64, + mobileWidth: 94, + position: { + right: 30, + top: 15, + }, + src: KeysDesktopImg, + width: 69, + height: 94 + }, + mobileOrder: 2, + order: 4, + size: { + sm: 2, + width: 140, + xs: 6, + }, + text: 'система\\n бронирования', + title: 'Быстрая', + }, +]; + +export const getStatistics = (req: Request, res: Response) => { + // @ts-ignore + const {page, id} = req.body; + + switch (page) { + case PAGE_LINK.BIRTHDAY: { + return res.status(200).json(birthdayItems); + } + + case PAGE_LINK.GRADUATION: { + return res.status(200).json(graduationItems); + } + + case PAGE_LINK.OUTDOORS: { + return res.status(200).json(outdoorsItems); + } + + case PAGE_LINK.HOME: { + return res.status(200).json(homeItems); + } + + case PAGE_LINK.QUESTS: { + switch (id) { + case 'eger': + return res.status(200).json(egerQuestItems); + + case 'mult': + return res.status(200).json(multQuestItems); + + case 'faraon': + return res.status(200).json(faraonQuestItems); + + default: + return res.status(404); + } + } + + default: + return res.status(404); + } +} diff --git a/src/api/routes/statistic/index.ts b/src/api/routes/statistic/index.ts new file mode 100644 index 0000000..c3c4071 --- /dev/null +++ b/src/api/routes/statistic/index.ts @@ -0,0 +1,10 @@ +import express, { Request, Response } from 'express'; +import { getStatistics } from './controller'; + +const statisticsRouter = express.Router() + +statisticsRouter.post('/', (req: Request, res: Response) => { + return getStatistics(req, res); +}) + +export default statisticsRouter; diff --git a/src/api/routes/stories/controller.ts b/src/api/routes/stories/controller.ts new file mode 100644 index 0000000..b93bff9 --- /dev/null +++ b/src/api/routes/stories/controller.ts @@ -0,0 +1,327 @@ +import { Request, Response } from 'express'; +import * as path from 'path'; +import { v4 as uuid } from 'uuid'; +import { PAGE_LINK } from '../../../constants'; + +const imageRootDir = 'static/images/stories/'; + +const faqImage = path.join(imageRootDir, 'birthday/faq.png') +const faqMobileImage = path.join(imageRootDir, 'birthday/faq_mobile.png') +const feedbackImage = path.join(imageRootDir, 'birthday/feedback.png') +const feedbackMobileImage = path.join(imageRootDir, 'birthday/feedback_mobile.png') +const photoImage = path.join(imageRootDir, 'birthday/photo.png') +const photoMobileImage = path.join(imageRootDir, 'birthday/photo_mobile.png') + +const example = path.join(imageRootDir, 'example.png') +const example2 = path.join(imageRootDir, 'example2.jpg') + +export type StoryFeedbackModalType = {}; +export type StoryGalleryModalType = {}; +export type StoryInfoModalType = {}; +export type StoryQuestPlotModalType = {}; + +export type StoryModalContent = StoryFeedbackModalType | StoryGalleryModalType | StoryInfoModalType | StoryQuestPlotModalType; +export type StoryModalType = 'faq' | 'feedback' | 'gallery' | 'info' | 'questPlot'; +export type StoryImageType = { + alt: string; + height?: number; + src: string; + width?: number; +}; + +export type StoryType = { + border?: { + inner?: { + color: string; + }; + outer?: { + color: string; + }; + }; + id: string; + img: StoryImageType; + imgMobile?: StoryImageType; + modal: { + content?: StoryModalContent; + type: StoryModalType; + }; + title?: string; +}; + + + +const birthdayPageStories: StoryType[] = [ + { + id: uuid(), + img: { + alt: 'Ответы на вопросы', + src: faqImage, + }, + imgMobile: { + alt: 'Ответы на вопросы', + src: faqMobileImage, + }, + modal: { + type: 'faq', + }, + title: 'Ответы\\n на вопросы', + }, + { + id: uuid(), + img: { + alt: 'Отзывы наших клиентов', + src: feedbackImage, + }, + imgMobile: { + alt: 'Отзывы наших клиентов', + src: feedbackMobileImage, + }, + modal: { + type: 'feedback', + }, + title: 'Отзывы\\n наших клиентов', + }, + { + id: uuid(), + img: { + alt: 'Фотографии и видео', + src: photoImage, + }, + imgMobile: { + alt: 'Фотографии и видео', + src: photoMobileImage, + }, + modal: { + type: 'gallery', + }, + title: 'Фотографии\n и видео', + }, +]; +const graduationPageStories: StoryType[] = [ + { + id: uuid(), + img: { + alt: 'Ответы на вопросы', + src: faqImage, + }, + imgMobile: { + alt: 'Ответы на вопросы', + src: faqMobileImage, + }, + modal: { + type: 'faq', + }, + title: 'Ответы\\n на вопросы', + }, + { + id: uuid(), + img: { + alt: 'Отзывы наших клиентов', + src: feedbackImage, + }, + imgMobile: { + alt: 'Отзывы наших клиентов', + src: feedbackMobileImage, + }, + modal: { + type: 'feedback', + }, + title: 'Отзывы\\n наших клиентов', + }, + { + id: uuid(), + img: { + alt: 'Фотографии и видео', + src: photoImage, + }, + imgMobile: { + alt: 'Фотографии и видео', + src: photoMobileImage, + }, + modal: { + type: 'gallery', + }, + title: 'Фотографии\n и видео', + }, +]; +const outdoorsPageStories: StoryType[] = [ + { + id: uuid(), + img: { + alt: 'Ответы на вопросы', + src: faqImage, + }, + imgMobile: { + alt: 'Ответы на вопросы', + src: faqMobileImage, + }, + modal: { + type: 'faq', + }, + title: 'Ответы\\n на вопросы', + }, + { + id: uuid(), + img: { + alt: 'Отзывы наших клиентов', + src: feedbackImage, + }, + imgMobile: { + alt: 'Отзывы наших клиентов', + src: feedbackMobileImage, + }, + modal: { + type: 'feedback', + }, + title: 'Отзывы\\n наших клиентов', + }, + { + id: uuid(), + img: { + alt: 'Фотографии и видео', + src: photoImage, + }, + imgMobile: { + alt: 'Фотографии и видео', + src: photoMobileImage, + }, + modal: { + type: 'gallery', + }, + title: 'Фотографии\n и видео', + }, +]; + +const homePageStories: StoryType[] = [ + { + id: uuid(), + img: { + alt: 'Рекомендации по квестам', + src: example, + }, + imgMobile: { + alt: 'Рекомендации по квестам', + src: example, + }, + modal: { + type: 'info', + }, + title: 'Рекомендации\\n по квестам', + }, + { + id: uuid(), + img: { + alt: 'День Рождения в Arkids парке', + src: example2, + }, + imgMobile: { + alt: 'День Рождения в Arkids парке', + src: example2, + }, + modal: { + type: 'info', + }, + title: 'День Рождения\\n в Arkids парке', + }, + { + id: uuid(), + img: { + alt: 'Новые программы для праздника', + src: example, + }, + imgMobile: { + alt: 'Новые программы для праздника', + src: example, + }, + modal: { + type: 'info', + }, + title: 'Новые программы\\n для праздника', + }, + { + id: uuid(), + img: { + alt: 'Рекомендации по квестам', + src: example, + }, + imgMobile: { + alt: 'Рекомендации по квестам', + src: example, + }, + modal: { + type: 'info', + }, + title: 'Рекомендации\\n по квестам', + }, + { + id: uuid(), + img: { + alt: 'День Рождения в Arkids парке', + src: example2, + }, + imgMobile: { + alt: 'День Рождения в Arkids парке', + src: example2, + }, + modal: { + type: 'info', + }, + title: 'День Рождения\\n в Arkids парке', + }, + { + id: uuid(), + img: { + alt: 'Новые программы для праздника', + src: example, + }, + imgMobile: { + alt: 'Новые программы для праздника', + src: example, + }, + modal: { + type: 'info', + }, + title: 'Новые программы\\n для праздника', + }, + { + id: uuid(), + img: { + alt: 'Новые программы для праздника', + src: example, + }, + imgMobile: { + alt: 'Новые программы для праздника', + src: example, + }, + modal: { + type: 'info', + }, + title: 'Новые программы\\n для праздника', + }, +]; + +export const getStories = (req: Request, res: Response) => { + // @ts-ignore + const {page} = req.body; + + switch (page) { + case PAGE_LINK.BIRTHDAY: { + return res.status(200).json(birthdayPageStories); + } + + case PAGE_LINK.GRADUATION: { + return res.status(200).json(graduationPageStories); + } + + case PAGE_LINK.OUTDOORS: { + return res.status(200).json(outdoorsPageStories); + } + + case PAGE_LINK.HOME: { + return res.status(200).json(homePageStories); + } + + default: + return res.status(404); + } +} diff --git a/src/api/routes/stories/index.ts b/src/api/routes/stories/index.ts new file mode 100644 index 0000000..1b652cb --- /dev/null +++ b/src/api/routes/stories/index.ts @@ -0,0 +1,10 @@ +import express, { Request, Response } from 'express'; +import { getStories } from './controller'; + +const storiesRouter = express.Router() + +storiesRouter.post('/', (req: Request, res: Response) => { + return getStories(req, res); +}) + +export default storiesRouter; diff --git a/src/api/routes/text/controller.ts b/src/api/routes/text/controller.ts new file mode 100644 index 0000000..63e42c5 --- /dev/null +++ b/src/api/routes/text/controller.ts @@ -0,0 +1,98 @@ +import { Request, Response } from 'express'; +import { PAGE_LINK, TextSection } from '../../../constants'; + +const birthdayTitleText = { + description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, тематические программы, ' + + 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений', + title: 'День Рождения', +}; + +const graduationTitleText = { + description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, индивидуальные дипломы, ' + + 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений', + title: 'Выпускной', +}; + +const outdoorsTitleText = { + description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, ' + + 'тематические программы, творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений', + title: 'Выездной праздник', +}; + +const questsTitleText = { + description: 'Выбираете квест для ребенка? Может, для компании своих друзей/коллег? ' + + 'Или просто хотите отдохнуть всей семьей?\\n\\n ' + + 'У нас есть решения под любые цели и для любых возрастов!\n', + title: 'Квесты', +}; + +const parkInfo = { + text: '-интерактивный парк нового поколения,\n' + + ' объединяющий популярные услуги\n' + + ' и развлечения для детей и взрослых', + title: 'Arkids Парк', +}; + +export const getTitle = (req: Request, res: Response) => { + console.log('headers', req.headers); + + // @ts-ignore + const body = req.body; + console.log('body', body); + const { page, section } = body; + + switch (page) { + case PAGE_LINK.BIRTHDAY: { + switch (section) { + case TextSection.TITLE: + return res.status(200).json(birthdayTitleText); + + default: + return res.status(404); + } + } + + case PAGE_LINK.GRADUATION: { + switch (section) { + case TextSection.TITLE: + return res.status(200).json(graduationTitleText); + + default: + return res.status(404); + } + } + + case PAGE_LINK.OUTDOORS: { + switch (section) { + case TextSection.TITLE: + return res.status(200).json(outdoorsTitleText); + + default: + return res.status(404); + } + } + + case PAGE_LINK.QUESTS: { + switch (section) { + case TextSection.TITLE: + return res.status(200).json(questsTitleText); + + default: + return res.status(404); + } + } + + case PAGE_LINK.HOME: { + switch (section) { + case TextSection.PARK: + return res.status(200).json(parkInfo); + + default: + return res.status(404); + } + } + + default: + return res.status(404); + } +} diff --git a/src/api/routes/text/index.ts b/src/api/routes/text/index.ts new file mode 100644 index 0000000..ca6ccaf --- /dev/null +++ b/src/api/routes/text/index.ts @@ -0,0 +1,21 @@ +// const express = require('express') + +import express, { NextFunction, Request, Response } from 'express'; +import { getTitle } from './controller'; +const router = express.Router() + +// middleware that is specific to this router +router.use((req: Request, res: Response, next: NextFunction) => { + console.log('Time: ', Date.now()) + next() +}) + +router.get('/', (req: Request, res: Response) => { + return res.send('Api text GET response') +}) + +router.post('/', (req: Request, res: Response) => { + return getTitle(req, res); +}) + +export default router; diff --git a/src/constants/colors.module.scss b/src/constants/colors.module.scss new file mode 100644 index 0000000..0acea87 --- /dev/null +++ b/src/constants/colors.module.scss @@ -0,0 +1,39 @@ +// Color list +$color_veri_peri: #6767AB; +$color_veri_peri_dark: #5656A9; +$color_orange: #FFB76F; +$color_gradient_red: linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%); +$color_gradient_red_dark: linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%); +$color_gradient_peri: linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%); +$color_gradient_peri3: linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%); +$color_gradient_peri4: linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%); +$color_gradient_peri2: linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%); +$color_gradient_yellow: linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%); +$color_gradient_orange: linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%); +$color_gradient_green: linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%);; +$color_white: #FFFFFF; +$color_black: #000000; +$color_grey: #F1F7FD; +$color_green: #15B555; +$color_black_light: #3C3C3C; + +:export { + veri_peri: $color_veri_peri; + veri_peri_dark: $color_veri_peri_dark; + orange: $color_orange; + gradient_red: $color_gradient_red; + gradient_red_dark: $color_gradient_red_dark; + gradient_peri: $color_gradient_peri; + gradient_peri2: $color_gradient_peri2; + gradient_peri3: $color_gradient_peri3; + gradient_peri4: $color_gradient_peri4; + gradient_yellow: $color_gradient_yellow; + gradient_orange: $color_gradient_orange; + gradient_green: $color_gradient_green; + white: $color_white; + black: $color_black; + black_light: $color_black_light; + grey: $color_grey; + green: $color_green; + transparent: 'transparent'; +} diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 0000000..d9251a8 --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,224 @@ +export const enum PAGE_LINK { + ABOUT = '/about', + BIRTHDAY = '/holidays/birthday', + COMBO = '/combo', + CONTACTS = '/contacts', + COOPERATION = '/cooperation', + ESCORT = '/escort', + FAQ = '/faq', + FEEDBACK = '/feedback', + FRANCHISE = '/franchise', + GALLERY = '/gallery', + GRADUATION = '/holidays/graduation', + HOLIDAYS = '/holidays', + HOME = '/', + MASTER_CLASSES = '/master_classes', + NEW_YEAR = '/new_year', + OUTDOORS = '/holidays/outdoors', + PARTNERS = '/partners', + PRICE = '/price', + QUESTS = '/quests', + RENT = '/rent', + SERVICE = '/service', +} + +export type PAGE_LINK_LABEL_TYPE = { + [key in PAGE_LINK]: string; +}; + +export const PAGE_LINK_LABEL: PAGE_LINK_LABEL_TYPE = { + [PAGE_LINK.ABOUT]: 'О нас', + [PAGE_LINK.BIRTHDAY]: 'День Рождения', + [PAGE_LINK.HOLIDAYS]: 'Праздники', + [PAGE_LINK.HOME]: 'Главная', + [PAGE_LINK.COMBO]: 'Комбо', + [PAGE_LINK.CONTACTS]: 'Контакты', + [PAGE_LINK.COOPERATION]: 'Сотрудничество', + [PAGE_LINK.ESCORT]: 'Сопровождение', + [PAGE_LINK.FAQ]: 'Частые вопросы', + [PAGE_LINK.FEEDBACK]: 'Отзывы', + [PAGE_LINK.FRANCHISE]: 'Франшиза', + [PAGE_LINK.GRADUATION]: 'Выпускные', + [PAGE_LINK.GALLERY]: 'Галерея', + [PAGE_LINK.MASTER_CLASSES]: 'Мастер классы', + [PAGE_LINK.NEW_YEAR]: 'Новый год', + [PAGE_LINK.OUTDOORS]: 'Выездные праздники', + [PAGE_LINK.PARTNERS]: 'Корпоративным клиентам и партнёрам', + [PAGE_LINK.PRICE]: 'Цены', + [PAGE_LINK.QUESTS]: 'Квесты', + [PAGE_LINK.RENT]: 'Аренда залов', + [PAGE_LINK.SERVICE]: 'Услуги для праздника', +}; + +export enum TextSection { + PARK = 'parkInfo', + TITLE = 'title', +} + +export enum SERVICE { + ANIMATION = 'animation', + ANIMATOR = 'animator', + CRYO_SHOW = 'cryoShow', + DECORATION = 'decoration', + DIPLOMA = 'diploma', + DURATION = 'duration', + FACE_PAINTING = 'facePainting', + HALL = 'hall', + MASTERCLASS = 'masterclass', + PHOTOGRAPHER = 'photographer', + PHOTOS = 'photos', + QUEST = 'quest', + SCREENWRITER = 'screenWriter', + SHOW_DISCO = 'showDisco', + TABLEWARE_FESTIVE = 'tablewareFestive', + TEAM_BUILDING = 'teamBuilding', +} + +export type ServiceType = { + enabled: boolean; + id: SERVICE; + name: string; + tooltip?: boolean; +}; + +export enum ApiRoute { + BREADCRUMBS = '/breadcrumbs', + FAQ = '/faq', + HALLS = '/halls', + INFO = '/info', + QUESTS = '/quests', + RATE = '/rate', + SERVICES = '/services', + STATISTIC_INFO = '/statistic', + STORIES = '/stories', + TEXT = '/text', +} + +export const servicesList: { [k in SERVICE]: ServiceType } = { + [SERVICE.QUEST]: { + enabled: true, + id: SERVICE.QUEST, + name: 'Квест', + }, + [SERVICE.ANIMATION]: { + enabled: true, + id: SERVICE.ANIMATION, + name: 'Тематическая анимация', + }, + [SERVICE.DURATION]: { + enabled: true, + id: SERVICE.DURATION, + name: 'Продолжительность', + }, + [SERVICE.ANIMATOR]: { + enabled: true, + id: SERVICE.ANIMATOR, + name: 'Аниматор', + }, + [SERVICE.CRYO_SHOW]: { + enabled: true, + id: SERVICE.CRYO_SHOW, + name: 'Крио-Шоу', + }, + [SERVICE.DECORATION]: { + enabled: true, + id: SERVICE.DECORATION, + name: 'Украшение зала', + }, + [SERVICE.DIPLOMA]: { + enabled: true, + id: SERVICE.DIPLOMA, + name: 'Диплом выпускника', + }, + [SERVICE.FACE_PAINTING]: { + enabled: true, + id: SERVICE.FACE_PAINTING, + name: 'Аква грим', + }, + [SERVICE.HALL]: { + enabled: true, + id: SERVICE.HALL, + name: 'Зал для праздника', + tooltip: true, + }, + [SERVICE.MASTERCLASS]: { + enabled: true, + id: SERVICE.MASTERCLASS, + name: 'Мастер класс', + }, + [SERVICE.PHOTOGRAPHER]: { + enabled: true, + id: SERVICE.PHOTOGRAPHER, + name: 'Фотограф', + }, + [SERVICE.PHOTOS]: { + enabled: true, + id: SERVICE.PHOTOS, + name: 'Фотографии', + }, + [SERVICE.SCREENWRITER]: { + enabled: true, + id: SERVICE.SCREENWRITER, + name: 'Сценарист', + }, + [SERVICE.SHOW_DISCO]: { + enabled: true, + id: SERVICE.SHOW_DISCO, + name: 'Шоу дискотека', + }, + [SERVICE.TABLEWARE_FESTIVE]: { + enabled: true, + id: SERVICE.TABLEWARE_FESTIVE, + name: 'Праздничная посуда', + }, + [SERVICE.TEAM_BUILDING]: { + enabled: true, + id: SERVICE.TEAM_BUILDING, + name: 'Тимбилдинг', + }, +}; + + +export enum ColorVariant { + BLACK, + BLACK_LIGHT, + GRADIENT_PERI, + GRADIENT_PERI2, + GRADIENT_PERI3, + GRADIENT_PERI4, + GRADIENT_RED, + GRADIENT_RED_DARK, + GRADIENT_YELLOW, + GRADIENT_ORANGE, + GRADIENT_GREEN, + GREEN, + GREY, + ORANGE, + TRANSPARENT, + VERI_PERI, + VERI_PERI_DARK, + WHITE, +} +type ColorType = { + [k in ColorVariant]: string; +}; +export const COLORS: ColorType = { + [ColorVariant.BLACK]: "#000000", + [ColorVariant.BLACK_LIGHT]: "#3C3C3C", + [ColorVariant.GRADIENT_PERI]: "linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%)", + [ColorVariant.GRADIENT_PERI2]: "linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%)", + [ColorVariant.GRADIENT_PERI3]: "linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%)", + [ColorVariant.GRADIENT_PERI4]: "linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%)", + [ColorVariant.GRADIENT_RED]: "linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)", + [ColorVariant.GRADIENT_RED_DARK]: "linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%)", + [ColorVariant.GRADIENT_YELLOW]: "linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%)", + [ColorVariant.GRADIENT_ORANGE]: "linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%)", + [ColorVariant.GRADIENT_GREEN]: "linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%)", + [ColorVariant.GREEN]: "#15B555", + [ColorVariant.GREY]: "#F1F7FD", + [ColorVariant.ORANGE]: "#FFB76F", + [ColorVariant.TRANSPARENT]: 'transparent', + [ColorVariant.VERI_PERI]: "#6767AB", + [ColorVariant.VERI_PERI_DARK]: "#5656A9", + [ColorVariant.WHITE]: "#FFFFFF", +}; diff --git a/static/images/information/halls/hall1.jpg b/static/images/information/halls/hall1.jpg new file mode 100644 index 0000000..deb927e Binary files /dev/null and b/static/images/information/halls/hall1.jpg differ diff --git a/static/images/information/halls/hall2.jpg b/static/images/information/halls/hall2.jpg new file mode 100644 index 0000000..c801da6 Binary files /dev/null and b/static/images/information/halls/hall2.jpg differ diff --git a/static/images/information/halls/hall3.jpg b/static/images/information/halls/hall3.jpg new file mode 100644 index 0000000..d2ce52a Binary files /dev/null and b/static/images/information/halls/hall3.jpg differ diff --git a/static/images/information/statistics/desktop/decoration.png b/static/images/information/statistics/desktop/decoration.png new file mode 100644 index 0000000..3cba681 Binary files /dev/null and b/static/images/information/statistics/desktop/decoration.png differ diff --git a/static/images/information/statistics/desktop/graduation/decoration.png b/static/images/information/statistics/desktop/graduation/decoration.png new file mode 100644 index 0000000..c31f73c Binary files /dev/null and b/static/images/information/statistics/desktop/graduation/decoration.png differ diff --git a/static/images/information/statistics/desktop/graduation/diploma.png b/static/images/information/statistics/desktop/graduation/diploma.png new file mode 100644 index 0000000..01c01e3 Binary files /dev/null and b/static/images/information/statistics/desktop/graduation/diploma.png differ diff --git a/static/images/information/statistics/desktop/graduation/kids.png b/static/images/information/statistics/desktop/graduation/kids.png new file mode 100644 index 0000000..26f6570 Binary files /dev/null and b/static/images/information/statistics/desktop/graduation/kids.png differ diff --git a/static/images/information/statistics/desktop/graduation/rate.png b/static/images/information/statistics/desktop/graduation/rate.png new file mode 100644 index 0000000..5fdc398 Binary files /dev/null and b/static/images/information/statistics/desktop/graduation/rate.png differ diff --git a/static/images/information/statistics/desktop/kids.png b/static/images/information/statistics/desktop/kids.png new file mode 100644 index 0000000..9525deb Binary files /dev/null and b/static/images/information/statistics/desktop/kids.png differ diff --git a/static/images/information/statistics/desktop/like.png b/static/images/information/statistics/desktop/like.png new file mode 100644 index 0000000..c4bca12 Binary files /dev/null and b/static/images/information/statistics/desktop/like.png differ diff --git a/static/images/information/statistics/desktop/outdoors/decoration.png b/static/images/information/statistics/desktop/outdoors/decoration.png new file mode 100644 index 0000000..dc1b239 Binary files /dev/null and b/static/images/information/statistics/desktop/outdoors/decoration.png differ diff --git a/static/images/information/statistics/desktop/outdoors/scooter.png b/static/images/information/statistics/desktop/outdoors/scooter.png new file mode 100644 index 0000000..cda55d2 Binary files /dev/null and b/static/images/information/statistics/desktop/outdoors/scooter.png differ diff --git a/static/images/information/statistics/desktop/pinata.png b/static/images/information/statistics/desktop/pinata.png new file mode 100644 index 0000000..151f75f Binary files /dev/null and b/static/images/information/statistics/desktop/pinata.png differ diff --git a/static/images/information/statistics/desktop/programms.png b/static/images/information/statistics/desktop/programms.png new file mode 100644 index 0000000..43adc9b Binary files /dev/null and b/static/images/information/statistics/desktop/programms.png differ diff --git a/static/images/information/statistics/desktop/quests/eger/books.png b/static/images/information/statistics/desktop/quests/eger/books.png new file mode 100644 index 0000000..59495f5 Binary files /dev/null and b/static/images/information/statistics/desktop/quests/eger/books.png differ diff --git a/static/images/information/statistics/desktop/quests/eger/keys.png b/static/images/information/statistics/desktop/quests/eger/keys.png new file mode 100644 index 0000000..f1dfb9a Binary files /dev/null and b/static/images/information/statistics/desktop/quests/eger/keys.png differ diff --git a/static/images/information/statistics/desktop/quests/eger/map.png b/static/images/information/statistics/desktop/quests/eger/map.png new file mode 100644 index 0000000..4a1ee7f Binary files /dev/null and b/static/images/information/statistics/desktop/quests/eger/map.png differ diff --git a/static/images/information/statistics/desktop/rate.png b/static/images/information/statistics/desktop/rate.png new file mode 100644 index 0000000..5fdc398 Binary files /dev/null and b/static/images/information/statistics/desktop/rate.png differ diff --git a/static/images/information/statistics/desktop/star.png b/static/images/information/statistics/desktop/star.png new file mode 100644 index 0000000..421c444 Binary files /dev/null and b/static/images/information/statistics/desktop/star.png differ diff --git a/static/images/information/statistics/mobile/cup.png b/static/images/information/statistics/mobile/cup.png new file mode 100644 index 0000000..7bd55f5 Binary files /dev/null and b/static/images/information/statistics/mobile/cup.png differ diff --git a/static/images/information/statistics/mobile/decoration.png b/static/images/information/statistics/mobile/decoration.png new file mode 100644 index 0000000..5b8c3d2 Binary files /dev/null and b/static/images/information/statistics/mobile/decoration.png differ diff --git a/static/images/information/statistics/mobile/graduation/decoration.png b/static/images/information/statistics/mobile/graduation/decoration.png new file mode 100644 index 0000000..5b8c3d2 Binary files /dev/null and b/static/images/information/statistics/mobile/graduation/decoration.png differ diff --git a/static/images/information/statistics/mobile/graduation/diploma.png b/static/images/information/statistics/mobile/graduation/diploma.png new file mode 100644 index 0000000..6b8eec2 Binary files /dev/null and b/static/images/information/statistics/mobile/graduation/diploma.png differ diff --git a/static/images/information/statistics/mobile/graduation/kids.png b/static/images/information/statistics/mobile/graduation/kids.png new file mode 100644 index 0000000..0c71a49 Binary files /dev/null and b/static/images/information/statistics/mobile/graduation/kids.png differ diff --git a/static/images/information/statistics/mobile/graduation/rate.png b/static/images/information/statistics/mobile/graduation/rate.png new file mode 100644 index 0000000..684fe27 Binary files /dev/null and b/static/images/information/statistics/mobile/graduation/rate.png differ diff --git a/static/images/information/statistics/mobile/kids.png b/static/images/information/statistics/mobile/kids.png new file mode 100644 index 0000000..bde83ec Binary files /dev/null and b/static/images/information/statistics/mobile/kids.png differ diff --git a/static/images/information/statistics/mobile/kids2.png b/static/images/information/statistics/mobile/kids2.png new file mode 100644 index 0000000..16f70bc Binary files /dev/null and b/static/images/information/statistics/mobile/kids2.png differ diff --git a/static/images/information/statistics/mobile/like.png b/static/images/information/statistics/mobile/like.png new file mode 100644 index 0000000..a7d5adc Binary files /dev/null and b/static/images/information/statistics/mobile/like.png differ diff --git a/static/images/information/statistics/mobile/outdoors/decoration.png b/static/images/information/statistics/mobile/outdoors/decoration.png new file mode 100644 index 0000000..765f6e5 Binary files /dev/null and b/static/images/information/statistics/mobile/outdoors/decoration.png differ diff --git a/static/images/information/statistics/mobile/outdoors/scooter.png b/static/images/information/statistics/mobile/outdoors/scooter.png new file mode 100644 index 0000000..b9be4f3 Binary files /dev/null and b/static/images/information/statistics/mobile/outdoors/scooter.png differ diff --git a/static/images/information/statistics/mobile/pinata.png b/static/images/information/statistics/mobile/pinata.png new file mode 100644 index 0000000..965bec0 Binary files /dev/null and b/static/images/information/statistics/mobile/pinata.png differ diff --git a/static/images/information/statistics/mobile/programms.png b/static/images/information/statistics/mobile/programms.png new file mode 100644 index 0000000..d98f115 Binary files /dev/null and b/static/images/information/statistics/mobile/programms.png differ diff --git a/static/images/information/statistics/mobile/quests/eger/books.png b/static/images/information/statistics/mobile/quests/eger/books.png new file mode 100644 index 0000000..37e0945 Binary files /dev/null and b/static/images/information/statistics/mobile/quests/eger/books.png differ diff --git a/static/images/information/statistics/mobile/quests/eger/keys.png b/static/images/information/statistics/mobile/quests/eger/keys.png new file mode 100644 index 0000000..f1dfb9a Binary files /dev/null and b/static/images/information/statistics/mobile/quests/eger/keys.png differ diff --git a/static/images/information/statistics/mobile/quests/eger/kids.png b/static/images/information/statistics/mobile/quests/eger/kids.png new file mode 100644 index 0000000..16f70bc Binary files /dev/null and b/static/images/information/statistics/mobile/quests/eger/kids.png differ diff --git a/static/images/information/statistics/mobile/quests/eger/map.png b/static/images/information/statistics/mobile/quests/eger/map.png new file mode 100644 index 0000000..f174578 Binary files /dev/null and b/static/images/information/statistics/mobile/quests/eger/map.png differ diff --git a/static/images/information/statistics/mobile/rate.png b/static/images/information/statistics/mobile/rate.png new file mode 100644 index 0000000..684fe27 Binary files /dev/null and b/static/images/information/statistics/mobile/rate.png differ diff --git a/static/images/information/statistics/mobile/star.png b/static/images/information/statistics/mobile/star.png new file mode 100644 index 0000000..a9a08ac Binary files /dev/null and b/static/images/information/statistics/mobile/star.png differ diff --git a/static/images/quests/backgrounds/eger/desktop/background.png b/static/images/quests/backgrounds/eger/desktop/background.png new file mode 100644 index 0000000..638f8b1 Binary files /dev/null and b/static/images/quests/backgrounds/eger/desktop/background.png differ diff --git a/static/images/quests/backgrounds/eger/mobile/background.png b/static/images/quests/backgrounds/eger/mobile/background.png new file mode 100644 index 0000000..6387e5d Binary files /dev/null and b/static/images/quests/backgrounds/eger/mobile/background.png differ diff --git a/static/images/quests/backgrounds/faraon/desktop/background.png b/static/images/quests/backgrounds/faraon/desktop/background.png new file mode 100644 index 0000000..9f5cc04 Binary files /dev/null and b/static/images/quests/backgrounds/faraon/desktop/background.png differ diff --git a/static/images/quests/backgrounds/faraon/mobile/background.png b/static/images/quests/backgrounds/faraon/mobile/background.png new file mode 100644 index 0000000..8e76fa4 Binary files /dev/null and b/static/images/quests/backgrounds/faraon/mobile/background.png differ diff --git a/static/images/quests/backgrounds/main/desktop/eger-card.png b/static/images/quests/backgrounds/main/desktop/eger-card.png new file mode 100644 index 0000000..028e566 Binary files /dev/null and b/static/images/quests/backgrounds/main/desktop/eger-card.png differ diff --git a/static/images/quests/backgrounds/main/desktop/faraon-card.png b/static/images/quests/backgrounds/main/desktop/faraon-card.png new file mode 100644 index 0000000..a7650d2 Binary files /dev/null and b/static/images/quests/backgrounds/main/desktop/faraon-card.png differ diff --git a/static/images/quests/backgrounds/main/desktop/mult-card.png b/static/images/quests/backgrounds/main/desktop/mult-card.png new file mode 100644 index 0000000..bbe7ba8 Binary files /dev/null and b/static/images/quests/backgrounds/main/desktop/mult-card.png differ diff --git a/static/images/quests/backgrounds/main/desktop/quests.png b/static/images/quests/backgrounds/main/desktop/quests.png new file mode 100644 index 0000000..ad574b6 Binary files /dev/null and b/static/images/quests/backgrounds/main/desktop/quests.png differ diff --git a/static/images/quests/backgrounds/main/mobile/eger-card.png b/static/images/quests/backgrounds/main/mobile/eger-card.png new file mode 100644 index 0000000..b910308 Binary files /dev/null and b/static/images/quests/backgrounds/main/mobile/eger-card.png differ diff --git a/static/images/quests/backgrounds/main/mobile/faraon-card.png b/static/images/quests/backgrounds/main/mobile/faraon-card.png new file mode 100644 index 0000000..3e00f6f Binary files /dev/null and b/static/images/quests/backgrounds/main/mobile/faraon-card.png differ diff --git a/static/images/quests/backgrounds/main/mobile/mult-card.png b/static/images/quests/backgrounds/main/mobile/mult-card.png new file mode 100644 index 0000000..f9a1ca8 Binary files /dev/null and b/static/images/quests/backgrounds/main/mobile/mult-card.png differ diff --git a/static/images/quests/backgrounds/main/mobile/quests.png b/static/images/quests/backgrounds/main/mobile/quests.png new file mode 100644 index 0000000..f4fc247 Binary files /dev/null and b/static/images/quests/backgrounds/main/mobile/quests.png differ diff --git a/static/images/quests/backgrounds/mult/desktop/background.png b/static/images/quests/backgrounds/mult/desktop/background.png new file mode 100644 index 0000000..2335e57 Binary files /dev/null and b/static/images/quests/backgrounds/mult/desktop/background.png differ diff --git a/static/images/quests/backgrounds/mult/mobile/background.png b/static/images/quests/backgrounds/mult/mobile/background.png new file mode 100644 index 0000000..be1ed91 Binary files /dev/null and b/static/images/quests/backgrounds/mult/mobile/background.png differ diff --git a/static/images/quests/stories/eger/desktop/feedback.png b/static/images/quests/stories/eger/desktop/feedback.png new file mode 100644 index 0000000..943a23f Binary files /dev/null and b/static/images/quests/stories/eger/desktop/feedback.png differ diff --git a/static/images/quests/stories/eger/desktop/gallery.png b/static/images/quests/stories/eger/desktop/gallery.png new file mode 100644 index 0000000..2f4328d Binary files /dev/null and b/static/images/quests/stories/eger/desktop/gallery.png differ diff --git a/static/images/quests/stories/eger/desktop/plot.png b/static/images/quests/stories/eger/desktop/plot.png new file mode 100644 index 0000000..72644d1 Binary files /dev/null and b/static/images/quests/stories/eger/desktop/plot.png differ diff --git a/static/images/quests/stories/eger/mobile/feedback.png b/static/images/quests/stories/eger/mobile/feedback.png new file mode 100644 index 0000000..491a734 Binary files /dev/null and b/static/images/quests/stories/eger/mobile/feedback.png differ diff --git a/static/images/quests/stories/eger/mobile/gallery.png b/static/images/quests/stories/eger/mobile/gallery.png new file mode 100644 index 0000000..cebcf52 Binary files /dev/null and b/static/images/quests/stories/eger/mobile/gallery.png differ diff --git a/static/images/quests/stories/eger/mobile/plot.png b/static/images/quests/stories/eger/mobile/plot.png new file mode 100644 index 0000000..4ac9a53 Binary files /dev/null and b/static/images/quests/stories/eger/mobile/plot.png differ diff --git a/static/images/quests/stories/faraon/desktop/feedback.png b/static/images/quests/stories/faraon/desktop/feedback.png new file mode 100644 index 0000000..4790f68 Binary files /dev/null and b/static/images/quests/stories/faraon/desktop/feedback.png differ diff --git a/static/images/quests/stories/faraon/desktop/gallery.png b/static/images/quests/stories/faraon/desktop/gallery.png new file mode 100644 index 0000000..2d04d23 Binary files /dev/null and b/static/images/quests/stories/faraon/desktop/gallery.png differ diff --git a/static/images/quests/stories/faraon/desktop/plot.png b/static/images/quests/stories/faraon/desktop/plot.png new file mode 100644 index 0000000..b78879d Binary files /dev/null and b/static/images/quests/stories/faraon/desktop/plot.png differ diff --git a/static/images/quests/stories/faraon/mobile/feedback.png b/static/images/quests/stories/faraon/mobile/feedback.png new file mode 100644 index 0000000..9affd0d Binary files /dev/null and b/static/images/quests/stories/faraon/mobile/feedback.png differ diff --git a/static/images/quests/stories/faraon/mobile/gallery.png b/static/images/quests/stories/faraon/mobile/gallery.png new file mode 100644 index 0000000..9426137 Binary files /dev/null and b/static/images/quests/stories/faraon/mobile/gallery.png differ diff --git a/static/images/quests/stories/faraon/mobile/plot.png b/static/images/quests/stories/faraon/mobile/plot.png new file mode 100644 index 0000000..6f0ded4 Binary files /dev/null and b/static/images/quests/stories/faraon/mobile/plot.png differ diff --git a/static/images/quests/stories/mult/desktop/feedback.png b/static/images/quests/stories/mult/desktop/feedback.png new file mode 100644 index 0000000..7ec7146 Binary files /dev/null and b/static/images/quests/stories/mult/desktop/feedback.png differ diff --git a/static/images/quests/stories/mult/desktop/gallery.png b/static/images/quests/stories/mult/desktop/gallery.png new file mode 100644 index 0000000..90101a3 Binary files /dev/null and b/static/images/quests/stories/mult/desktop/gallery.png differ diff --git a/static/images/quests/stories/mult/desktop/plot.png b/static/images/quests/stories/mult/desktop/plot.png new file mode 100644 index 0000000..4079918 Binary files /dev/null and b/static/images/quests/stories/mult/desktop/plot.png differ diff --git a/static/images/quests/stories/mult/mobile/feedback.png b/static/images/quests/stories/mult/mobile/feedback.png new file mode 100644 index 0000000..eb918f1 Binary files /dev/null and b/static/images/quests/stories/mult/mobile/feedback.png differ diff --git a/static/images/quests/stories/mult/mobile/gallery.png b/static/images/quests/stories/mult/mobile/gallery.png new file mode 100644 index 0000000..f1a5cd2 Binary files /dev/null and b/static/images/quests/stories/mult/mobile/gallery.png differ diff --git a/static/images/quests/stories/mult/mobile/plot.png b/static/images/quests/stories/mult/mobile/plot.png new file mode 100644 index 0000000..8f370ca Binary files /dev/null and b/static/images/quests/stories/mult/mobile/plot.png differ diff --git a/static/images/quests/stories/stories/eger/desktop/feedback.png b/static/images/quests/stories/stories/eger/desktop/feedback.png new file mode 100644 index 0000000..943a23f Binary files /dev/null and b/static/images/quests/stories/stories/eger/desktop/feedback.png differ diff --git a/static/images/quests/stories/stories/eger/desktop/gallery.png b/static/images/quests/stories/stories/eger/desktop/gallery.png new file mode 100644 index 0000000..2f4328d Binary files /dev/null and b/static/images/quests/stories/stories/eger/desktop/gallery.png differ diff --git a/static/images/quests/stories/stories/eger/desktop/plot.png b/static/images/quests/stories/stories/eger/desktop/plot.png new file mode 100644 index 0000000..72644d1 Binary files /dev/null and b/static/images/quests/stories/stories/eger/desktop/plot.png differ diff --git a/static/images/quests/stories/stories/eger/mobile/feedback.png b/static/images/quests/stories/stories/eger/mobile/feedback.png new file mode 100644 index 0000000..491a734 Binary files /dev/null and b/static/images/quests/stories/stories/eger/mobile/feedback.png differ diff --git a/static/images/quests/stories/stories/eger/mobile/gallery.png b/static/images/quests/stories/stories/eger/mobile/gallery.png new file mode 100644 index 0000000..cebcf52 Binary files /dev/null and b/static/images/quests/stories/stories/eger/mobile/gallery.png differ diff --git a/static/images/quests/stories/stories/eger/mobile/plot.png b/static/images/quests/stories/stories/eger/mobile/plot.png new file mode 100644 index 0000000..4ac9a53 Binary files /dev/null and b/static/images/quests/stories/stories/eger/mobile/plot.png differ diff --git a/static/images/quests/stories/stories/faraon/desktop/feedback.png b/static/images/quests/stories/stories/faraon/desktop/feedback.png new file mode 100644 index 0000000..4790f68 Binary files /dev/null and b/static/images/quests/stories/stories/faraon/desktop/feedback.png differ diff --git a/static/images/quests/stories/stories/faraon/desktop/gallery.png b/static/images/quests/stories/stories/faraon/desktop/gallery.png new file mode 100644 index 0000000..2d04d23 Binary files /dev/null and b/static/images/quests/stories/stories/faraon/desktop/gallery.png differ diff --git a/static/images/quests/stories/stories/faraon/desktop/plot.png b/static/images/quests/stories/stories/faraon/desktop/plot.png new file mode 100644 index 0000000..b78879d Binary files /dev/null and b/static/images/quests/stories/stories/faraon/desktop/plot.png differ diff --git a/static/images/quests/stories/stories/faraon/mobile/feedback.png b/static/images/quests/stories/stories/faraon/mobile/feedback.png new file mode 100644 index 0000000..9affd0d Binary files /dev/null and b/static/images/quests/stories/stories/faraon/mobile/feedback.png differ diff --git a/static/images/quests/stories/stories/faraon/mobile/gallery.png b/static/images/quests/stories/stories/faraon/mobile/gallery.png new file mode 100644 index 0000000..9426137 Binary files /dev/null and b/static/images/quests/stories/stories/faraon/mobile/gallery.png differ diff --git a/static/images/quests/stories/stories/faraon/mobile/plot.png b/static/images/quests/stories/stories/faraon/mobile/plot.png new file mode 100644 index 0000000..6f0ded4 Binary files /dev/null and b/static/images/quests/stories/stories/faraon/mobile/plot.png differ diff --git a/static/images/quests/stories/stories/mult/desktop/feedback.png b/static/images/quests/stories/stories/mult/desktop/feedback.png new file mode 100644 index 0000000..7ec7146 Binary files /dev/null and b/static/images/quests/stories/stories/mult/desktop/feedback.png differ diff --git a/static/images/quests/stories/stories/mult/desktop/gallery.png b/static/images/quests/stories/stories/mult/desktop/gallery.png new file mode 100644 index 0000000..90101a3 Binary files /dev/null and b/static/images/quests/stories/stories/mult/desktop/gallery.png differ diff --git a/static/images/quests/stories/stories/mult/desktop/plot.png b/static/images/quests/stories/stories/mult/desktop/plot.png new file mode 100644 index 0000000..4079918 Binary files /dev/null and b/static/images/quests/stories/stories/mult/desktop/plot.png differ diff --git a/static/images/quests/stories/stories/mult/mobile/feedback.png b/static/images/quests/stories/stories/mult/mobile/feedback.png new file mode 100644 index 0000000..eb918f1 Binary files /dev/null and b/static/images/quests/stories/stories/mult/mobile/feedback.png differ diff --git a/static/images/quests/stories/stories/mult/mobile/gallery.png b/static/images/quests/stories/stories/mult/mobile/gallery.png new file mode 100644 index 0000000..f1a5cd2 Binary files /dev/null and b/static/images/quests/stories/stories/mult/mobile/gallery.png differ diff --git a/static/images/quests/stories/stories/mult/mobile/plot.png b/static/images/quests/stories/stories/mult/mobile/plot.png new file mode 100644 index 0000000..8f370ca Binary files /dev/null and b/static/images/quests/stories/stories/mult/mobile/plot.png differ diff --git a/static/images/rate/base.png b/static/images/rate/base.png new file mode 100644 index 0000000..c4f0917 Binary files /dev/null and b/static/images/rate/base.png differ diff --git a/static/images/rate/premium.png b/static/images/rate/premium.png new file mode 100644 index 0000000..ff7725c Binary files /dev/null and b/static/images/rate/premium.png differ diff --git a/static/images/rate/standart.png b/static/images/rate/standart.png new file mode 100644 index 0000000..22a8c8f Binary files /dev/null and b/static/images/rate/standart.png differ diff --git a/static/images/rate/vip.png b/static/images/rate/vip.png new file mode 100644 index 0000000..10824ec Binary files /dev/null and b/static/images/rate/vip.png differ diff --git a/static/images/stories/birthday/faq.png b/static/images/stories/birthday/faq.png new file mode 100644 index 0000000..3805094 Binary files /dev/null and b/static/images/stories/birthday/faq.png differ diff --git a/static/images/stories/birthday/faq_mobile.png b/static/images/stories/birthday/faq_mobile.png new file mode 100644 index 0000000..f95d1ce Binary files /dev/null and b/static/images/stories/birthday/faq_mobile.png differ diff --git a/static/images/stories/birthday/feedback.png b/static/images/stories/birthday/feedback.png new file mode 100644 index 0000000..9b337da Binary files /dev/null and b/static/images/stories/birthday/feedback.png differ diff --git a/static/images/stories/birthday/feedback_mobile.png b/static/images/stories/birthday/feedback_mobile.png new file mode 100644 index 0000000..e2f1ef6 Binary files /dev/null and b/static/images/stories/birthday/feedback_mobile.png differ diff --git a/static/images/stories/birthday/photo.png b/static/images/stories/birthday/photo.png new file mode 100644 index 0000000..b48f86f Binary files /dev/null and b/static/images/stories/birthday/photo.png differ diff --git a/static/images/stories/birthday/photo_mobile.png b/static/images/stories/birthday/photo_mobile.png new file mode 100644 index 0000000..50404d6 Binary files /dev/null and b/static/images/stories/birthday/photo_mobile.png differ diff --git a/static/images/stories/example.png b/static/images/stories/example.png new file mode 100644 index 0000000..035c71d Binary files /dev/null and b/static/images/stories/example.png differ diff --git a/static/images/stories/example2.jpg b/static/images/stories/example2.jpg new file mode 100644 index 0000000..11337d8 Binary files /dev/null and b/static/images/stories/example2.jpg differ diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5c7eb96 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "CommonJS", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "baseUrl": ".", + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "paths": { + "src/*": ["./src/*"], + "constantsasd/*": ["./src/constants/*"], + "api/*": ["./src/api/*"], + "routes/*": ["./src/api/routes*"] + }, + "exclude": [ + "node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..8f6a1a4 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,827 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/body-parser@^1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cors@^2.8.13": + version "2.8.13" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" + integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + dependencies: + "@types/node" "*" + +"@types/express@types/express": + version "4.14.0" + resolved "https://codeload.github.com/types/express/tar.gz/7670cf1cbce96b3159e3ff04a253926b34111220" + dependencies: + "@types/serve-static" "github:types/npm-serve-static#c1f96843c8b96a37f6c534cb1dadb48f5329e4e0" + path-to-regexp "github:pillarjs/path-to-regexp#ec285ed3500aed455df59e3b8b07f473412918a4" + +"@types/node@*", "@types/node@^18.16.3": + version "18.16.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.3.tgz#6bda7819aae6ea0b386ebc5b24bdf602f1b42b01" + integrity sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q== + +"@types/serve-static@github:types/npm-serve-static#c1f96843c8b96a37f6c534cb1dadb48f5329e4e0": + version "1.11.1" + resolved "https://codeload.github.com/types/npm-serve-static/tar.gz/c1f96843c8b96a37f6c534cb1dadb48f5329e4e0" + +"@types/uuid@^9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.1.tgz#98586dc36aee8dacc98cc396dbca8d0429647aa6" + integrity sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA== + +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.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + 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.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + 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" + +body-parser@^1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + 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.2" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + 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" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + 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.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + 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" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + 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" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-intrinsic@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +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-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + 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" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +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== + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + +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== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +nodemon@^2.0.22: + version "2.0.22" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" + integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== + 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.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +"path-to-regexp@github:pillarjs/path-to-regexp#ec285ed3500aed455df59e3b8b07f473412918a4": + version "1.5.3" + resolved "https://codeload.github.com/pillarjs/path-to-regexp/tar.gz/ec285ed3500aed455df59e3b8b07f473412918a4" + dependencies: + isarray "0.0.1" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +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== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + 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" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + 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== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + 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.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + 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.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +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" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +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" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + 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" + +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" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" + integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==