├── .gitignore ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── backend ├── .gitignore ├── package-lock.json ├── package.json └── server.js ├── frontend ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt └── src │ ├── App.css │ ├── App.js │ ├── App.test.js │ ├── assets │ └── movie.data.js │ ├── components │ ├── book-date │ │ ├── book-date.component.jsx │ │ └── book-date.styles.scss │ ├── book-movie-title │ │ ├── book-movie-title.component.jsx │ │ └── book-movie-title.styles.scss │ ├── book-show │ │ ├── book-show.component.jsx │ │ └── book-show.styles.scss │ ├── collection-details-movie │ │ ├── collection-details-movie.component.jsx │ │ └── collection-details-movie.styles.scss │ ├── collection-item │ │ ├── collection-item.component.jsx │ │ └── collection-item.styles.scss │ ├── collection-preview │ │ ├── collection-preview.component.jsx │ │ └── collection-preview.styles.scss │ ├── header │ │ ├── header.component.jsx │ │ └── header.styles.scss │ ├── sign-in │ │ ├── sign-in.component.jsx │ │ └── sign-in.styles.scss │ └── sign-up │ │ ├── sign-up.component.jsx │ │ └── sign-up.styles.scss │ ├── index.css │ ├── index.js │ ├── logo.svg │ ├── pages │ ├── book-date-page │ │ ├── book-date-page.component.jsx │ │ └── book-date-page.styles.scss │ ├── book-movie-title-page │ │ ├── book-movie-title-page.component.jsx │ │ └── book-movie-title-page.styles.scss │ ├── book-show-page │ │ ├── book-show-page.component.jsx │ │ └── book-show-page.styles.scss │ ├── collection-details-page │ │ ├── collection-details-page.component.jsx │ │ └── collection-details-page.styles.scss │ ├── homepage │ │ ├── homepage.component.jsx │ │ └── homepage.styles.scss │ ├── now-showing │ │ ├── now-showing.component.jsx │ │ └── now-showing.styles.scss │ ├── pay-page │ │ ├── pay-page.component.jsx │ │ └── pay-page.styles.scss │ ├── popular │ │ ├── popular.component.jsx │ │ └── popular.styles.scss │ ├── sign-in-and-sign-up │ │ ├── sign-in-and-sign-up.component.jsx │ │ └── sign-in-and-sign-up.styles.scss │ └── upcoming │ │ ├── upcoming.component.jsx │ │ └── upcoming.styles.scss │ └── serviceWorker.js ├── package-lock.json ├── package.json └── snapshots ├── screenshot-1.png └── screenshot-2.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Launch Program", 11 | "program": "${workspaceFolder}\\index.js" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Ahmed Gulab Khan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MovieGo 2 | ## About 3 | A Website implemented using MERN (MongoDB, ExpressJS, ReactJS and NodeJS) stack, which allows users to sign-in/register and book movie tickets online. 4 | 5 | ## Snapshots of the website 6 | 7 | 1. Snapshot - 1 8 | 9 | ![Screenshot 1](/snapshots/screenshot-1.png) 10 | 11 | 2. Snapshot - 2 12 | 13 | ![Screenshot 1](/snapshots/screenshot-2.png) 14 | 15 | ## Things to Download before you proceed 16 | I used the MERN (MongoDB, ExpressJS, ReactJS and NodeJS) stack for this project. 17 | 18 | ![MERN](https://camo.githubusercontent.com/6dbc5da76bbbbef861254082f537daf67d055f62/68747470733a2f2f6d69726f2e6d656469756d2e636f6d2f6d61782f3637382f312a6471766c61737a524c766f506d4152704f6c4c4e39412e706e67) 19 | 20 | - [NodeJS](https://nodejs.org/en/) 21 | - [MongoDB](https://www.mongodb.com/download-center) 22 | 23 | The package.json files in the root, frontend and the backend folders contain all the required dependencies. First go ahead and make sure to download the latest stable version of [NodeJS](https://nodejs.org/en/) and also the latest version of [MongoDB](https://www.mongodb.com/download-center). Clone the repository and run the command `npm install` while in the root, frontend and backend folders to install all the dependencies. All the required steps to set up the project are mentioned below. Just follow through. 24 | 25 | ## Configuration Steps 26 | 1. Cloning the repository: 27 | 28 | ``` 29 | $ git clone https://github.com/ahmedgulabkhan/MovieGo.git 30 | ``` 31 | 32 | 2. Installing the dependencies (using terminal): 33 | 34 | ``` 35 | $ cd MovieGo 36 | $ npm install 37 | 38 | $ cd backend 39 | $ npm install 40 | 41 | $ cd.. 42 | 43 | $ cd fronted 44 | $ npm install 45 | ``` 46 | This installs all the required dependencies like React, React-router-dom, Concurrently, Express, Mongoose, Passport, etc. 47 | 48 | 3. dotenv file: 49 | 50 | Create a .env file in the backend folder, and write the following code 51 | 52 | `SECRET=Anythingyouwant` 53 | 54 | and save it. The `SECRET` variable can literally have any value. 55 | 56 | 4. Configuring MongoDB: 57 | 58 | Open your terminal, and go to the directory where you have MongoDB installed and from thereon cd to the directory which has the 'mongod.exe' file inside it. After you reach that directory through your terminal, type `mongod` and press enter, and the MongoDB server starts running locally on your machine on port 27017. 59 | 60 | 5. Checking if everything works fine: 61 | 62 | Now open another terminal and cd to the MovieGo directory. Run the following code: 63 | 64 | `$ npm start` 65 | 66 | and you shall see that the website is loaded on your localhost port 3000. 67 | 68 | ## Currently Working On 69 | - Using Bootstrap to make the website responsive. 70 | 71 | - Different categories of seats with different prices like 'Gold - Rs. 150', 'Silver - Rs. 100' and 'Regular - Rs. 50'. 72 | 73 | - ReactJS Pagination. 74 | 75 | - Users can book multiple seats at the same time. 76 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port -------------------------------------------------------------------------------- /backend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "bluebird": { 22 | "version": "3.5.1", 23 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 24 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 25 | }, 26 | "body-parser": { 27 | "version": "1.19.0", 28 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 29 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 30 | "requires": { 31 | "bytes": "3.1.0", 32 | "content-type": "~1.0.4", 33 | "debug": "2.6.9", 34 | "depd": "~1.1.2", 35 | "http-errors": "1.7.2", 36 | "iconv-lite": "0.4.24", 37 | "on-finished": "~2.3.0", 38 | "qs": "6.7.0", 39 | "raw-body": "2.4.0", 40 | "type-is": "~1.6.17" 41 | } 42 | }, 43 | "bson": { 44 | "version": "1.1.6", 45 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", 46 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" 47 | }, 48 | "bytes": { 49 | "version": "3.1.0", 50 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 51 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 52 | }, 53 | "content-disposition": { 54 | "version": "0.5.3", 55 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 56 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 57 | "requires": { 58 | "safe-buffer": "5.1.2" 59 | } 60 | }, 61 | "content-type": { 62 | "version": "1.0.4", 63 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 64 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 65 | }, 66 | "cookie": { 67 | "version": "0.4.0", 68 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 69 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 70 | }, 71 | "cookie-signature": { 72 | "version": "1.0.6", 73 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 74 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 75 | }, 76 | "cors": { 77 | "version": "2.8.5", 78 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 79 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 80 | "requires": { 81 | "object-assign": "^4", 82 | "vary": "^1" 83 | } 84 | }, 85 | "debug": { 86 | "version": "2.6.9", 87 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 88 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 89 | "requires": { 90 | "ms": "2.0.0" 91 | } 92 | }, 93 | "depd": { 94 | "version": "1.1.2", 95 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 96 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 97 | }, 98 | "destroy": { 99 | "version": "1.0.4", 100 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 101 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 102 | }, 103 | "dotenv": { 104 | "version": "8.2.0", 105 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 106 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 107 | }, 108 | "ee-first": { 109 | "version": "1.1.1", 110 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 111 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 112 | }, 113 | "ejs": { 114 | "version": "2.7.1", 115 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", 116 | "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==" 117 | }, 118 | "encodeurl": { 119 | "version": "1.0.2", 120 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 121 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 122 | }, 123 | "escape-html": { 124 | "version": "1.0.3", 125 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 126 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 127 | }, 128 | "etag": { 129 | "version": "1.8.1", 130 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 131 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 132 | }, 133 | "express": { 134 | "version": "4.17.1", 135 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 136 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 137 | "requires": { 138 | "accepts": "~1.3.7", 139 | "array-flatten": "1.1.1", 140 | "body-parser": "1.19.0", 141 | "content-disposition": "0.5.3", 142 | "content-type": "~1.0.4", 143 | "cookie": "0.4.0", 144 | "cookie-signature": "1.0.6", 145 | "debug": "2.6.9", 146 | "depd": "~1.1.2", 147 | "encodeurl": "~1.0.2", 148 | "escape-html": "~1.0.3", 149 | "etag": "~1.8.1", 150 | "finalhandler": "~1.1.2", 151 | "fresh": "0.5.2", 152 | "merge-descriptors": "1.0.1", 153 | "methods": "~1.1.2", 154 | "on-finished": "~2.3.0", 155 | "parseurl": "~1.3.3", 156 | "path-to-regexp": "0.1.7", 157 | "proxy-addr": "~2.0.5", 158 | "qs": "6.7.0", 159 | "range-parser": "~1.2.1", 160 | "safe-buffer": "5.1.2", 161 | "send": "0.17.1", 162 | "serve-static": "1.14.1", 163 | "setprototypeof": "1.1.1", 164 | "statuses": "~1.5.0", 165 | "type-is": "~1.6.18", 166 | "utils-merge": "1.0.1", 167 | "vary": "~1.1.2" 168 | } 169 | }, 170 | "express-session": { 171 | "version": "1.17.0", 172 | "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz", 173 | "integrity": "sha512-t4oX2z7uoSqATbMfsxWMbNjAL0T5zpvcJCk3Z9wnPPN7ibddhnmDZXHfEcoBMG2ojKXZoCyPMc5FbtK+G7SoDg==", 174 | "requires": { 175 | "cookie": "0.4.0", 176 | "cookie-signature": "1.0.6", 177 | "debug": "2.6.9", 178 | "depd": "~2.0.0", 179 | "on-headers": "~1.0.2", 180 | "parseurl": "~1.3.3", 181 | "safe-buffer": "5.2.0", 182 | "uid-safe": "~2.1.5" 183 | }, 184 | "dependencies": { 185 | "depd": { 186 | "version": "2.0.0", 187 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 188 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 189 | }, 190 | "safe-buffer": { 191 | "version": "5.2.0", 192 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 193 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 194 | } 195 | } 196 | }, 197 | "finalhandler": { 198 | "version": "1.1.2", 199 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 200 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 201 | "requires": { 202 | "debug": "2.6.9", 203 | "encodeurl": "~1.0.2", 204 | "escape-html": "~1.0.3", 205 | "on-finished": "~2.3.0", 206 | "parseurl": "~1.3.3", 207 | "statuses": "~1.5.0", 208 | "unpipe": "~1.0.0" 209 | } 210 | }, 211 | "forwarded": { 212 | "version": "0.1.2", 213 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 214 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 215 | }, 216 | "fresh": { 217 | "version": "0.5.2", 218 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 219 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 220 | }, 221 | "generaterr": { 222 | "version": "1.5.0", 223 | "resolved": "https://registry.npmjs.org/generaterr/-/generaterr-1.5.0.tgz", 224 | "integrity": "sha1-sM62zFFk3yoGEzjMNAqGFTlcUvw=" 225 | }, 226 | "http-errors": { 227 | "version": "1.7.2", 228 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 229 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 230 | "requires": { 231 | "depd": "~1.1.2", 232 | "inherits": "2.0.3", 233 | "setprototypeof": "1.1.1", 234 | "statuses": ">= 1.5.0 < 2", 235 | "toidentifier": "1.0.0" 236 | } 237 | }, 238 | "iconv-lite": { 239 | "version": "0.4.24", 240 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 241 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 242 | "requires": { 243 | "safer-buffer": ">= 2.1.2 < 3" 244 | } 245 | }, 246 | "inherits": { 247 | "version": "2.0.3", 248 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 249 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 250 | }, 251 | "ipaddr.js": { 252 | "version": "1.9.0", 253 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 254 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 255 | }, 256 | "kareem": { 257 | "version": "2.3.1", 258 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", 259 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" 260 | }, 261 | "media-typer": { 262 | "version": "0.3.0", 263 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 264 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 265 | }, 266 | "memory-pager": { 267 | "version": "1.5.0", 268 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 269 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 270 | "optional": true 271 | }, 272 | "merge-descriptors": { 273 | "version": "1.0.1", 274 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 275 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 276 | }, 277 | "methods": { 278 | "version": "1.1.2", 279 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 280 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 281 | }, 282 | "mime": { 283 | "version": "1.6.0", 284 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 285 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 286 | }, 287 | "mime-db": { 288 | "version": "1.40.0", 289 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 290 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 291 | }, 292 | "mime-types": { 293 | "version": "2.1.24", 294 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 295 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 296 | "requires": { 297 | "mime-db": "1.40.0" 298 | } 299 | }, 300 | "mongodb": { 301 | "version": "3.3.3", 302 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.3.tgz", 303 | "integrity": "sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==", 304 | "requires": { 305 | "bson": "^1.1.1", 306 | "require_optional": "^1.0.1", 307 | "safe-buffer": "^5.1.2", 308 | "saslprep": "^1.0.0" 309 | } 310 | }, 311 | "mongoose": { 312 | "version": "5.7.7", 313 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.7.tgz", 314 | "integrity": "sha512-FU59waB4LKBa9KOnqBUcCcMIVRc09TFo1F8nMxrzSiIWATaJpjxxSSH5FBVUDxQfNdJLfg9uFHxaTxhhwjsZOQ==", 315 | "requires": { 316 | "bson": "~1.1.1", 317 | "kareem": "2.3.1", 318 | "mongodb": "3.3.3", 319 | "mongoose-legacy-pluralize": "1.0.2", 320 | "mpath": "0.6.0", 321 | "mquery": "3.2.2", 322 | "ms": "2.1.2", 323 | "regexp-clone": "1.0.0", 324 | "safe-buffer": "5.1.2", 325 | "sift": "7.0.1", 326 | "sliced": "1.0.1" 327 | }, 328 | "dependencies": { 329 | "ms": { 330 | "version": "2.1.2", 331 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 332 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 333 | } 334 | } 335 | }, 336 | "mongoose-legacy-pluralize": { 337 | "version": "1.0.2", 338 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 339 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 340 | }, 341 | "mpath": { 342 | "version": "0.6.0", 343 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", 344 | "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" 345 | }, 346 | "mquery": { 347 | "version": "3.2.2", 348 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", 349 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", 350 | "requires": { 351 | "bluebird": "3.5.1", 352 | "debug": "3.1.0", 353 | "regexp-clone": "^1.0.0", 354 | "safe-buffer": "5.1.2", 355 | "sliced": "1.0.1" 356 | }, 357 | "dependencies": { 358 | "debug": { 359 | "version": "3.1.0", 360 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 361 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 362 | "requires": { 363 | "ms": "2.0.0" 364 | } 365 | } 366 | } 367 | }, 368 | "ms": { 369 | "version": "2.0.0", 370 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 371 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 372 | }, 373 | "negotiator": { 374 | "version": "0.6.2", 375 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 376 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 377 | }, 378 | "object-assign": { 379 | "version": "4.1.1", 380 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 381 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 382 | }, 383 | "on-finished": { 384 | "version": "2.3.0", 385 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 386 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 387 | "requires": { 388 | "ee-first": "1.1.1" 389 | } 390 | }, 391 | "on-headers": { 392 | "version": "1.0.2", 393 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 394 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 395 | }, 396 | "parseurl": { 397 | "version": "1.3.3", 398 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 399 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 400 | }, 401 | "passport": { 402 | "version": "0.4.0", 403 | "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", 404 | "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", 405 | "requires": { 406 | "passport-strategy": "1.x.x", 407 | "pause": "0.0.1" 408 | } 409 | }, 410 | "passport-local": { 411 | "version": "1.0.0", 412 | "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", 413 | "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", 414 | "requires": { 415 | "passport-strategy": "1.x.x" 416 | } 417 | }, 418 | "passport-local-mongoose": { 419 | "version": "5.0.1", 420 | "resolved": "https://registry.npmjs.org/passport-local-mongoose/-/passport-local-mongoose-5.0.1.tgz", 421 | "integrity": "sha512-VUY5DgBdpjt1tjunJJ1EXV5b2nhMDkXJuhTjyiK660IgIp7kONMyWEe9tGHf8I9tZudXuTF+47JNQLIzU+Hjbw==", 422 | "requires": { 423 | "debug": "^3.1.0", 424 | "generaterr": "^1.5.0", 425 | "passport-local": "^1.0.0", 426 | "scmp": "^2.0.0", 427 | "semver": "^5.5.0" 428 | }, 429 | "dependencies": { 430 | "debug": { 431 | "version": "3.2.6", 432 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 433 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 434 | "requires": { 435 | "ms": "^2.1.1" 436 | } 437 | }, 438 | "ms": { 439 | "version": "2.1.2", 440 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 441 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 442 | } 443 | } 444 | }, 445 | "passport-strategy": { 446 | "version": "1.0.0", 447 | "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", 448 | "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" 449 | }, 450 | "path-to-regexp": { 451 | "version": "0.1.7", 452 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 453 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 454 | }, 455 | "pause": { 456 | "version": "0.0.1", 457 | "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", 458 | "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" 459 | }, 460 | "proxy-addr": { 461 | "version": "2.0.5", 462 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 463 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 464 | "requires": { 465 | "forwarded": "~0.1.2", 466 | "ipaddr.js": "1.9.0" 467 | } 468 | }, 469 | "qs": { 470 | "version": "6.7.0", 471 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 472 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 473 | }, 474 | "random-bytes": { 475 | "version": "1.0.0", 476 | "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", 477 | "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" 478 | }, 479 | "range-parser": { 480 | "version": "1.2.1", 481 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 482 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 483 | }, 484 | "raw-body": { 485 | "version": "2.4.0", 486 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 487 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 488 | "requires": { 489 | "bytes": "3.1.0", 490 | "http-errors": "1.7.2", 491 | "iconv-lite": "0.4.24", 492 | "unpipe": "1.0.0" 493 | } 494 | }, 495 | "regexp-clone": { 496 | "version": "1.0.0", 497 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 498 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 499 | }, 500 | "require_optional": { 501 | "version": "1.0.1", 502 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 503 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 504 | "requires": { 505 | "resolve-from": "^2.0.0", 506 | "semver": "^5.1.0" 507 | } 508 | }, 509 | "resolve-from": { 510 | "version": "2.0.0", 511 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 512 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 513 | }, 514 | "safe-buffer": { 515 | "version": "5.1.2", 516 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 517 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 518 | }, 519 | "safer-buffer": { 520 | "version": "2.1.2", 521 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 522 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 523 | }, 524 | "saslprep": { 525 | "version": "1.0.3", 526 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 527 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 528 | "optional": true, 529 | "requires": { 530 | "sparse-bitfield": "^3.0.3" 531 | } 532 | }, 533 | "scmp": { 534 | "version": "2.0.0", 535 | "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.0.0.tgz", 536 | "integrity": "sha1-JHEQ7yLM+JexOj8KvdtSeCOTzWo=" 537 | }, 538 | "semver": { 539 | "version": "5.7.1", 540 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 541 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 542 | }, 543 | "send": { 544 | "version": "0.17.1", 545 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 546 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 547 | "requires": { 548 | "debug": "2.6.9", 549 | "depd": "~1.1.2", 550 | "destroy": "~1.0.4", 551 | "encodeurl": "~1.0.2", 552 | "escape-html": "~1.0.3", 553 | "etag": "~1.8.1", 554 | "fresh": "0.5.2", 555 | "http-errors": "~1.7.2", 556 | "mime": "1.6.0", 557 | "ms": "2.1.1", 558 | "on-finished": "~2.3.0", 559 | "range-parser": "~1.2.1", 560 | "statuses": "~1.5.0" 561 | }, 562 | "dependencies": { 563 | "ms": { 564 | "version": "2.1.1", 565 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 566 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 567 | } 568 | } 569 | }, 570 | "serve-static": { 571 | "version": "1.14.1", 572 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 573 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 574 | "requires": { 575 | "encodeurl": "~1.0.2", 576 | "escape-html": "~1.0.3", 577 | "parseurl": "~1.3.3", 578 | "send": "0.17.1" 579 | } 580 | }, 581 | "setprototypeof": { 582 | "version": "1.1.1", 583 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 584 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 585 | }, 586 | "sift": { 587 | "version": "7.0.1", 588 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", 589 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" 590 | }, 591 | "sliced": { 592 | "version": "1.0.1", 593 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 594 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 595 | }, 596 | "sparse-bitfield": { 597 | "version": "3.0.3", 598 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 599 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 600 | "optional": true, 601 | "requires": { 602 | "memory-pager": "^1.0.2" 603 | } 604 | }, 605 | "statuses": { 606 | "version": "1.5.0", 607 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 608 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 609 | }, 610 | "toidentifier": { 611 | "version": "1.0.0", 612 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 613 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 614 | }, 615 | "type-is": { 616 | "version": "1.6.18", 617 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 618 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 619 | "requires": { 620 | "media-typer": "0.3.0", 621 | "mime-types": "~2.1.24" 622 | } 623 | }, 624 | "uid-safe": { 625 | "version": "2.1.5", 626 | "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", 627 | "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", 628 | "requires": { 629 | "random-bytes": "~1.0.0" 630 | } 631 | }, 632 | "unpipe": { 633 | "version": "1.0.0", 634 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 635 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 636 | }, 637 | "utils-merge": { 638 | "version": "1.0.1", 639 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 640 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 641 | }, 642 | "vary": { 643 | "version": "1.1.2", 644 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 645 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 646 | } 647 | } 648 | } 649 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "author": "Ahmed Gulab Khan", 11 | "license": "ISC", 12 | "dependencies": { 13 | "body-parser": "^1.19.0", 14 | "cors": "^2.8.5", 15 | "dotenv": "^8.2.0", 16 | "ejs": "^2.7.1", 17 | "express": "^4.17.1", 18 | "express-session": "^1.17.0", 19 | "mongoose": "^5.7.7", 20 | "passport": "^0.4.0", 21 | "passport-local": "^1.0.0", 22 | "passport-local-mongoose": "^5.0.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /backend/server.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | var express = require("express"); 3 | var mongoose = require('mongoose'); 4 | var bodyParser = require('body-parser'); 5 | var cors = require("cors"); 6 | var router = express.Router(); 7 | var session = require('express-session'); 8 | var passport = require("passport"); 9 | var passportLocalMongoose = require("passport-local-mongoose"); 10 | 11 | var app = express(); 12 | 13 | //app.set('view engine', 'ejs'); 14 | app.use(cors({ 15 | origin: "http://localhost:3000", // restrict calls to those this address 16 | credentials: true, 17 | })); 18 | app.use(bodyParser.urlencoded({ extended: false })); 19 | app.use(bodyParser.json()); 20 | 21 | app.use(session({ 22 | secret: process.env.SECRET, 23 | resave: false, 24 | saveUninitialized: false 25 | })); 26 | 27 | app.use(passport.initialize()); 28 | app.use(passport.session()); 29 | 30 | 31 | //Connecting to MongoDB using mongoose 32 | mongoose.connect('mongodb://localhost:27017/MovieGoDB', {useNewUrlParser: true}); 33 | mongoose.set("useCreateIndex", true); 34 | 35 | //Defining Schemas 36 | var userSchema = new mongoose.Schema({ 37 | fullName: String, 38 | username: String, 39 | contactNumber: String, 40 | password: String 41 | }); 42 | var bookingSchema = new mongoose.Schema({ 43 | booking: String 44 | }); 45 | 46 | //Using passport-local-mongoose plugin on userSchema 47 | userSchema.plugin(passportLocalMongoose); 48 | 49 | //Defining Models 50 | var User = new mongoose.model('User', userSchema); 51 | var Booking = new mongoose.model('Booking', bookingSchema); 52 | 53 | passport.use(User.createStrategy()); 54 | 55 | passport.serializeUser(function(user, done) { 56 | done(null, user.id); 57 | }); 58 | 59 | passport.deserializeUser(function(id, done) { 60 | User.findById(id, function(err, user) { 61 | done(err, user); 62 | }); 63 | }); 64 | 65 | //All our requests go in here 66 | router.get('/signedin', function(req, res){ 67 | res.json(req.isAuthenticated()); 68 | }); 69 | 70 | router.post('/signin', function(req, res){ 71 | const user = new User({ 72 | username: req.body.username, 73 | password: req.body.password 74 | }); 75 | 76 | req.login(user, function(err){ 77 | if (err) { 78 | console.log(err); 79 | } 80 | else { 81 | passport.authenticate("local")(req, res, function(){ 82 | res.send(user); 83 | }); 84 | } 85 | }); 86 | }); 87 | 88 | router.post('/register', function(req, res){ 89 | User.register({fullName: req.body.fullName, 90 | username: req.body.username, 91 | contactNumber: req.body.contactNumber}, req.body.password, function(err, user){ 92 | passport.authenticate("local")(req, res, function(){ 93 | res.json(user); 94 | }); 95 | }); 96 | }); 97 | 98 | router.post('/pay', function(req, res){ 99 | var newBooking = Booking({booking: req.body.bookingDetails}).save(function(err, data){ 100 | if(err){ 101 | console.log(err); 102 | } 103 | else{ 104 | res.json(data); 105 | } 106 | }); 107 | }); 108 | 109 | router.post('/seats', function(req, res){ 110 | 111 | var regex1 = '^' + req.body.bookingDetails; 112 | var regex2 = regex1.replace(/\//g, "\\/"); 113 | var re = new RegExp(regex2,"g"); 114 | 115 | Booking.find({booking: re}, function(err, data){ 116 | if(err){ 117 | console.log(err); 118 | } 119 | else{ 120 | res.json(data); 121 | } 122 | }); 123 | 124 | /*Booking.find({booking: /^tt1596343\/01-11-2019\/07:45/g}, function(err, data){ 125 | if(err){ 126 | console.log(err); 127 | } 128 | else{ 129 | console.log(data); 130 | } 131 | });*/ 132 | }); 133 | 134 | router.get('/logout', function(req, res){ 135 | req.logout(); 136 | res.json(req.isAuthenticated()); 137 | }); 138 | 139 | app.use('/api', router); 140 | 141 | app.listen(3001); 142 | console.log("Listening to port 3001\n"); 143 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 2 | 3 | ## Available Scripts 4 | 5 | In the project directory, you can run: 6 | 7 | ### `npm start` 8 | 9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 11 | 12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console. 14 | 15 | ### `npm test` 16 | 17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 19 | 20 | ### `npm run build` 21 | 22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance. 24 | 25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed! 27 | 28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 29 | 30 | ### `npm run eject` 31 | 32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 33 | 34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 35 | 36 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 37 | 38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 39 | 40 | ## Learn More 41 | 42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 43 | 44 | To learn React, check out the [React documentation](https://reactjs.org/). 45 | 46 | ### Code Splitting 47 | 48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting 49 | 50 | ### Analyzing the Bundle Size 51 | 52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size 53 | 54 | ### Making a Progressive Web App 55 | 56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app 57 | 58 | ### Advanced Configuration 59 | 60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration 61 | 62 | ### Deployment 63 | 64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment 65 | 66 | ### `npm run build` fails to minify 67 | 68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify 69 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "node-sass": "^7.0.0", 7 | "react": "^16.11.0", 8 | "react-dom": "^16.11.0", 9 | "react-router-dom": "^5.1.2", 10 | "react-scripts": "3.2.0" 11 | }, 12 | "scripts": { 13 | "start": "react-scripts start", 14 | "build": "react-scripts build", 15 | "test": "react-scripts test", 16 | "eject": "react-scripts eject" 17 | }, 18 | "eslintConfig": { 19 | "extends": "react-app" 20 | }, 21 | "browserslist": { 22 | "production": [ 23 | ">0.2%", 24 | "not dead", 25 | "not op_mini all" 26 | ], 27 | "development": [ 28 | "last 1 chrome version", 29 | "last 1 firefox version", 30 | "last 1 safari version" 31 | ] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 19 | 20 | 29 | React App 30 | 31 | 32 | 33 |
34 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /frontend/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/public/logo192.png -------------------------------------------------------------------------------- /frontend/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/public/logo512.png -------------------------------------------------------------------------------- /frontend/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /frontend/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /frontend/src/App.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Open Sans Condensed'; 3 | background-color: rgb(30, 30, 30); 4 | color: white; 5 | } 6 | 7 | a { 8 | text-decoration: none; 9 | } 10 | 11 | * { 12 | box-sizing: border-box; 13 | } -------------------------------------------------------------------------------- /frontend/src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './App.css'; 3 | 4 | import { Route, Switch } from 'react-router-dom'; 5 | 6 | import HomePage from './pages/homepage/homepage.component'; 7 | import NowShowing from './pages/now-showing/now-showing.component'; 8 | import Upcoming from './pages/upcoming/upcoming.component'; 9 | import Popular from './pages/popular/popular.component'; 10 | import SignInAndSignUp from './pages/sign-in-and-sign-up/sign-in-and-sign-up.component'; 11 | import Header from './components/header/header.component'; 12 | import CollectionDetailsPage from './pages/collection-details-page/collection-details-page.component'; 13 | 14 | class App extends React.Component { 15 | 16 | constructor(props) { 17 | super(props); 18 | 19 | this.state = { 20 | isLoggedIn: 'false' 21 | } 22 | } 23 | 24 | onChange = (newState) => { 25 | this.setState({ 26 | isLoggedIn: newState 27 | }); 28 | } 29 | 30 | componentDidMount(){ 31 | fetch('http://localhost:3001/api/signedin', { 32 | method: 'GET', 33 | headers: { 34 | 'Accept': 'application/json', 35 | 'Content-Type': 'application/json' 36 | }, 37 | credentials: 'include' 38 | }) 39 | .then(res => res.json()) 40 | .then(json => { 41 | if(json===true){ 42 | this.setState({isLoggedIn: 'true'}); 43 | } 44 | else{ 45 | this.setState({isLoggedIn: 'false'}); 46 | } 47 | }) 48 | .catch(err => console.log(err)) 49 | 50 | } 51 | 52 | render() { 53 | return ( 54 |
55 |
56 | 57 | 58 | 59 | 60 | 61 | } /> 62 | 63 | 64 |
65 | ); 66 | } 67 | } 68 | 69 | export default App; 70 | -------------------------------------------------------------------------------- /frontend/src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /frontend/src/components/book-date/book-date.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | import './book-date.styles.scss'; 5 | 6 | const BookDate = ({ match }) => { 7 | return( 8 |
9 |

These are all the available shows

10 |
11 | 07:45 12 | 11:30 13 | 15:30 14 | 18:00 15 | 21:55 16 |
17 |
18 | ); 19 | } 20 | 21 | export default BookDate; -------------------------------------------------------------------------------- /frontend/src/components/book-date/book-date.styles.scss: -------------------------------------------------------------------------------- 1 | .show-list-container{ 2 | text-align: center; 3 | 4 | h1{ 5 | font-size: 50px; 6 | } 7 | 8 | .show-list{ 9 | padding-top: 30px; 10 | 11 | span{ 12 | text-decoration: none; 13 | color: rgb(0, 195, 255); 14 | outline: 1px solid rgb(0, 195, 255); 15 | padding: 10px; 16 | margin: 25px; 17 | font-size: 25px; 18 | 19 | &:hover{ 20 | color: white; 21 | background-color: rgb(0, 195, 255); 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /frontend/src/components/book-movie-title/book-movie-title.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | import './book-movie-title.styles.scss'; 5 | 6 | const BookMovieTitle = ({ match }) => { 7 | return( 8 |
9 |

Select the Date from the below mentioned:

10 |
11 | 01-11-2019 12 | 03-11-2019 13 | 07-11-2019 14 | 10-11-2019 15 | 16-11-2019 16 | 21-11-2019 17 |
18 |
19 | ); 20 | } 21 | 22 | export default BookMovieTitle; -------------------------------------------------------------------------------- /frontend/src/components/book-movie-title/book-movie-title.styles.scss: -------------------------------------------------------------------------------- 1 | .date-list-container{ 2 | text-align: center; 3 | 4 | h1{ 5 | font-size: 50px; 6 | } 7 | 8 | .date-list{ 9 | padding-top: 30px; 10 | 11 | span{ 12 | text-decoration: none; 13 | color: rgb(0, 195, 255); 14 | outline: 1px solid rgb(0, 195, 255); 15 | padding: 10px; 16 | margin: 25px; 17 | font-size: 25px; 18 | 19 | &:hover{ 20 | color: white; 21 | background-color: rgb(0, 195, 255); 22 | } 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /frontend/src/components/book-show/book-show.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | import './book-show.styles.scss'; 5 | 6 | const BookShow = ({ match }) => { 7 | fetch('http://localhost:3001/api/seats',{ 8 | method: 'POST', 9 | headers: { 10 | 'Accept': 'application/json', 11 | 'Content-Type': 'application/json' 12 | }, 13 | credentials: 'include', 14 | body: JSON.stringify({bookingDetails: match.params.imdbID + '/' + match.params.date + '/' + match.params.show + '/'}) 15 | }) 16 | .then(res => res.json()) 17 | .then(json => { 18 | var reservedSeats = new Array(); 19 | for(var obj in json){ 20 | var len = json[obj].booking.length; 21 | //console.log(json[obj].booking[len-2] + json[obj].booking[len-1]); 22 | reservedSeats.push(json[obj].booking[len-2] + json[obj].booking[len-1]); 23 | } 24 | for(var seat=0;seat console.log(err)); 32 | 33 | return( 34 |
35 |

These are all the available seats

36 |
37 | 01 38 | 02 39 | 03 40 | 04 41 | 05 42 | 06 43 | 07 44 | 08 45 | 09 46 | 10 47 |
48 |
49 |
50 | 11 51 | 12 52 | 13 53 | 14 54 | 15 55 | 16 56 | 17 57 | 18 58 | 19 59 | 20 60 |
61 |
62 |
63 | 21 64 | 22 65 | 23 66 | 24 67 | 25 68 | 26 69 | 27 70 | 28 71 | 29 72 | 30 73 |
74 |
75 | ); 76 | } 77 | 78 | export default BookShow; -------------------------------------------------------------------------------- /frontend/src/components/book-show/book-show.styles.scss: -------------------------------------------------------------------------------- 1 | .seat-list-container{ 2 | text-align: center; 3 | 4 | h1{ 5 | font-size: 50px; 6 | } 7 | 8 | .seat-list{ 9 | padding-top: 30px; 10 | 11 | .reserved{ 12 | text-decoration: none; 13 | color: rgba(125, 125, 125, 0.5); 14 | cursor: default; 15 | border: 1px solid rgba(125, 125, 125, 0.5); 16 | padding: 10px; 17 | margin: 10px; 18 | font-size: 25px; 19 | pointer-events: none; 20 | border-radius: 10px; 21 | } 22 | 23 | .link{ 24 | text-decoration: none; 25 | color: rgb(0, 195, 255); 26 | border: 1px solid rgb(0, 195, 255); 27 | padding: 10px; 28 | margin: 10px; 29 | font-size: 25px; 30 | border-radius: 10px; 31 | 32 | &:hover{ 33 | color: white; 34 | background-color: rgb(0, 195, 255); 35 | } 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /frontend/src/components/collection-details-movie/collection-details-movie.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import './collection-details-movie.styles.scss'; 4 | 5 | import MOVIE_DATA from '../../assets/movie.data'; 6 | 7 | class CollectionDetailsMovie extends React.Component { 8 | 9 | constructor() { 10 | super(); 11 | 12 | this.state = { 13 | isLoggedIn: 'false' 14 | } 15 | } 16 | 17 | componentDidMount(){ 18 | fetch('http://localhost:3001/api/signedin', { 19 | method: 'GET', 20 | headers: { 21 | 'Accept': 'application/json', 22 | 'Content-Type': 'application/json' 23 | }, 24 | credentials: 'include' 25 | }) 26 | .then(res => res.json()) 27 | .then(json => { 28 | if(json===true){ 29 | this.setState({isLoggedIn: 'true'}); 30 | } 31 | else{ 32 | this.setState({isLoggedIn: 'false'}); 33 | } 34 | }) 35 | .catch(err => console.log(err)); 36 | } 37 | 38 | bookWithoutLogin = () => { 39 | alert("You need to Sign-in/Register in order to book tickets..."); 40 | } 41 | 42 | render() { 43 | const collections = MOVIE_DATA; 44 | const currentCollection = collections.find(collection => collection.imdbID === this.props.match.params.imdbID); 45 | console.log(currentCollection); 46 | if(currentCollection===undefined){ 47 | return(

The movie with the imdbID does not exist

); 48 | } 49 | 50 | return( 51 |
52 |
53 |
54 | {currentCollection.Title} 55 |
56 |
57 |

{currentCollection.Title}

58 |

Released: {currentCollection.Released}

59 |

Rated: {currentCollection.Rated}

60 |

Genre: {currentCollection.Genre}

61 |

Runtime: {currentCollection.Runtime}

62 |

Cast: {currentCollection.Actors}

63 |

Director: {currentCollection.Director}

64 |

Writer: {currentCollection.Writer}

65 |

Plot: {currentCollection.Plot}

66 | { 67 | currentCollection.Year>=2013 ? 68 | (

IMDB Rating: N/A

) 69 | : 70 | (

IMDB Rating: {currentCollection.imdbRating}

) 71 | } 72 |
73 |
74 | { 75 | this.state.isLoggedIn==='true' ? 76 | ( 77 | 78 |
79 | BOOK TICKETS 80 |
81 | 82 | ) 83 | : 84 | ( 85 | 86 |
87 | BOOK TICKETS 88 |
89 | 90 | ) 91 | } 92 |
93 | ); 94 | } 95 | } 96 | 97 | export default CollectionDetailsMovie; -------------------------------------------------------------------------------- /frontend/src/components/collection-details-movie/collection-details-movie.styles.scss: -------------------------------------------------------------------------------- 1 | .collection-details-container{ 2 | display: inline-flex; 3 | padding: 30px; 4 | 5 | .image-container{ 6 | padding: 0px 30px; 7 | margin: auto; 8 | } 9 | 10 | .content{ 11 | padding: 0px 30px; 12 | 13 | h2{ 14 | font-size: 30px; 15 | } 16 | 17 | span{ 18 | color: rgb(0, 195, 255); 19 | } 20 | } 21 | } 22 | 23 | .book-now{ 24 | width: 100%; 25 | height: 60px; 26 | font-size: 20px; 27 | color: white; 28 | background-color: rgb(0, 195, 255); 29 | display: inline-flex; 30 | align-items: center; 31 | justify-content: center; 32 | transition: background-color 0.75s ease; 33 | 34 | &:hover{ 35 | background-color: rgb(0, 130, 170); 36 | } 37 | } -------------------------------------------------------------------------------- /frontend/src/components/collection-item/collection-item.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './collection-item.styles.scss'; 3 | import { Link } from 'react-router-dom'; 4 | 5 | const CollectionItem = ({Poster, imdbRating, imdbID, Title, collectionType}) => ( 6 | 7 |
8 | {Title} 9 |
10 | { 11 | (() => { 12 | if(collectionType==='upcoming-direct' || collectionType==='upcoming-indirect'){ 13 | return( 14 |
15 | {Title} 16 |
17 | ); 18 | } 19 | 20 | else{ 21 | return( 22 |
23 | {Title} 24 | {imdbRating*10}% 25 |
26 | ); 27 | } 28 | })() 29 | } 30 | 31 | ) 32 | 33 | export default CollectionItem; -------------------------------------------------------------------------------- /frontend/src/components/collection-item/collection-item.styles.scss: -------------------------------------------------------------------------------- 1 | .collection-item{ 2 | display: inline-block; 3 | //background-color: red; 4 | margin: 2em; 5 | height: 300px; 6 | width: 200px; 7 | color: white; 8 | 9 | &:hover{ 10 | cursor: pointer; 11 | transform: scale(1.1); 12 | transition: transform 0.5s cubic-bezier(0.25, 0.45, 0.45, 0.95); 13 | } 14 | 15 | .image-container { 16 | height: 90%; 17 | width: 100%; 18 | opacity: 1.0; 19 | &:hover .image{ 20 | opacity: 1.0; 21 | } 22 | 23 | .image { 24 | height: 100%; 25 | width: 100%; 26 | opacity: 0.7; 27 | } 28 | } 29 | 30 | .collection-footer { 31 | height: 10%; 32 | width: 100%; 33 | font-size: 15px; 34 | margin: 8px 0px; 35 | .rating{ 36 | float: right; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /frontend/src/components/collection-preview/collection-preview.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './collection-preview.styles.scss'; 4 | import CollectionItem from '../collection-item/collection-item.component'; 5 | 6 | const CollectionPreview = ({collectionType, collections}) => ( 7 |
8 | { 9 | (() => { 10 | let collectionsNowShowing = collections; 11 | let collectionsPopular = [...collections].sort((a, b) => (b.imdbRating-a.imdbRating)); 12 | collectionsNowShowing = collectionsNowShowing.filter((collection, idx) => collection.Year<2013); 13 | collectionsPopular = collectionsPopular.filter((collection, idx) => collection.Year<2013); 14 | let collectionsUpcoming = [...collections].filter((collection, idx) => collection.Year >= 2013); 15 | 16 | if(collectionType==='now-showing-indirect'){ 17 | return(collectionsNowShowing.filter((collection, idx) => idx<10). 18 | map(({ imdbID, ...otherCollectionProps }) => 19 | 20 | )) 21 | } 22 | 23 | else if(collectionType==='now-showing-direct'){ 24 | return(collectionsNowShowing.filter((collection, idx) => idx<40). 25 | map(({ imdbID, ...otherCollectionProps }) => 26 | 27 | )) 28 | } 29 | 30 | else if(collectionType==='upcoming-indirect'){ 31 | return(collectionsUpcoming.filter((collection, idx) => idx<10). 32 | map(({ imdbID, ...otherCollectionProps }) => 33 | 34 | )) 35 | } 36 | 37 | else if(collectionType==='upcoming-direct'){ 38 | return(collectionsUpcoming.filter((collection, idx) => idx<40). 39 | map(({ imdbID, ...otherCollectionProps }) => 40 | 41 | )) 42 | } 43 | 44 | else if(collectionType==='popular-indirect'){ 45 | return(collectionsPopular.filter((collection, idx) => idx<10). 46 | map(({ imdbID, ...otherCollectionProps }) => 47 | 48 | )) 49 | } 50 | 51 | else{ 52 | return(collectionsPopular.filter((collection, idx) => idx<40). 53 | map(({ imdbID, ...otherCollectionProps }) => 54 | 55 | )) 56 | } 57 | })() 58 | } 59 |
60 | ) 61 | 62 | export default CollectionPreview; -------------------------------------------------------------------------------- /frontend/src/components/collection-preview/collection-preview.styles.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/components/collection-preview/collection-preview.styles.scss -------------------------------------------------------------------------------- /frontend/src/components/header/header.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | import './header.styles.scss'; 4 | 5 | const Header = (props) => { 6 | function handleLogout() { 7 | fetch('http://localhost:3001/api/logout', { 8 | method: 'GET', 9 | headers: { 10 | 'Accept': 'application/json', 11 | 'Content-Type': 'application/json' 12 | }, 13 | credentials: 'include' 14 | }) 15 | .then(res => { 16 | alert("You have logged out of your account!"); 17 | window.location.replace("http://localhost:3000"); 18 | }) 19 | .catch(err => console.log(err)); 20 | } 21 | 22 | return ( 23 |
24 |
25 | MovieGo 26 |
27 |
28 | Now Showing 29 | Upcoming 30 | Popular 31 |
32 |
33 | { 34 | (props.isLoggedIn==='true') ? 35 | (Logout) 36 | : 37 | (Sign In / Register) 38 | } 39 |
40 |
41 | ); 42 | } 43 | 44 | export default Header; -------------------------------------------------------------------------------- /frontend/src/components/header/header.styles.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | height: 70px; 3 | width: 100%; 4 | position: sticky; 5 | top: 0px; 6 | z-index: 1; 7 | display: flex; 8 | justify-content: space-between; 9 | margin-bottom: 25px; 10 | background-color: rgb(75, 75, 75); 11 | color: white; 12 | box-shadow: 0px 2px 4px black; 13 | 14 | .container { 15 | padding: 0px 50px; 16 | } 17 | 18 | .logo-container { 19 | height: 100%; 20 | width: 25%; 21 | padding: 25px; 22 | display: flex; 23 | align-items: center; 24 | 25 | .logo { 26 | color: rgb(0, 195, 255); 27 | font-size: 30px; 28 | font-style: oblique; 29 | font-weight: bolder; 30 | text-shadow: -1px 1px 4px black; 31 | } 32 | } 33 | 34 | .options { 35 | width: 50%; 36 | height: 100%; 37 | display: flex; 38 | align-items: center; 39 | justify-content: center; 40 | 41 | .option { 42 | padding: 10px 15px; 43 | cursor: pointer; 44 | color: white; 45 | font-size: 20px; 46 | &:hover{ 47 | background-color: rgb(0, 195, 255); 48 | color: white; 49 | } 50 | &:focus{ 51 | background-color: rgb(0, 195, 255); 52 | color: white; 53 | } 54 | } 55 | } 56 | 57 | .sign-in-container { 58 | height: 100%; 59 | width: 25%; 60 | display: flex; 61 | align-items: center; 62 | justify-content: flex-end; 63 | 64 | .sign-in { 65 | padding: 5px 20px; 66 | cursor: pointer; 67 | color: white; 68 | background-color: rgb(0, 195, 255); 69 | font-size: 20px; 70 | //border: 1px solid rgb(0, 195, 255); 71 | border-radius: 10px; 72 | 73 | &:hover{ 74 | color: white; 75 | background-color: rgb(0, 130, 170); 76 | } 77 | } 78 | 79 | .log-out { 80 | padding: 5px 20px; 81 | cursor: pointer; 82 | color: white; 83 | background-color: rgb(255, 60, 60); 84 | font-size: 20px; 85 | //border: 1px solid rgb(255, 0, 0); 86 | border-radius: 10px; 87 | 88 | &:hover{ 89 | color: white; 90 | background-color: red; 91 | } 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /frontend/src/components/sign-in/sign-in.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './sign-in.styles.scss'; 3 | import { withRouter } from 'react-router-dom'; 4 | 5 | class SignIn extends React.Component { 6 | constructor(props){ 7 | super(props); 8 | 9 | this.state = { 10 | username: '', 11 | password: '' 12 | } 13 | } 14 | 15 | handleSubmit = (event) => { 16 | event.preventDefault(); 17 | 18 | fetch('http://localhost:3001/api/signin',{ 19 | method: 'POST', 20 | headers: { 21 | 'Accept': 'application/json', 22 | 'Content-Type': 'application/json' 23 | }, 24 | credentials: 'include', 25 | body: JSON.stringify(this.state) 26 | }) 27 | .then(res => { 28 | if(res.status === 401){ 29 | alert("ERROR: Invalid Email and/or Password combination!"); 30 | window.location.reload(); 31 | } 32 | else if(res.status === 400){ 33 | alert("ERROR: Fill all the required fields"); 34 | } 35 | else{ 36 | this.props.onAuthChange('true'); 37 | this.props.history.push('/'); 38 | } 39 | }) 40 | .catch(err => console.log(err)); 41 | } 42 | 43 | handleChange = (event) => { 44 | const {value, name} = event.target; 45 | 46 | this.setState({ [name]: value }); 47 | } 48 | 49 | render() { 50 | return( 51 |
52 |

Already have an Account?

53 | Sign In with your Email and Password 54 |
55 |
56 | 57 | 58 | 59 |
60 |
61 |
62 | ); 63 | } 64 | } 65 | 66 | export default withRouter(SignIn); -------------------------------------------------------------------------------- /frontend/src/components/sign-in/sign-in.styles.scss: -------------------------------------------------------------------------------- 1 | .sign-in-container { 2 | margin: 0px 10px; 3 | width: 50%; 4 | 5 | h2{ 6 | font-size: 27px; 7 | } 8 | 9 | span{ 10 | font-size: 20px; 11 | } 12 | 13 | .form-container { 14 | //margin: 20px; 15 | .input { 16 | //display: block; 17 | height: 35px; 18 | margin: 10px 0px; 19 | font-size: 16px; 20 | width: 100%; 21 | color: white; 22 | background-color: transparent; 23 | border: none; 24 | border-bottom: 1px solid white; 25 | outline: transparent; 26 | } 27 | 28 | .button { 29 | margin: 10px 0px; 30 | padding: 10px 15px; 31 | font-size: 16px; 32 | color: white; 33 | background-color: rgb(0, 195, 255); 34 | border: none; 35 | border-radius: 5px; 36 | 37 | &:hover{ 38 | background-color: rgb(0, 130, 170); 39 | cursor: pointer; 40 | } 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /frontend/src/components/sign-up/sign-up.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './sign-up.styles.scss'; 3 | import { withRouter } from 'react-router-dom'; 4 | 5 | class SignUp extends React.Component { 6 | constructor(props){ 7 | super(props); 8 | 9 | this.state = { 10 | fullName: '', 11 | username: '', 12 | contactNumber: '', 13 | password: '', 14 | confirmPassword: '' 15 | } 16 | } 17 | 18 | handleSubmit = (event) => { 19 | event.preventDefault(); 20 | 21 | if(this.state.password === this.state.confirmPassword) { 22 | fetch('http://localhost:3001/api/register',{ 23 | method: 'POST', 24 | headers: { 25 | 'Accept': 'application/json', 26 | 'Content-Type': 'application/json' 27 | }, 28 | credentials: 'include', 29 | body: JSON.stringify(this.state) 30 | }) 31 | .then(res => { 32 | if(res.status === 401){ 33 | alert("ERROR: This Email already exists! Try to Sign-in"); 34 | window.location.reload(); 35 | } 36 | else if(res.status === 400){ 37 | alert("ERROR: Fill all the required fields"); 38 | } 39 | else{ 40 | alert('Registered successfully!'); 41 | this.props.onAuthChange('true'); 42 | this.props.history.push('/'); 43 | } 44 | }) 45 | .catch(err => console.log(err)); 46 | } 47 | else { 48 | alert("Password and Confirm Password fields do not match!"); 49 | } 50 | } 51 | 52 | handleChange = (event) => { 53 | const {value, name} = event.target; 54 | 55 | this.setState({ [name]: value }); 56 | } 57 | 58 | render() { 59 | return( 60 |
61 |

Not Registered Yet?

62 | Create an Account 63 |
64 |
65 | 66 | 67 | 68 | 69 | 70 | 71 |
72 |
73 |
74 | ); 75 | } 76 | } 77 | 78 | export default withRouter(SignUp); -------------------------------------------------------------------------------- /frontend/src/components/sign-up/sign-up.styles.scss: -------------------------------------------------------------------------------- 1 | .sign-up-container { 2 | margin: 0px 10px; 3 | width: 50%; 4 | 5 | h2{ 6 | font-size: 27px; 7 | } 8 | 9 | span{ 10 | font-size: 20px; 11 | } 12 | 13 | .form-container { 14 | //margin: 20px; 15 | .input { 16 | //display: block; 17 | height: 35px; 18 | margin: 10px 0px; 19 | font-size: 16px; 20 | width: 100%; 21 | color: white; 22 | background-color: transparent; 23 | border: none; 24 | border-bottom: 1px solid white; 25 | outline: transparent; 26 | } 27 | 28 | .button { 29 | margin: 10px 0px; 30 | padding: 10px 15px; 31 | font-size: 16px; 32 | color: white; 33 | background-color: rgb(0, 195, 255); 34 | border: none; 35 | border-radius: 5px; 36 | 37 | &:hover{ 38 | background-color: rgb(0, 130, 170); 39 | cursor: pointer; 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | 7 | import { BrowserRouter } from 'react-router-dom'; 8 | 9 | ReactDOM.render( 10 | 11 | 12 | , document.getElementById('root')); 13 | -------------------------------------------------------------------------------- /frontend/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/pages/book-date-page/book-date-page.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Link, Switch } from 'react-router-dom'; 3 | 4 | import './book-date-page.styles.scss'; 5 | 6 | import BookDate from '../../components/book-date/book-date.component'; 7 | import BookShowPage from '../book-show-page/book-show-page.component'; 8 | 9 | const BookDatePage = ({ match }) => { 10 | return( 11 |
12 | 13 | 14 | 15 | 16 |
17 | ); 18 | } 19 | 20 | export default BookDatePage; -------------------------------------------------------------------------------- /frontend/src/pages/book-date-page/book-date-page.styles.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/book-date-page/book-date-page.styles.scss -------------------------------------------------------------------------------- /frontend/src/pages/book-movie-title-page/book-movie-title-page.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Switch } from 'react-router-dom'; 3 | import './book-movie-title-page.styles.scss'; 4 | 5 | import BookMovieTitle from '../../components/book-movie-title/book-movie-title.component'; 6 | import BookDatePage from '../book-date-page/book-date-page.component'; 7 | 8 | const BookMovieTitlePage = ({ match }) => { 9 | return( 10 |
11 | 12 | 13 | 14 | 15 |
16 | ); 17 | } 18 | 19 | export default BookMovieTitlePage; -------------------------------------------------------------------------------- /frontend/src/pages/book-movie-title-page/book-movie-title-page.styles.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/book-movie-title-page/book-movie-title-page.styles.scss -------------------------------------------------------------------------------- /frontend/src/pages/book-show-page/book-show-page.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Link, Switch } from 'react-router-dom'; 3 | 4 | import './book-show-page.styles.scss'; 5 | 6 | import BookShow from '../../components/book-show/book-show.component'; 7 | import PayPage from '../pay-page/pay-page.component'; 8 | 9 | const BookShowPage = ({ match }) => { 10 | return( 11 |
12 | 13 | 14 | 15 | 16 |
17 | ); 18 | } 19 | 20 | export default BookShowPage; -------------------------------------------------------------------------------- /frontend/src/pages/book-show-page/book-show-page.styles.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/book-show-page/book-show-page.styles.scss -------------------------------------------------------------------------------- /frontend/src/pages/collection-details-page/collection-details-page.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Switch } from 'react-router-dom'; 3 | import './collection-details-page.styles.scss'; 4 | 5 | import MOVIE_DATA from '../../assets/movie.data'; 6 | 7 | import BookMovieTitlePage from '../book-movie-title-page/book-movie-title-page.component'; 8 | import CollectionDetailsMovie from '../../components/collection-details-movie/collection-details-movie.component'; 9 | 10 | const CollectionDetailsPage = ({ match }) => { 11 | const collections = MOVIE_DATA; 12 | const currentCollection = collections.find(collection => collection.imdbID === match.params.imdbID); 13 | console.log(currentCollection); 14 | return( 15 |
16 | 17 | 18 | 19 | 20 |
21 | ); 22 | } 23 | 24 | export default CollectionDetailsPage; -------------------------------------------------------------------------------- /frontend/src/pages/collection-details-page/collection-details-page.styles.scss: -------------------------------------------------------------------------------- 1 | /*.collection-details-container{ 2 | display: inline-flex; 3 | padding: 30px; 4 | 5 | .image-container{ 6 | padding: 0px 30px; 7 | } 8 | 9 | .content{ 10 | padding: 0px 30px; 11 | 12 | h2{ 13 | font-size: 30px; 14 | } 15 | 16 | span{ 17 | color: rgb(0, 195, 255); 18 | } 19 | } 20 | } 21 | 22 | .book-now{ 23 | width: 100%; 24 | height: 60px; 25 | font-size: 20px; 26 | color: white; 27 | background-color: rgb(0, 195, 255); 28 | display: inline-flex; 29 | align-items: center; 30 | justify-content: center; 31 | }*/ -------------------------------------------------------------------------------- /frontend/src/pages/homepage/homepage.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Link } from 'react-router-dom'; 3 | 4 | import MOVIE_DATA from '../../assets/movie.data'; 5 | import './homepage.styles.scss'; 6 | import CollectionPreview from '../../components/collection-preview/collection-preview.component'; 7 | 8 | class HomePage extends React.Component { 9 | constructor(){ 10 | super(); 11 | this.state = { 12 | collections: MOVIE_DATA 13 | } 14 | } 15 | 16 | render() { 17 | const { collections } = this.state; 18 | return( 19 |
20 |
21 |

Now Showing

22 | 23 | 24 |
25 | Load More Items 26 |
27 | 28 |
29 |
30 |

Upcoming

31 | 32 | 33 |
34 | Load More Items 35 |
36 | 37 |
38 |
39 |

Popular

40 | 41 | 42 |
43 | Load More Items 44 |
45 | 46 |
47 |
48 | ); 49 | } 50 | } 51 | 52 | export default HomePage; -------------------------------------------------------------------------------- /frontend/src/pages/homepage/homepage.styles.scss: -------------------------------------------------------------------------------- 1 | .load-more-items { 2 | text-align: center; 3 | 4 | div{ 5 | margin: auto; 6 | margin-bottom: 30px; 7 | display: flex; 8 | align-items: center; 9 | justify-content: center; 10 | height: 40px; 11 | width: 80%; 12 | border: 1px solid rgb(0, 195, 255); 13 | border-radius: 20px; 14 | color: rgb(0, 195, 255); 15 | 16 | &:hover{ 17 | color: white; 18 | background-color: rgb(0, 195, 255); 19 | } 20 | } 21 | } 22 | 23 | h1{ 24 | margin-left: 30px; 25 | } -------------------------------------------------------------------------------- /frontend/src/pages/now-showing/now-showing.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './now-showing.styles.scss'; 3 | import CollectionPreview from '../../components/collection-preview/collection-preview.component'; 4 | import MOVIE_DATA from '../../assets/movie.data'; 5 | 6 | class NowShowing extends React.Component { 7 | constructor(){ 8 | super(); 9 | this.state = { 10 | collections: MOVIE_DATA 11 | } 12 | } 13 | 14 | render() { 15 | const {collections} = this.state; 16 | return ( 17 |
18 |

Now Showing

19 | 20 |
21 | ); 22 | } 23 | } 24 | 25 | export default NowShowing; -------------------------------------------------------------------------------- /frontend/src/pages/now-showing/now-showing.styles.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/now-showing/now-showing.styles.scss -------------------------------------------------------------------------------- /frontend/src/pages/pay-page/pay-page.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Route, Link, Switch } from 'react-router-dom'; 3 | 4 | import './pay-page.styles.scss'; 5 | 6 | class PayPage extends React.Component { 7 | constructor(props){ 8 | super(props); 9 | 10 | this.state = { 11 | fullName: '', 12 | username: '', 13 | city: '', 14 | state: '', 15 | zip: '', 16 | nameOnCard: '', 17 | cardNumber: '', 18 | expirationMonth: '', 19 | expirationYear: '', 20 | cvv: '', 21 | bookingDetails: props.match.params.imdbID + '/' + props.match.params.date + '/' + props.match.params.show + '/' + props.match.params.seat 22 | } 23 | } 24 | 25 | handleSubmit = (event) => { 26 | event.preventDefault(); 27 | 28 | if(this.state.fullName==='' || this.state.username==='' || this.state.city==='' || this.state.state==='' || 29 | this.state.zip==='' || this.state.nameOnCard==='' || this.state.cardNumber==='' || this.state.expirationMonth==='' || 30 | this.state.expirationYear==='' || this.state.cvv===''){ 31 | alert('Please fill out all the fields'); 32 | } 33 | 34 | else{ 35 | fetch('http://localhost:3001/api/pay',{ 36 | method: 'POST', 37 | headers: { 38 | 'Accept': 'application/json', 39 | 'Content-Type': 'application/json' 40 | }, 41 | credentials: 'include', 42 | body: JSON.stringify(this.state) 43 | }) 44 | .then(res => { 45 | if(res.status === 400){ 46 | alert("ERROR: Fill all the required fields"); 47 | } 48 | else{ 49 | alert("Payment done, booked seat successfully. You'll be redirected to your homepage"); 50 | this.props.history.push('/'); 51 | } 52 | }) 53 | .catch(err => console.log(err)); 54 | } 55 | } 56 | 57 | handleChange = (event) => { 58 | const {value, name} = event.target; 59 | 60 | this.setState({ [name]: value }); 61 | } 62 | 63 | render() { 64 | return( 65 |
66 |

Booking the seat {this.props.match.params.seat} at {this.props.match.params.show}hrs on {this.props.match.params.date} of {this.props.match.params.Title.replace(/\+/g, " ")}

67 |
68 |
69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
80 | 81 | Total amount to be paid: Rs.100 82 |
83 |
84 |
85 |
86 | ); 87 | } 88 | } 89 | 90 | export default PayPage; -------------------------------------------------------------------------------- /frontend/src/pages/pay-page/pay-page.styles.scss: -------------------------------------------------------------------------------- 1 | .pay-container { 2 | //margin: 0px 10px; 3 | width: 50%; 4 | margin: auto; 5 | text-align: center; 6 | 7 | h2{ 8 | font-size: 40px; 9 | } 10 | 11 | .pay-form-container { 12 | //margin: 20px; 13 | .input { 14 | //display: block; 15 | height: 35px; 16 | margin: 10px 0px; 17 | font-size: 16px; 18 | width: 100%; 19 | color: white; 20 | background-color: transparent; 21 | border: none; 22 | border-bottom: 1px solid white; 23 | outline: transparent; 24 | } 25 | 26 | div{ 27 | height: 70px; 28 | display: flex; 29 | align-items: center; 30 | justify-content: space-between; 31 | 32 | .button { 33 | float: left; 34 | margin: 10px 0px; 35 | padding: 10px 15px; 36 | font-size: 16px; 37 | color: white; 38 | background-color: rgb(0, 195, 255); 39 | border: none; 40 | border-radius: 5px; 41 | 42 | &:hover{ 43 | background-color: rgb(0, 130, 170); 44 | cursor: pointer; 45 | } 46 | } 47 | 48 | span{ 49 | font-size: 20px; 50 | float: right; 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /frontend/src/pages/popular/popular.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './popular.styles.scss'; 3 | import MOVIE_DATA from '../../assets/movie.data'; 4 | import CollectionPreview from '../../components/collection-preview/collection-preview.component'; 5 | 6 | 7 | class Popular extends React.Component { 8 | constructor(){ 9 | super(); 10 | this.state = { 11 | collections: MOVIE_DATA 12 | } 13 | } 14 | 15 | render(){ 16 | const { collections } = this.state; 17 | return( 18 |
19 |

Popular

20 | 21 |
22 | ) 23 | } 24 | } 25 | 26 | export default Popular; -------------------------------------------------------------------------------- /frontend/src/pages/popular/popular.styles.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/popular/popular.styles.scss -------------------------------------------------------------------------------- /frontend/src/pages/sign-in-and-sign-up/sign-in-and-sign-up.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './sign-in-and-sign-up.styles.scss'; 3 | 4 | import SignIn from '../../components/sign-in/sign-in.component'; 5 | import SignUp from '../../components/sign-up/sign-up.component'; 6 | 7 | const SignInAndSignUp = (props) => { 8 | return ( 9 |
10 |

Log In or Create an Account

11 |
12 | 13 | 14 |
15 |
16 | ) 17 | } 18 | 19 | export default SignInAndSignUp; -------------------------------------------------------------------------------- /frontend/src/pages/sign-in-and-sign-up/sign-in-and-sign-up.styles.scss: -------------------------------------------------------------------------------- 1 | .sign-in-and-sign-up-container { 2 | margin: auto; 3 | //padding: 20px; 4 | display: flex; 5 | //background-color: blue; 6 | width: 75%; 7 | //align-items: center; 8 | justify-content: center; 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/pages/upcoming/upcoming.component.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './upcoming.styles.scss'; 3 | import MOVIE_DATA from '../../assets/movie.data'; 4 | import CollectionPreview from '../../components/collection-preview/collection-preview.component'; 5 | 6 | 7 | class Upcoming extends React.Component { 8 | constructor(){ 9 | super(); 10 | this.state = { 11 | collections: MOVIE_DATA 12 | } 13 | } 14 | 15 | render(){ 16 | const { collections } = this.state; 17 | return( 18 |
19 |

Upcoming

20 | 21 |
22 | ) 23 | } 24 | } 25 | 26 | export default Upcoming; -------------------------------------------------------------------------------- /frontend/src/pages/upcoming/upcoming.styles.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/frontend/src/pages/upcoming/upcoming.styles.scss -------------------------------------------------------------------------------- /frontend/src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl) 104 | .then(response => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then(registration => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log( 124 | 'No internet connection found. App is running in offline mode.' 125 | ); 126 | }); 127 | } 128 | 129 | export function unregister() { 130 | if ('serviceWorker' in navigator) { 131 | navigator.serviceWorker.ready.then(registration => { 132 | registration.unregister(); 133 | }); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "moviego-latest", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-regex": { 8 | "version": "3.0.0", 9 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 10 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 11 | }, 12 | "ansi-styles": { 13 | "version": "3.2.1", 14 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 15 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 16 | "requires": { 17 | "color-convert": "^1.9.0" 18 | } 19 | }, 20 | "camelcase": { 21 | "version": "5.3.1", 22 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 23 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 24 | }, 25 | "chalk": { 26 | "version": "2.4.2", 27 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 28 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 29 | "requires": { 30 | "ansi-styles": "^3.2.1", 31 | "escape-string-regexp": "^1.0.5", 32 | "supports-color": "^5.3.0" 33 | }, 34 | "dependencies": { 35 | "supports-color": { 36 | "version": "5.5.0", 37 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 38 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 39 | "requires": { 40 | "has-flag": "^3.0.0" 41 | } 42 | } 43 | } 44 | }, 45 | "cliui": { 46 | "version": "4.1.0", 47 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 48 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 49 | "requires": { 50 | "string-width": "^2.1.1", 51 | "strip-ansi": "^4.0.0", 52 | "wrap-ansi": "^2.0.0" 53 | } 54 | }, 55 | "code-point-at": { 56 | "version": "1.1.0", 57 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 58 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 59 | }, 60 | "color-convert": { 61 | "version": "1.9.3", 62 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 63 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 64 | "requires": { 65 | "color-name": "1.1.3" 66 | } 67 | }, 68 | "color-name": { 69 | "version": "1.1.3", 70 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 71 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 72 | }, 73 | "concurrently": { 74 | "version": "5.0.0", 75 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.0.0.tgz", 76 | "integrity": "sha512-1yDvK8mduTIdxIxV9C60KoiOySUl/lfekpdbI+U5GXaPrgdffEavFa9QZB3vh68oWOpbCC+TuvxXV9YRPMvUrA==", 77 | "requires": { 78 | "chalk": "^2.4.2", 79 | "date-fns": "^2.0.1", 80 | "lodash": "^4.17.15", 81 | "read-pkg": "^4.0.1", 82 | "rxjs": "^6.5.2", 83 | "spawn-command": "^0.0.2-1", 84 | "supports-color": "^4.5.0", 85 | "tree-kill": "^1.2.1", 86 | "yargs": "^12.0.5" 87 | } 88 | }, 89 | "cross-spawn": { 90 | "version": "6.0.5", 91 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 92 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 93 | "requires": { 94 | "nice-try": "^1.0.4", 95 | "path-key": "^2.0.1", 96 | "semver": "^5.5.0", 97 | "shebang-command": "^1.2.0", 98 | "which": "^1.2.9" 99 | } 100 | }, 101 | "date-fns": { 102 | "version": "2.6.0", 103 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.6.0.tgz", 104 | "integrity": "sha512-F55YxqRdEfP/eYQmQjLN798v0AwLjmZ8nMBjdQvNwEE3N/zWVrlkkqT+9seBlPlsbkybG4JmWg3Ee3dIV9BcGQ==" 105 | }, 106 | "decamelize": { 107 | "version": "1.2.0", 108 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 109 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 110 | }, 111 | "end-of-stream": { 112 | "version": "1.4.4", 113 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 114 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 115 | "requires": { 116 | "once": "^1.4.0" 117 | } 118 | }, 119 | "error-ex": { 120 | "version": "1.3.2", 121 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 122 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 123 | "requires": { 124 | "is-arrayish": "^0.2.1" 125 | } 126 | }, 127 | "escape-string-regexp": { 128 | "version": "1.0.5", 129 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 130 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 131 | }, 132 | "execa": { 133 | "version": "1.0.0", 134 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 135 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 136 | "requires": { 137 | "cross-spawn": "^6.0.0", 138 | "get-stream": "^4.0.0", 139 | "is-stream": "^1.1.0", 140 | "npm-run-path": "^2.0.0", 141 | "p-finally": "^1.0.0", 142 | "signal-exit": "^3.0.0", 143 | "strip-eof": "^1.0.0" 144 | } 145 | }, 146 | "find-up": { 147 | "version": "3.0.0", 148 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 149 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 150 | "requires": { 151 | "locate-path": "^3.0.0" 152 | } 153 | }, 154 | "get-caller-file": { 155 | "version": "1.0.3", 156 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 157 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" 158 | }, 159 | "get-stream": { 160 | "version": "4.1.0", 161 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 162 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 163 | "requires": { 164 | "pump": "^3.0.0" 165 | } 166 | }, 167 | "has-flag": { 168 | "version": "3.0.0", 169 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 170 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 171 | }, 172 | "hosted-git-info": { 173 | "version": "2.8.9", 174 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 175 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" 176 | }, 177 | "invert-kv": { 178 | "version": "2.0.0", 179 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 180 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" 181 | }, 182 | "is-arrayish": { 183 | "version": "0.2.1", 184 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 185 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 186 | }, 187 | "is-fullwidth-code-point": { 188 | "version": "2.0.0", 189 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 190 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 191 | }, 192 | "is-stream": { 193 | "version": "1.1.0", 194 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 195 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 196 | }, 197 | "isexe": { 198 | "version": "2.0.0", 199 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 200 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 201 | }, 202 | "json-parse-better-errors": { 203 | "version": "1.0.2", 204 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 205 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 206 | }, 207 | "lcid": { 208 | "version": "2.0.0", 209 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 210 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 211 | "requires": { 212 | "invert-kv": "^2.0.0" 213 | } 214 | }, 215 | "locate-path": { 216 | "version": "3.0.0", 217 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 218 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 219 | "requires": { 220 | "p-locate": "^3.0.0", 221 | "path-exists": "^3.0.0" 222 | } 223 | }, 224 | "lodash": { 225 | "version": "4.17.21", 226 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 227 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 228 | }, 229 | "map-age-cleaner": { 230 | "version": "0.1.3", 231 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 232 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 233 | "requires": { 234 | "p-defer": "^1.0.0" 235 | } 236 | }, 237 | "mem": { 238 | "version": "4.3.0", 239 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 240 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 241 | "requires": { 242 | "map-age-cleaner": "^0.1.1", 243 | "mimic-fn": "^2.0.0", 244 | "p-is-promise": "^2.0.0" 245 | } 246 | }, 247 | "mimic-fn": { 248 | "version": "2.1.0", 249 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 250 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 251 | }, 252 | "nice-try": { 253 | "version": "1.0.5", 254 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 255 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 256 | }, 257 | "normalize-package-data": { 258 | "version": "2.5.0", 259 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 260 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 261 | "requires": { 262 | "hosted-git-info": "^2.1.4", 263 | "resolve": "^1.10.0", 264 | "semver": "2 || 3 || 4 || 5", 265 | "validate-npm-package-license": "^3.0.1" 266 | } 267 | }, 268 | "npm-run-path": { 269 | "version": "2.0.2", 270 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 271 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 272 | "requires": { 273 | "path-key": "^2.0.0" 274 | } 275 | }, 276 | "number-is-nan": { 277 | "version": "1.0.1", 278 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 279 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 280 | }, 281 | "once": { 282 | "version": "1.4.0", 283 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 284 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 285 | "requires": { 286 | "wrappy": "1" 287 | } 288 | }, 289 | "os-locale": { 290 | "version": "3.1.0", 291 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 292 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 293 | "requires": { 294 | "execa": "^1.0.0", 295 | "lcid": "^2.0.0", 296 | "mem": "^4.0.0" 297 | } 298 | }, 299 | "p-defer": { 300 | "version": "1.0.0", 301 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 302 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" 303 | }, 304 | "p-finally": { 305 | "version": "1.0.0", 306 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 307 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 308 | }, 309 | "p-is-promise": { 310 | "version": "2.1.0", 311 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 312 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" 313 | }, 314 | "p-limit": { 315 | "version": "2.2.1", 316 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 317 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 318 | "requires": { 319 | "p-try": "^2.0.0" 320 | } 321 | }, 322 | "p-locate": { 323 | "version": "3.0.0", 324 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 325 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 326 | "requires": { 327 | "p-limit": "^2.0.0" 328 | } 329 | }, 330 | "p-try": { 331 | "version": "2.2.0", 332 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 333 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 334 | }, 335 | "parse-json": { 336 | "version": "4.0.0", 337 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 338 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 339 | "requires": { 340 | "error-ex": "^1.3.1", 341 | "json-parse-better-errors": "^1.0.1" 342 | } 343 | }, 344 | "path-exists": { 345 | "version": "3.0.0", 346 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 347 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 348 | }, 349 | "path-key": { 350 | "version": "2.0.1", 351 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 352 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 353 | }, 354 | "path-parse": { 355 | "version": "1.0.7", 356 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 357 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 358 | }, 359 | "pify": { 360 | "version": "3.0.0", 361 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 362 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 363 | }, 364 | "pump": { 365 | "version": "3.0.0", 366 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 367 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 368 | "requires": { 369 | "end-of-stream": "^1.1.0", 370 | "once": "^1.3.1" 371 | } 372 | }, 373 | "read-pkg": { 374 | "version": "4.0.1", 375 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", 376 | "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", 377 | "requires": { 378 | "normalize-package-data": "^2.3.2", 379 | "parse-json": "^4.0.0", 380 | "pify": "^3.0.0" 381 | } 382 | }, 383 | "require-directory": { 384 | "version": "2.1.1", 385 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 386 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 387 | }, 388 | "require-main-filename": { 389 | "version": "1.0.1", 390 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 391 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 392 | }, 393 | "resolve": { 394 | "version": "1.12.0", 395 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 396 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 397 | "requires": { 398 | "path-parse": "^1.0.6" 399 | } 400 | }, 401 | "rxjs": { 402 | "version": "6.5.3", 403 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 404 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 405 | "requires": { 406 | "tslib": "^1.9.0" 407 | } 408 | }, 409 | "semver": { 410 | "version": "5.7.1", 411 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 412 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 413 | }, 414 | "set-blocking": { 415 | "version": "2.0.0", 416 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 417 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 418 | }, 419 | "shebang-command": { 420 | "version": "1.2.0", 421 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 422 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 423 | "requires": { 424 | "shebang-regex": "^1.0.0" 425 | } 426 | }, 427 | "shebang-regex": { 428 | "version": "1.0.0", 429 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 430 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 431 | }, 432 | "signal-exit": { 433 | "version": "3.0.2", 434 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 435 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 436 | }, 437 | "spawn-command": { 438 | "version": "0.0.2-1", 439 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 440 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" 441 | }, 442 | "spdx-correct": { 443 | "version": "3.1.0", 444 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 445 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 446 | "requires": { 447 | "spdx-expression-parse": "^3.0.0", 448 | "spdx-license-ids": "^3.0.0" 449 | } 450 | }, 451 | "spdx-exceptions": { 452 | "version": "2.2.0", 453 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 454 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 455 | }, 456 | "spdx-expression-parse": { 457 | "version": "3.0.0", 458 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 459 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 460 | "requires": { 461 | "spdx-exceptions": "^2.1.0", 462 | "spdx-license-ids": "^3.0.0" 463 | } 464 | }, 465 | "spdx-license-ids": { 466 | "version": "3.0.5", 467 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 468 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" 469 | }, 470 | "string-width": { 471 | "version": "2.1.1", 472 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 473 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 474 | "requires": { 475 | "is-fullwidth-code-point": "^2.0.0", 476 | "strip-ansi": "^4.0.0" 477 | } 478 | }, 479 | "strip-ansi": { 480 | "version": "4.0.0", 481 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 482 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 483 | "requires": { 484 | "ansi-regex": "^3.0.0" 485 | } 486 | }, 487 | "strip-eof": { 488 | "version": "1.0.0", 489 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 490 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 491 | }, 492 | "supports-color": { 493 | "version": "4.5.0", 494 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 495 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 496 | "requires": { 497 | "has-flag": "^2.0.0" 498 | }, 499 | "dependencies": { 500 | "has-flag": { 501 | "version": "2.0.0", 502 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 503 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" 504 | } 505 | } 506 | }, 507 | "tree-kill": { 508 | "version": "1.2.2", 509 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 510 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" 511 | }, 512 | "tslib": { 513 | "version": "1.10.0", 514 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 515 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" 516 | }, 517 | "validate-npm-package-license": { 518 | "version": "3.0.4", 519 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 520 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 521 | "requires": { 522 | "spdx-correct": "^3.0.0", 523 | "spdx-expression-parse": "^3.0.0" 524 | } 525 | }, 526 | "which": { 527 | "version": "1.3.1", 528 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 529 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 530 | "requires": { 531 | "isexe": "^2.0.0" 532 | } 533 | }, 534 | "which-module": { 535 | "version": "2.0.0", 536 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 537 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 538 | }, 539 | "wrap-ansi": { 540 | "version": "2.1.0", 541 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 542 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 543 | "requires": { 544 | "string-width": "^1.0.1", 545 | "strip-ansi": "^3.0.1" 546 | }, 547 | "dependencies": { 548 | "ansi-regex": { 549 | "version": "2.1.1", 550 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 551 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 552 | }, 553 | "is-fullwidth-code-point": { 554 | "version": "1.0.0", 555 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 556 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 557 | "requires": { 558 | "number-is-nan": "^1.0.0" 559 | } 560 | }, 561 | "string-width": { 562 | "version": "1.0.2", 563 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 564 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 565 | "requires": { 566 | "code-point-at": "^1.0.0", 567 | "is-fullwidth-code-point": "^1.0.0", 568 | "strip-ansi": "^3.0.0" 569 | } 570 | }, 571 | "strip-ansi": { 572 | "version": "3.0.1", 573 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 574 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 575 | "requires": { 576 | "ansi-regex": "^2.0.0" 577 | } 578 | } 579 | } 580 | }, 581 | "wrappy": { 582 | "version": "1.0.2", 583 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 584 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 585 | }, 586 | "y18n": { 587 | "version": "4.0.1", 588 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", 589 | "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" 590 | }, 591 | "yargs": { 592 | "version": "12.0.5", 593 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", 594 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", 595 | "requires": { 596 | "cliui": "^4.0.0", 597 | "decamelize": "^1.2.0", 598 | "find-up": "^3.0.0", 599 | "get-caller-file": "^1.0.1", 600 | "os-locale": "^3.0.0", 601 | "require-directory": "^2.1.1", 602 | "require-main-filename": "^1.0.1", 603 | "set-blocking": "^2.0.0", 604 | "string-width": "^2.0.0", 605 | "which-module": "^2.0.0", 606 | "y18n": "^3.2.1 || ^4.0.0", 607 | "yargs-parser": "^11.1.1" 608 | } 609 | }, 610 | "yargs-parser": { 611 | "version": "11.1.1", 612 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", 613 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", 614 | "requires": { 615 | "camelcase": "^5.0.0", 616 | "decamelize": "^1.2.0" 617 | } 618 | } 619 | } 620 | } 621 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "moviego-latest", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "concurrently \"cd backend && nodemon server.js\" \"cd frontend && npm start\"" 8 | }, 9 | "author": "Ahmed Gulab Khan", 10 | "license": "ISC", 11 | "dependencies": { 12 | "concurrently": "^5.0.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /snapshots/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/snapshots/screenshot-1.png -------------------------------------------------------------------------------- /snapshots/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedgulabkhan/MovieGo/42abf395ee49ec367335cc36033bcee9a4932a3d/snapshots/screenshot-2.png --------------------------------------------------------------------------------