From 2dd6fd5b5141dd3bf86188351a7cd5b3a5fb0315 Mon Sep 17 00:00:00 2001 From: gwild37 Date: Fri, 26 Jul 2019 14:00:13 -0400 Subject: [PATCH 01/69] I made pwa-dev and pwa, new branches which will track my work in converting the site to a PWA. First I'm adding images --- public/images/favicon.ico | Bin 114610 -> 152126 bytes public/images/pin-128x128.png | Bin 0 -> 4154 bytes public/images/pin-144x144.png | Bin 0 -> 5289 bytes public/images/pin-152x152.png | Bin 0 -> 5610 bytes public/images/pin-192x192.png | Bin 0 -> 7029 bytes public/images/pin-256x256.png | Bin 0 -> 8320 bytes public/images/pin-512x512.png | Bin 0 -> 16857 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/pin-128x128.png create mode 100644 public/images/pin-144x144.png create mode 100644 public/images/pin-152x152.png create mode 100644 public/images/pin-192x192.png create mode 100644 public/images/pin-256x256.png create mode 100644 public/images/pin-512x512.png diff --git a/public/images/favicon.ico b/public/images/favicon.ico index 465e5e7fe73458f58a96b15cd89494bcd18121be..729cb60548e2e4b364799c4664828f35d9f367c4 100644 GIT binary patch literal 152126 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 diff --git a/public/images/pin-128x128.png b/public/images/pin-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc3df84214d5b5b8930d5d8b2ccbec402a35448 GIT binary patch literal 4154 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 Ef>gH3Bme*a literal 0 HcmV?d00001 diff --git a/public/images/pin-144x144.png b/public/images/pin-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..2b15281574b382616711503b70fd09cc042438e0 GIT binary patch literal 5289 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 literal 0 HcmV?d00001 From c482249a0b80bb748375422af481e71a7e72783f Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 13 Aug 2019 11:48:50 -0400 Subject: [PATCH 02/69] Adding all glitch changes: fixing some PWA errors in the manifest and the tags --- README.md | 86 +- manifest.json | 47 + package.json | 5 +- public/views/index.html | 10 + public/views/offline.html | 104 ++ public/views/pwabuilder-sw-register.js | 19 + pwabuilder-sw.js | 76 + shrinkwrap.yaml | 2211 ++++++++++++++++++++++++ 8 files changed, 2513 insertions(+), 45 deletions(-) create mode 100644 manifest.json create mode 100644 public/views/offline.html create mode 100644 public/views/pwabuilder-sw-register.js create mode 100644 pwabuilder-sw.js create mode 100644 shrinkwrap.yaml diff --git a/README.md b/README.md index ab21980..e4f9cba 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,43 @@ -# RPI Interactive Campus Map # - - -This is a webapp that will allow users to easily find spots on campus and in the surrounding area, and map a route to their destination. Users can also post relevant photos and comments on locations' info pages. - -This project was started as a term project for the ITWS-2110 (Web Systems Development) class at Rensselaer Polytechnic Institute, under the supervision of Professor Thilanka Munasinghe. It is now being developed and maintained through the Rensselaer Center for Open Source (RCOS). - -We are currently in the middle of a large refactor, but heavy construction will be over soon! - -### Current Contributors: -* Justin Gaskins - -### Founders: -* Justin Gaskins -* Christopher Pence -* Sebastien Boulas - -### Version History: -* 5/27/2019 - v0.3.0 All basic map functionality is now restored! You can show a location on the map from the info page, search for locations, or go to the information page from the location on the map. -* 3/26/2019 - v0.2.0 Began refactor and translation from XAMPP to MEAN Stack! -* 1/25/2019 - v0.1.0 Initial stages of functionality are complete! More locations and authorization will be added for the release of v1.0. - -### Getting Started -This project uses the MEAN stack (MongoDB, Express.JS, AngularJS 1.7, Node.js). You will need a working installation of [Node.js](https://nodejs.org/en/) (LTS version recommended), and a [MongoDB Atlas Cloud account](https://www.mongodb.com/cloud/atlas) (free is fine). - -Once you have that taken care of, there are a few more steps before you can begin work. -1. Install the nodemon package by running `npm install -g nodemon` in your node configured shell. -2. Clone the repository by either running `git clone https://github.com/gaskij/rpicampusmap.git` in a terminal shell with Git installed, or using your preferred Git UI. Change to the newly downloaded folder using `cd rpicampusmap` -3. Run `npm install` to download the required Node packages. -4. Open the ".envTEMPLATE" file in your preferred text editor. Change the and fields to match your Mongo Atlas account information. Don't worry, this file will only be saved on your local machine, so nobody will see it! Save the file as ".env" -5. Run `git status` to make sure you are up to date with the current branch. If so, you can begin! - -### Running the Server -To start the server, run `npm start` to have the server auto-restart if you make any changes, or `node server.js` if you would rather manually restart in case of changes. - -### Project Guidelines -* We use JavaScript ES6 syntax for defining variables (const, let) - * You can use Arrow functions or more conventional ES5 functions. -* Try to use [template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) instead of string concatenation when possible. -* Please do not attempt to commit directly to master! Commit instead to the branch for the feature currently being worked on. - * You can switch branches with the command `git checkout [branch]` - -Have fun making a big impact on campus! +# RPI Interactive Campus Map # + + +This is a webapp that will allow users to easily find spots on campus and in the surrounding area, and map a route to their destination. Users can also post relevant photos and comments on locations' info pages. + +This project was started as a term project for the ITWS-2110 (Web Systems Development) class at Rensselaer Polytechnic Institute, under the supervision of Professor Thilanka Munasinghe. It is now being developed and maintained through the Rensselaer Center for Open Source (RCOS). + +We are currently in the middle of a large refactor, but heavy construction will be over soon! + +### Current Contributors: +* Justin Gaskins + +### Founders: +* Justin Gaskins +* Christopher Pence +* Sebastien Boulas + +### Version History: +* 5/27/2019 - v0.3.0 All basic map functionality is now restored! You can show a location on the map from the info page, search for locations, or go to the information page from the location on the map. +* 3/26/2019 - v0.2.0 Began refactor and translation from XAMPP to MEAN Stack! +* 1/25/2019 - v0.1.0 Initial stages of functionality are complete! More locations and authorization will be added for the release of v1.0. + +### Getting Started +This project uses the MEAN stack (MongoDB, Express.JS, AngularJS 1.7, Node.js). You will need a working installation of [Node.js](https://nodejs.org/en/) (LTS version recommended), and a [MongoDB Atlas Cloud account](https://www.mongodb.com/cloud/atlas) (free is fine). + +Once you have that taken care of, there are a few more steps before you can begin work. +1. Install the nodemon package by running `npm install -g nodemon` in your node configured shell. +2. Clone the repository by either running `git clone https://github.com/gaskij/rpicampusmap.git` in a terminal shell with Git installed, or using your preferred Git UI. Change to the newly downloaded folder using `cd rpicampusmap` +3. Run `npm install` to download the required Node packages. +4. Open the ".envTEMPLATE" file in your preferred text editor. Change the and fields to match your Mongo Atlas account information. Don't worry, this file will only be saved on your local machine, so nobody will see it! Save the file as ".env" +5. Run `git status` to make sure you are up to date with the current branch. If so, you can begin! + +### Running the Server +To start the server, run `npm start` to have the server auto-restart if you make any changes, or `node server.js` if you would rather manually restart in case of changes. + +### Project Guidelines +* We use JavaScript ES6 syntax for defining variables (const, let) + * You can use Arrow functions or more conventional ES5 functions. +* Try to use [template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) instead of string concatenation when possible. +* Please do not attempt to commit directly to master! Commit instead to the branch for the feature currently being worked on. + * You can switch branches with the command `git checkout [branch]` + +Have fun making a big impact on campus! diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..d22c228 --- /dev/null +++ b/manifest.json @@ -0,0 +1,47 @@ +{ + "dir" : "ltr", + "lang" : "English", + "name" : "RPI Campus Map", + "scope" : "/", + "display" : "fullscreen", + "start_url" : "https://rpicampusmap.glitch.me/", + "short_name" : "RPI Map", + "background_color": "#dc3545", + "theme_color": "#000000", + "description" : "RPI Interactive Campus Map", + "orientation" : "portrait", + "related_applications" : [""], + "prefer_related_applications" : false, + "generated" : "true", + "icons" : [ + { + "src": "/public/images/pin-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "/public/images/pin-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "/public/images/pin-152x152.png", + "sizes": "152x152", + "type": "image/png" + }, + { + "src": "/public/images/pin-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/public/images/pin-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "/public/images/pin-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ]} \ No newline at end of file diff --git a/package.json b/package.json index fe2c1fa..44213e7 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "dotenv": "^7.0.0", "express": "^4.16.4", "mongodb": "^3.2.3", - "request": "^2.88.0" + "request": "^2.88.0", + "nodemon": "^1.19.1" } -} +} \ No newline at end of file diff --git a/public/views/index.html b/public/views/index.html index 0cf9c14..9961de4 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -22,6 +22,16 @@ + + + + + + + + + + diff --git a/public/views/offline.html b/public/views/offline.html new file mode 100644 index 0000000..9063a26 --- /dev/null +++ b/public/views/offline.html @@ -0,0 +1,104 @@ + + + + + + + + + + + Page Not Found + + + + + + + + + + + + + + + + + + + + +
+
+

Sorry this page doesn't work offline 😢

+ +

Some pages on this app may not work correcly offline:

+
    +
  • Please try returning to a previous page,
  • +
  • or reconnect to the internet and reload the page.
  • +
+
+
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/public/views/pwabuilder-sw-register.js b/public/views/pwabuilder-sw-register.js new file mode 100644 index 0000000..fe1b735 --- /dev/null +++ b/public/views/pwabuilder-sw-register.js @@ -0,0 +1,19 @@ +// This is the service worker with the Advanced caching + +// Add this below content to your HTML page, or add the js file to your page at the very top to register service worker + +// Check compatibility for the browser we're running this in +if ("serviceWorker" in navigator) { + if (navigator.serviceWorker.controller) { + console.log("[PWA Builder] active service worker found, no need to register"); + } else { + // Register the service worker + navigator.serviceWorker + .register("pwabuilder-sw.js", { + scope: "./" + }) + .then(function (reg) { + console.log("[PWA Builder] Service worker has been registered for scope: " + reg.scope); + }); + } +} diff --git a/pwabuilder-sw.js b/pwabuilder-sw.js new file mode 100644 index 0000000..74f07e1 --- /dev/null +++ b/pwabuilder-sw.js @@ -0,0 +1,76 @@ +// This is the service worker with the combined offline experience (Offline page + Offline copy of pages) + +const CACHE = "pwabuilder-offline-page"; + +const precacheFiles = [ + "/public/images/logo.png", + "/public/images/favicon.ico", + "/public/views/offline.html" +]; + +// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html"; +const offlineFallbackPage = "/public/views/offline.html"; + +// Install stage sets up the offline page in the cache and opens a new cache +self.addEventListener("install", function (event) { + console.log("[PWA Builder] Install Event processing"); + + event.waitUntil( + caches.open(CACHE).then(function (cache) { + console.log("[PWA Builder] Cached offline page during install"); + + if (offlineFallbackPage === "ToDo-replace-this-name.html") { + return cache.add(new Response("TODO: Update the value of the offlineFallbackPage constant in the serviceworker.")); + } + return cache.addAll(precacheFiles); + // return cache.add(offlineFallbackPage); + }) + ); +}); + +// If any fetch fails, it will look for the request in the cache and serve it from there first +self.addEventListener("fetch", function (event) { + if (event.request.method !== "GET") return; + + event.respondWith( + fetch(event.request) + .then(function (response) { + console.log("[PWA Builder] add page to offline cache: " + response.url); + + // If request was success, add or update it in the cache + event.waitUntil(updateCache(event.request, response.clone())); + + return response; + }) + .catch(function (error) { + console.log("[PWA Builder] Network request Failed. Serving content from cache: " + error); + return fromCache(event.request); + }) + ); +}); + +function fromCache(request) { + // Check to see if you have it in the cache + // Return response + // If not in the cache, then return the offline page + return caches.open(CACHE).then(function (cache) { + return cache.match(request).then(function (matching) { + if (!matching || matching.status === 404) { + // The following validates that the request was for a navigation to a new document + if (request.destination !== "document" || request.mode !== "navigate") { + return Promise.reject("no-match"); + } + + return cache.match(offlineFallbackPage); + } + + return matching; + }); + }); +} + +function updateCache(request, response) { + return caches.open(CACHE).then(function (cache) { + return cache.put(request, response); + }); +} diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml new file mode 100644 index 0000000..2629a68 --- /dev/null +++ b/shrinkwrap.yaml @@ -0,0 +1,2211 @@ +dependencies: + dotenv: 7.0.0 + express: 4.17.1 + mongodb: 3.2.7 + nodemon: 1.19.1 + request: 2.88.0 +packages: + /abbrev/1.1.1: + dev: false + resolution: + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + /accepts/1.3.7: + dependencies: + mime-types: 2.1.24 + negotiator: 0.6.2 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + /ajv/6.10.2: + dependencies: + fast-deep-equal: 2.0.1 + fast-json-stable-stringify: 2.0.0 + json-schema-traverse: 0.4.1 + uri-js: 4.2.2 + dev: false + resolution: + integrity: sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + /ansi-align/2.0.0: + dependencies: + string-width: 2.1.1 + dev: false + resolution: + integrity: sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + /ansi-regex/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.3 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /anymatch/2.0.0: + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + dev: false + resolution: + integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + /arr-diff/4.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + /arr-flatten/1.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + /arr-union/3.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + /array-flatten/1.1.1: + dev: false + resolution: + integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + /array-unique/0.3.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + /asn1/0.2.4: + dependencies: + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + /assert-plus/1.0.0: + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + /assign-symbols/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + /async-each/1.0.3: + dev: false + resolution: + integrity: sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + /asynckit/0.4.0: + dev: false + resolution: + integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= + /atob/2.1.2: + dev: false + engines: + node: '>= 4.5.0' + hasBin: true + resolution: + integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + /aws-sign2/0.7.0: + dev: false + resolution: + integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + /aws4/1.8.0: + dev: false + resolution: + integrity: sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + /balanced-match/1.0.0: + dev: false + resolution: + integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + /base/0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + /bcrypt-pbkdf/1.0.2: + dependencies: + tweetnacl: 0.14.5 + dev: false + resolution: + integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + /binary-extensions/1.13.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + /body-parser/1.19.0: + dependencies: + bytes: 3.1.0 + content-type: 1.0.4 + debug: 2.6.9 + depd: 1.1.2 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + on-finished: 2.3.0 + qs: 6.7.0 + raw-body: 2.4.0 + type-is: 1.6.18 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + /boxen/1.3.0: + dependencies: + ansi-align: 2.0.0 + camelcase: 4.1.0 + chalk: 2.4.2 + cli-boxes: 1.0.0 + string-width: 2.1.1 + term-size: 1.2.0 + widest-line: 2.0.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + /brace-expansion/1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + dev: false + resolution: + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /braces/2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.3 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + /bson/1.1.1: + dev: false + engines: + node: '>=0.6.19' + resolution: + integrity: sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg== + /bytes/3.1.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + /cache-base/1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + /camelcase/4.1.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + /capture-stack-trace/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + /caseless/0.12.0: + dev: false + resolution: + integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + /chalk/2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + /chokidar/2.1.6: + dependencies: + anymatch: 2.0.0 + async-each: 1.0.3 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.1 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.1.2 + dev: false + optionalDependencies: + fsevents: 1.2.9 + resolution: + integrity: sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + /ci-info/1.6.0: + dev: false + resolution: + integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + /class-utils/0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + /cli-boxes/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-T6kXw+WclKAEzWH47lCdplFocUM= + /collection-visit/1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + /color-convert/1.9.3: + dependencies: + color-name: 1.1.3 + dev: false + resolution: + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + /color-name/1.1.3: + dev: false + resolution: + integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /combined-stream/1.0.8: + dependencies: + delayed-stream: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + /component-emitter/1.3.0: + dev: false + resolution: + integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + /concat-map/0.0.1: + dev: false + resolution: + integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + /configstore/3.1.2: + dependencies: + dot-prop: 4.2.0 + graceful-fs: 4.2.0 + make-dir: 1.3.0 + unique-string: 1.0.0 + write-file-atomic: 2.4.3 + xdg-basedir: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + /content-disposition/0.5.3: + dependencies: + safe-buffer: 5.1.2 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + /content-type/1.0.4: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + /cookie-signature/1.0.6: + dev: false + resolution: + integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + /cookie/0.4.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + /copy-descriptor/0.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + /core-util-is/1.0.2: + dev: false + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /create-error-class/3.0.2: + dependencies: + capture-stack-trace: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + /cross-spawn/5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: false + resolution: + integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + /crypto-random-string/1.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + /debug/2.6.9: + dependencies: + ms: 2.0.0 + dev: false + resolution: + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + /debug/3.2.6: + dependencies: + ms: 2.1.2 + dev: false + resolution: + integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + /decode-uri-component/0.2.0: + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + /deep-extend/0.6.0: + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + /define-property/0.2.5: + dependencies: + is-descriptor: 0.1.6 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + /define-property/1.0.0: + dependencies: + is-descriptor: 1.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + /define-property/2.0.2: + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + /delayed-stream/1.0.0: + dev: false + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /depd/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + /destroy/1.0.4: + dev: false + resolution: + integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + /dot-prop/4.2.0: + dependencies: + is-obj: 1.0.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + /dotenv/7.0.0: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g== + /duplexer3/0.1.4: + dev: false + resolution: + integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + /ecc-jsbn/0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + resolution: + integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + /ee-first/1.1.1: + dev: false + resolution: + integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + /encodeurl/1.0.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + /escape-html/1.0.3: + dev: false + resolution: + integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + /escape-string-regexp/1.0.5: + dev: false + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /etag/1.8.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + /execa/0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.2 + strip-eof: 1.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + /expand-brackets/2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + /express/4.17.1: + dependencies: + accepts: 1.3.7 + array-flatten: 1.1.1 + body-parser: 1.19.0 + content-disposition: 0.5.3 + content-type: 1.0.4 + cookie: 0.4.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 1.1.2 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.3.0 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.5 + qs: 6.7.0 + range-parser: 1.2.1 + safe-buffer: 5.1.2 + send: 0.17.1 + serve-static: 1.14.1 + setprototypeof: 1.1.1 + statuses: 1.5.0 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: false + engines: + node: '>= 0.10.0' + resolution: + integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + /extend-shallow/2.0.1: + dependencies: + is-extendable: 0.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + /extend-shallow/3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + /extend/3.0.2: + dev: false + resolution: + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + /extglob/2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + /extsprintf/1.3.0: + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + /extsprintf/1.4.0: + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + /fast-deep-equal/2.0.1: + dev: false + resolution: + integrity: sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + /fast-json-stable-stringify/2.0.0: + dev: false + resolution: + integrity: sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + /fill-range/4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + /finalhandler/1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + /for-in/1.0.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + /forever-agent/0.6.1: + dev: false + resolution: + integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + /form-data/2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.24 + dev: false + engines: + node: '>= 0.12' + resolution: + integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /forwarded/0.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + /fragment-cache/0.2.1: + dependencies: + map-cache: 0.2.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + /fresh/0.5.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + /fsevents/1.2.9: + bundledDependencies: + - node-pre-gyp + dependencies: + nan: 2.14.0 + dev: false + engines: + node: '>=4.0' + optional: true + requiresBuild: true + resolution: + integrity: sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + /get-stream/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + /get-value/2.0.6: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + dev: false + resolution: + integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + /glob-parent/3.1.0: + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: false + resolution: + integrity: sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + /global-dirs/0.1.1: + dependencies: + ini: 1.3.5 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + /got/6.7.1: + dependencies: + create-error-class: 3.0.2 + duplexer3: 0.1.4 + get-stream: 3.0.0 + is-redirect: 1.0.0 + is-retry-allowed: 1.1.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.1 + safe-buffer: 5.2.0 + timed-out: 4.0.1 + unzip-response: 2.0.1 + url-parse-lax: 1.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + /graceful-fs/4.2.0: + dev: false + resolution: + integrity: sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== + /har-schema/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + /har-validator/5.1.3: + dependencies: + ajv: 6.10.2 + har-schema: 2.0.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + /has-flag/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + /has-value/0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + /has-value/1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + /has-values/0.1.4: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E= + /has-values/1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + /http-errors/1.7.2: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + /http-errors/1.7.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + /http-signature/1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.1 + sshpk: 1.16.1 + dev: false + engines: + node: '>=0.8' + npm: '>=1.3.7' + resolution: + integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + /iconv-lite/0.4.24: + dependencies: + safer-buffer: 2.1.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /ignore-by-default/1.0.1: + dev: false + resolution: + integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + /import-lazy/2.1.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + /imurmurhash/0.1.4: + dev: false + engines: + node: '>=0.8.19' + resolution: + integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= + /inherits/2.0.3: + dev: false + resolution: + integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + /inherits/2.0.4: + dev: false + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /ini/1.3.5: + dev: false + resolution: + integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + /ipaddr.js/1.9.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + /is-accessor-descriptor/0.1.6: + dependencies: + kind-of: 3.2.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + /is-accessor-descriptor/1.0.0: + dependencies: + kind-of: 6.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + /is-binary-path/1.0.1: + dependencies: + binary-extensions: 1.13.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + /is-buffer/1.1.6: + dev: false + resolution: + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + /is-ci/1.2.1: + dependencies: + ci-info: 1.6.0 + dev: false + hasBin: true + resolution: + integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + /is-data-descriptor/0.1.4: + dependencies: + kind-of: 3.2.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + /is-data-descriptor/1.0.0: + dependencies: + kind-of: 6.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + /is-descriptor/0.1.6: + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + /is-descriptor/1.0.2: + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + /is-extendable/0.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + /is-extendable/1.0.1: + dependencies: + is-plain-object: 2.0.4 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + /is-extglob/2.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + /is-fullwidth-code-point/2.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + /is-glob/3.1.0: + dependencies: + is-extglob: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + /is-glob/4.0.1: + dependencies: + is-extglob: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + /is-installed-globally/0.1.0: + dependencies: + global-dirs: 0.1.1 + is-path-inside: 1.0.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + /is-npm/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + /is-number/3.0.0: + dependencies: + kind-of: 3.2.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + /is-obj/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + /is-path-inside/1.0.1: + dependencies: + path-is-inside: 1.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-jvW33lBDej/cprToZe96pVy0gDY= + /is-plain-object/2.0.4: + dependencies: + isobject: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + /is-redirect/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + /is-retry-allowed/1.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + /is-stream/1.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + /is-typedarray/1.0.0: + dev: false + resolution: + integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /is-windows/1.0.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + /isarray/1.0.0: + dev: false + resolution: + integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /isexe/2.0.0: + dev: false + resolution: + integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + /isobject/2.1.0: + dependencies: + isarray: 1.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + /isobject/3.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + /isstream/0.1.2: + dev: false + resolution: + integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + /jsbn/0.1.1: + dev: false + resolution: + integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + /json-schema-traverse/0.4.1: + dev: false + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema/0.2.3: + dev: false + resolution: + integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stringify-safe/5.0.1: + dev: false + resolution: + integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + /jsprim/1.4.1: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + /kind-of/3.2.2: + dependencies: + is-buffer: 1.1.6 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + /kind-of/4.0.0: + dependencies: + is-buffer: 1.1.6 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + /kind-of/5.1.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + /kind-of/6.0.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + /latest-version/3.1.0: + dependencies: + package-json: 4.0.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + /lowercase-keys/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + /lru-cache/4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: false + resolution: + integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + /make-dir/1.3.0: + dependencies: + pify: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + /map-cache/0.2.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + /map-visit/1.0.0: + dependencies: + object-visit: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + /media-typer/0.3.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + /memory-pager/1.5.0: + dev: false + optional: true + resolution: + integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + /merge-descriptors/1.0.1: + dev: false + resolution: + integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + /methods/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + /micromatch/3.1.10: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.2 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + /mime-db/1.40.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + /mime-types/2.1.24: + dependencies: + mime-db: 1.40.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + /mime/1.6.0: + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + /minimatch/3.0.4: + dependencies: + brace-expansion: 1.1.11 + dev: false + resolution: + integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + /minimist/1.2.0: + dev: false + resolution: + integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + /mixin-deep/1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + /mongodb-core/3.2.7: + dependencies: + bson: 1.1.1 + require_optional: 1.0.1 + safe-buffer: 5.2.0 + dev: false + optionalDependencies: + saslprep: 1.0.3 + resolution: + integrity: sha512-WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix76oGd7EyYkHJKssQ2FAOw5Su/n4XQ== + /mongodb/3.2.7: + dependencies: + mongodb-core: 3.2.7 + safe-buffer: 5.2.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm2Z2sAU6mhCri+wd9r1hOcHdoMw== + /ms/2.0.0: + dev: false + resolution: + integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + /ms/2.1.1: + dev: false + resolution: + integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + /ms/2.1.2: + dev: false + resolution: + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + /nan/2.14.0: + dev: false + optional: true + resolution: + integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + /nanomatch/1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.2 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + /negotiator/0.6.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + /nodemon/1.19.1: + dependencies: + chokidar: 2.1.6 + debug: 3.2.6 + ignore-by-default: 1.0.1 + minimatch: 3.0.4 + pstree.remy: 1.1.7 + semver: 5.7.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.2 + update-notifier: 2.5.0 + dev: false + engines: + node: '>=4' + hasBin: true + requiresBuild: true + resolution: + integrity: sha512-/DXLzd/GhiaDXXbGId5BzxP1GlsqtMGM9zTmkWrgXtSqjKmGSbLicM/oAy4FR0YWm14jCHRwnR31AHS2dYFHrg== + /nopt/1.0.10: + dependencies: + abbrev: 1.1.1 + dev: false + hasBin: true + resolution: + integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + /normalize-path/2.1.1: + dependencies: + remove-trailing-separator: 1.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + /normalize-path/3.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + /npm-run-path/2.0.2: + dependencies: + path-key: 2.0.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + /oauth-sign/0.9.0: + dev: false + resolution: + integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + /object-copy/0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + /object-visit/1.0.1: + dependencies: + isobject: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + /object.pick/1.3.0: + dependencies: + isobject: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + /on-finished/2.3.0: + dependencies: + ee-first: 1.1.1 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + /p-finally/1.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + /package-json/4.0.1: + dependencies: + got: 6.7.1 + registry-auth-token: 3.4.0 + registry-url: 3.1.0 + semver: 5.7.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + /parseurl/1.3.3: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + /pascalcase/0.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + /path-dirname/1.0.2: + dev: false + resolution: + integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + /path-is-absolute/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + /path-is-inside/1.0.2: + dev: false + resolution: + integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + /path-key/2.0.1: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + /path-to-regexp/0.1.7: + dev: false + resolution: + integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + /performance-now/2.1.0: + dev: false + resolution: + integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + /pify/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + /posix-character-classes/0.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + /prepend-http/1.0.4: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + /process-nextick-args/2.0.1: + dev: false + resolution: + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + /proxy-addr/2.0.5: + dependencies: + forwarded: 0.1.2 + ipaddr.js: 1.9.0 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + /pseudomap/1.0.2: + dev: false + resolution: + integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + /psl/1.2.0: + dev: false + resolution: + integrity: sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA== + /pstree.remy/1.1.7: + dev: false + resolution: + integrity: sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + /punycode/1.4.1: + dev: false + resolution: + integrity: sha1-wNWmOycYgArY4esPpSachN1BhF4= + /punycode/2.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /qs/6.5.2: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /qs/6.7.0: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + /range-parser/1.2.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + /raw-body/2.4.0: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + /rc/1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.5 + minimist: 1.2.0 + strip-json-comments: 2.0.1 + dev: false + hasBin: true + resolution: + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + /readable-stream/2.3.6: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + resolution: + integrity: sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + /readdirp/2.2.1: + dependencies: + graceful-fs: 4.2.0 + micromatch: 3.1.10 + readable-stream: 2.3.6 + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + /regex-not/1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + /registry-auth-token/3.4.0: + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.0 + dev: false + resolution: + integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + /registry-url/3.1.0: + dependencies: + rc: 1.2.8 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-PU74cPc93h138M+aOBQyRE4XSUI= + /remove-trailing-separator/1.1.0: + dev: false + resolution: + integrity: sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + /repeat-element/1.1.3: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + /repeat-string/1.6.1: + dev: false + engines: + node: '>=0.10' + resolution: + integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc= + /request/2.88.0: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.8.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.3 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.24 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.2.0 + tough-cookie: 2.4.3 + tunnel-agent: 0.6.0 + uuid: 3.3.2 + dev: false + engines: + node: '>= 4' + resolution: + integrity: sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + /require_optional/1.0.1: + dependencies: + resolve-from: 2.0.0 + semver: 5.7.0 + dev: false + resolution: + integrity: sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g== + /resolve-from/2.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + /resolve-url/0.2.1: + dev: false + resolution: + integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + /ret/0.1.15: + dev: false + engines: + node: '>=0.12' + resolution: + integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + /safe-buffer/5.1.2: + dev: false + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.0: + dev: false + resolution: + integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + /safe-regex/1.1.0: + dependencies: + ret: 0.1.15 + dev: false + resolution: + integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + /safer-buffer/2.1.2: + dev: false + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /saslprep/1.0.3: + dependencies: + sparse-bitfield: 3.0.3 + dev: false + engines: + node: '>=6' + optional: true + resolution: + integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== + /semver-diff/2.1.0: + dependencies: + semver: 5.7.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + /semver/5.7.0: + dev: false + hasBin: true + resolution: + integrity: sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + /send/0.17.1: + dependencies: + debug: 2.6.9 + depd: 1.1.2 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 1.7.3 + mime: 1.6.0 + ms: 2.1.1 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + /serve-static/1.14.1: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.17.1 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + /set-value/2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + /setprototypeof/1.1.1: + dev: false + resolution: + integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + /shebang-command/1.2.0: + dependencies: + shebang-regex: 1.0.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + /shebang-regex/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + /signal-exit/3.0.2: + dev: false + resolution: + integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + /snapdragon-node/2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + /snapdragon-util/3.0.1: + dependencies: + kind-of: 3.2.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + /snapdragon/0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.2 + use: 3.1.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + /source-map-resolve/0.5.2: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.0 + resolve-url: 0.2.1 + source-map-url: 0.4.0 + urix: 0.1.0 + dev: false + resolution: + integrity: sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + /source-map-url/0.4.0: + dev: false + resolution: + integrity: sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + /source-map/0.5.7: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + /sparse-bitfield/3.0.3: + dependencies: + memory-pager: 1.5.0 + dev: false + optional: true + resolution: + integrity: sha1-/0rm5oZWBWuks+eSqzM004JzyhE= + /split-string/3.1.0: + dependencies: + extend-shallow: 3.0.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + /sshpk/1.16.1: + dependencies: + asn1: 0.2.4 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + engines: + node: '>=0.10.0' + hasBin: true + resolution: + integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + /static-extend/0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + /statuses/1.5.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + /string-width/2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + dev: false + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /strip-ansi/4.0.0: + dependencies: + ansi-regex: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8= + /strip-eof/1.0.0: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + /strip-json-comments/2.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= + /supports-color/5.5.0: + dependencies: + has-flag: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /term-size/1.2.0: + dependencies: + execa: 0.7.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + /timed-out/4.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + /to-object-path/0.3.0: + dependencies: + kind-of: 3.2.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + /to-regex-range/2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + /to-regex/3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + /toidentifier/1.0.0: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + /touch/3.1.0: + dependencies: + nopt: 1.0.10 + dev: false + hasBin: true + resolution: + integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + /tough-cookie/2.4.3: + dependencies: + psl: 1.2.0 + punycode: 1.4.1 + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.2.0 + dev: false + resolution: + integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + /tweetnacl/0.14.5: + dev: false + resolution: + integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + /type-is/1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.24 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + /undefsafe/2.0.2: + dependencies: + debug: 2.6.9 + dev: false + resolution: + integrity: sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + /union-value/1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + /unique-string/1.0.0: + dependencies: + crypto-random-string: 1.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + /unpipe/1.0.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + /unset-value/1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + /unzip-response/2.0.1: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + /upath/1.1.2: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + /update-notifier/2.5.0: + dependencies: + boxen: 1.3.0 + chalk: 2.4.2 + configstore: 3.1.2 + import-lazy: 2.1.0 + is-ci: 1.2.1 + is-installed-globally: 0.1.0 + is-npm: 1.0.0 + latest-version: 3.1.0 + semver-diff: 2.1.0 + xdg-basedir: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + /uri-js/4.2.2: + dependencies: + punycode: 2.1.1 + dev: false + resolution: + integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + /urix/0.1.0: + dev: false + resolution: + integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + /url-parse-lax/1.0.0: + dependencies: + prepend-http: 1.0.4 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + /use/3.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + /util-deprecate/1.0.2: + dev: false + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /utils-merge/1.0.1: + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + /uuid/3.3.2: + dev: false + hasBin: true + resolution: + integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + /vary/1.1.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + /verror/1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.0 + dev: false + engines: + '0': node >=0.6.0 + resolution: + integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + /which/1.3.1: + dependencies: + isexe: 2.0.0 + dev: false + hasBin: true + resolution: + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + /widest-line/2.0.1: + dependencies: + string-width: 2.1.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + /write-file-atomic/2.4.3: + dependencies: + graceful-fs: 4.2.0 + imurmurhash: 0.1.4 + signal-exit: 3.0.2 + dev: false + resolution: + integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + /xdg-basedir/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + /yallist/2.1.2: + dev: false + resolution: + integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +registry: 'https://registry.npmjs.org/' +shrinkwrapMinorVersion: 9 +shrinkwrapVersion: 3 +specifiers: + dotenv: ^7.0.0 + express: ^4.16.4 + mongodb: ^3.2.3 + nodemon: ^1.19.1 + request: ^2.88.0 From 1e4bf1f2b0baf711750d6ca331a93e36e2220ef6 Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 13 Aug 2019 12:17:15 -0400 Subject: [PATCH 03/69] Fixed issues/ renamed files --- public/views/index.html | 2 +- public/views/sw-register.js | 19 ++++++++++ sw.js | 76 +++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 public/views/sw-register.js create mode 100644 sw.js diff --git a/public/views/index.html b/public/views/index.html index 9961de4..efc3f43 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -25,7 +25,7 @@ - + diff --git a/public/views/sw-register.js b/public/views/sw-register.js new file mode 100644 index 0000000..d173d25 --- /dev/null +++ b/public/views/sw-register.js @@ -0,0 +1,19 @@ +// This is the service worker with the Advanced caching + +// Add this below content to your HTML page, or add the js file to your page at the very top to register service worker + +// Check compatibility for the browser we're running this in +if ("serviceWorker" in navigator) { + if (navigator.serviceWorker.controller) { + console.log("[PWA Builder] active service worker found, no need to register"); + } else { + // Register the service worker + navigator.serviceWorker + .register("sw.js", { + scope: "./" + }) + .then(function (reg) { + console.log("[PWA Builder] Service worker has been registered for scope: " + reg.scope); + }); + } +} diff --git a/sw.js b/sw.js new file mode 100644 index 0000000..b2039c0 --- /dev/null +++ b/sw.js @@ -0,0 +1,76 @@ +// This is the service worker with the combined offline experience (Offline page + Offline copy of pages) + +const CACHE = "offline-page"; + +const precacheFiles = [ + "/public/images/logo.png", + "/public/images/favicon.ico", + "/public/views/offline.html" +]; + +// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html"; +const offlineFallbackPage = "/public/views/offline.html"; + +// Install stage sets up the offline page in the cache and opens a new cache +self.addEventListener("install", function (event) { + console.log("[PWA] Install Event processing"); + + event.waitUntil( + caches.open(CACHE).then(function (cache) { + console.log("[PWA] Cached offline page during install"); + + if (offlineFallbackPage === "ToDo-replace-this-name.html") { + return cache.add(new Response("TODO: Update the value of the offlineFallbackPage constant in the serviceworker.")); + } + return cache.addAll(precacheFiles); + // return cache.add(offlineFallbackPage); + }) + ); +}); + +// If any fetch fails, it will look for the request in the cache and serve it from there first +self.addEventListener("fetch", function (event) { + if (event.request.method !== "GET") return; + + event.respondWith( + fetch(event.request) + .then(function (response) { + console.log("[PWA] add page to offline cache: " + response.url); + + // If request was success, add or update it in the cache + event.waitUntil(updateCache(event.request, response.clone())); + + return response; + }) + .catch(function (error) { + console.log("[PWA] Network request Failed. Serving content from cache: " + error); + return fromCache(event.request); + }) + ); +}); + +function fromCache(request) { + // Check to see if you have it in the cache + // Return response + // If not in the cache, then return the offline page + return caches.open(CACHE).then(function (cache) { + return cache.match(request).then(function (matching) { + if (!matching || matching.status === 404) { + // The following validates that the request was for a navigation to a new document + if (request.destination !== "document" || request.mode !== "navigate") { + return Promise.reject("no-match"); + } + + return cache.match(offlineFallbackPage); + } + + return matching; + }); + }); +} + +function updateCache(request, response) { + return caches.open(CACHE).then(function (cache) { + return cache.put(request, response); + }); +} From 2530d70087d07ef379ae8d3abf34125577d7341d Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Fri, 16 Aug 2019 14:12:04 -0400 Subject: [PATCH 04/69] adding commented out attempt at fixing service worker --- sw.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sw.js b/sw.js index b2039c0..8cab2ad 100644 --- a/sw.js +++ b/sw.js @@ -74,3 +74,15 @@ function updateCache(request, response) { return cache.put(request, response); }); } + +/* +function updateCache(request, response) { + return caches.open(CACHE).then(function (cache) { + return cache.match(request).then(function (matching) { + if (!matching || matching.status === 404) { + return cache.put(request, response); + } + }); + }); +} +*/ From 2e4ac7cd45058ee7741ec19652825af11d2fdb77 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Fri, 16 Aug 2019 14:17:10 -0400 Subject: [PATCH 05/69] removing glitch changes manually --- public/views/index.html | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/public/views/index.html b/public/views/index.html index f3a2f12..d1ee03a 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -10,15 +10,6 @@ RPI Campus Map - - - - - - - - - @@ -32,9 +23,6 @@ - - - From 64d8c5b1fe4067cd93b5aaade17398514834b3e3 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Fri, 16 Aug 2019 14:18:00 -0400 Subject: [PATCH 06/69] removing glitch changes manually --- public/views/info.html | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/public/views/info.html b/public/views/info.html index 62a83b7..433398a 100644 --- a/public/views/info.html +++ b/public/views/info.html @@ -10,9 +10,6 @@ Info - {{name}} - - - @@ -30,18 +27,6 @@ - - - From a7493f41c4b9041677054f164024f7f78581b9c3 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Fri, 16 Aug 2019 14:19:21 -0400 Subject: [PATCH 07/69] removing glitch changes manually --- public/views/machine_sites_info.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/public/views/machine_sites_info.html b/public/views/machine_sites_info.html index 128b589..c1eda23 100644 --- a/public/views/machine_sites_info.html +++ b/public/views/machine_sites_info.html @@ -10,8 +10,6 @@ Campus Map - Search Results - - @@ -22,9 +20,6 @@ - - - - - -
-

- RPI Campus Map -

-
-
-
- - -
- Oops, you appear to be offline, this app requires an internet - connection. -
-
-
+ + + - \ No newline at end of file + + From 5bc4e5496ac71f213459100e7bc5e397894a01a1 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Fri, 16 Aug 2019 14:22:19 -0400 Subject: [PATCH 10/69] removing glitch changes manually --- public/service-worker.js | 72 ---------------------------------------- 1 file changed, 72 deletions(-) delete mode 100644 public/service-worker.js diff --git a/public/service-worker.js b/public/service-worker.js deleted file mode 100644 index 9babb35..0000000 --- a/public/service-worker.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * @license - * Your First PWA Codelab (https://g.co/codelabs/pwa) - * Copyright 2019 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ -'use strict'; - -// CODELAB: Update cache names any time any of the cached files change. -const CACHE_NAME = 'static-cache-v1'; - -// CODELAB: Add list of files to cache here. -const FILES_TO_CACHE = [ - '/public/ offline.html', -]; - -self.addEventListener('install', (evt) => { - console.log('[ServiceWorker] Install'); - // CODELAB: Precache static resources here. - evt.waitUntil( - caches.open(CACHE_NAME).then((cache) => { - console.log('[ServiceWorker] Pre-caching offline page'); - return cache.addAll(FILES_TO_CACHE); - }) - ); - self.skipWaiting(); -}); - -self.addEventListener('activate', (evt) => { - console.log('[ServiceWorker] Activate'); - // CODELAB: Remove previous cached data from disk. - evt.waitUntil( - caches.keys().then((keyList) => { - return Promise.all(keyList.map((key) => { - if (key !== CACHE_NAME) { - console.log('[ServiceWorker] Removing old cache', key); - return caches.delete(key); - } - })); - }) - ); - self.clients.claim(); -}); - -self.addEventListener('fetch', (evt) => { - console.log('[ServiceWorker] Fetch', evt.request.url); - // CODELAB: Add fetch event handler here. - if (evt.request.mode !== 'navigate') { - // Not a page navigation, bail. - return; - } - evt.respondWith( - fetch(evt.request) - .catch(() => { - return caches.open(CACHE_NAME) - .then((cache) => { - return cache.match('offline.html'); - }); - }) - ); -}); From e2c8e44e6ff5f90c4d69f1d95f23d870a1d238a1 Mon Sep 17 00:00:00 2001 From: gwild37 Date: Mon, 19 Aug 2019 21:56:00 -0400 Subject: [PATCH 11/69] Updated README with license info about PWABuilder --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e4f9cba..0161de0 100644 --- a/README.md +++ b/README.md @@ -41,3 +41,6 @@ To start the server, run `npm start` to have the server auto-restart if you make * You can switch branches with the command `git checkout [branch]` Have fun making a big impact on campus! + +### LICENSING +The service worker and manifest were modified from MIT licensed code found at PWABuilder. From e467b7392aa167f4714300cc8c83240d0a56fff7 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Thu, 29 Aug 2019 12:23:18 -0400 Subject: [PATCH 12/69] added myself as a contributor --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cff461a..168e9b5 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ We are currently in the middle of a large refactor, but heavy construction will ### Current Contributors: * Justin Gaskins +* Gabriel Wild ### Founders: * Justin Gaskins From 81a54fc558d99cd18db9cf38cae692bbcb9f49a4 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Tue, 3 Sep 2019 21:30:04 -0400 Subject: [PATCH 13/69] cleaning up unused files --- pwabuilder-sw.js | 76 ------------------------------------------------ 1 file changed, 76 deletions(-) delete mode 100644 pwabuilder-sw.js diff --git a/pwabuilder-sw.js b/pwabuilder-sw.js deleted file mode 100644 index 74f07e1..0000000 --- a/pwabuilder-sw.js +++ /dev/null @@ -1,76 +0,0 @@ -// This is the service worker with the combined offline experience (Offline page + Offline copy of pages) - -const CACHE = "pwabuilder-offline-page"; - -const precacheFiles = [ - "/public/images/logo.png", - "/public/images/favicon.ico", - "/public/views/offline.html" -]; - -// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html"; -const offlineFallbackPage = "/public/views/offline.html"; - -// Install stage sets up the offline page in the cache and opens a new cache -self.addEventListener("install", function (event) { - console.log("[PWA Builder] Install Event processing"); - - event.waitUntil( - caches.open(CACHE).then(function (cache) { - console.log("[PWA Builder] Cached offline page during install"); - - if (offlineFallbackPage === "ToDo-replace-this-name.html") { - return cache.add(new Response("TODO: Update the value of the offlineFallbackPage constant in the serviceworker.")); - } - return cache.addAll(precacheFiles); - // return cache.add(offlineFallbackPage); - }) - ); -}); - -// If any fetch fails, it will look for the request in the cache and serve it from there first -self.addEventListener("fetch", function (event) { - if (event.request.method !== "GET") return; - - event.respondWith( - fetch(event.request) - .then(function (response) { - console.log("[PWA Builder] add page to offline cache: " + response.url); - - // If request was success, add or update it in the cache - event.waitUntil(updateCache(event.request, response.clone())); - - return response; - }) - .catch(function (error) { - console.log("[PWA Builder] Network request Failed. Serving content from cache: " + error); - return fromCache(event.request); - }) - ); -}); - -function fromCache(request) { - // Check to see if you have it in the cache - // Return response - // If not in the cache, then return the offline page - return caches.open(CACHE).then(function (cache) { - return cache.match(request).then(function (matching) { - if (!matching || matching.status === 404) { - // The following validates that the request was for a navigation to a new document - if (request.destination !== "document" || request.mode !== "navigate") { - return Promise.reject("no-match"); - } - - return cache.match(offlineFallbackPage); - } - - return matching; - }); - }); -} - -function updateCache(request, response) { - return caches.open(CACHE).then(function (cache) { - return cache.put(request, response); - }); -} From 8fc4c0e933642a22bb05e004367322df631facec Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Tue, 3 Sep 2019 21:32:35 -0400 Subject: [PATCH 14/69] cleaning up unused files --- public/views/pwabuilder-sw-register.js | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 public/views/pwabuilder-sw-register.js diff --git a/public/views/pwabuilder-sw-register.js b/public/views/pwabuilder-sw-register.js deleted file mode 100644 index fe1b735..0000000 --- a/public/views/pwabuilder-sw-register.js +++ /dev/null @@ -1,19 +0,0 @@ -// This is the service worker with the Advanced caching - -// Add this below content to your HTML page, or add the js file to your page at the very top to register service worker - -// Check compatibility for the browser we're running this in -if ("serviceWorker" in navigator) { - if (navigator.serviceWorker.controller) { - console.log("[PWA Builder] active service worker found, no need to register"); - } else { - // Register the service worker - navigator.serviceWorker - .register("pwabuilder-sw.js", { - scope: "./" - }) - .then(function (reg) { - console.log("[PWA Builder] Service worker has been registered for scope: " + reg.scope); - }); - } -} From 84a4c06fb5e019869c92241f4c4a4e2dacb6ec22 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Tue, 3 Sep 2019 21:40:50 -0400 Subject: [PATCH 15/69] cleaning up unused files --- pwabuilder-sw.js | 173 ----------------------------------------------- 1 file changed, 173 deletions(-) delete mode 100644 pwabuilder-sw.js diff --git a/pwabuilder-sw.js b/pwabuilder-sw.js deleted file mode 100644 index 6e0491f..0000000 --- a/pwabuilder-sw.js +++ /dev/null @@ -1,173 +0,0 @@ -//This is the service worker with the Advanced caching - -const CACHE = "pwabuilder-adv-cache"; -const precacheFiles = [ - /\/public\/controllers\/.*/, - /\/public\/images\/.*/, - /\/public\/style\/.*/, - "/public/views/searchResults.html", - "/public/views/index.html", - "/public/views/pwabuilder-sw-register.js", - "/public/map.js", - "/public/manifest.json", - "/pwabuilder-sw.js" - /* Add an array of files to precache for your app */ -]; - -// TODO: replace the following with the correct offline fallback page i.e.: const offlineFallbackPage = "offline.html"; -const offlineFallbackPage = "/public/views/offline.html"; - -const networkFirstPaths = [ - "/public/imagePreview.js", - "/public/infoPreview.js", - "/public/views/info.html", - "/public/views/machine_sites_info.html", - "/public/geolocations.js", - "/public/machine_sites.js" - /* Add an array of regex of paths that should go network first */ - // Example: /\/api\/.*/ -]; - -const avoidCachingPaths = [ - "/server.js", - - /* Add an array of regex of paths that shouldn't be cached */ - // Example: /\/api\/.*/ -]; - -function pathComparer(requestUrl, pathRegEx) { - return requestUrl.match(new RegExp(pathRegEx)); -} - -function comparePaths(requestUrl, pathsArray) { - if (requestUrl) { - for (let index = 0; index < pathsArray.length; index++) { - const pathRegEx = pathsArray[index]; - if (pathComparer(requestUrl, pathRegEx)) { - return true; - } - } - } - - return false; -} - -self.addEventListener("install", function (event) { - console.log("[PWA Builder] Install Event processing"); - - console.log("[PWA Builder] Skip waiting on install"); - self.skipWaiting(); - - event.waitUntil( - caches.open(CACHE).then(function (cache) { - console.log("[PWA Builder] Caching pages during install"); - - return cache.addAll(precacheFiles).then(function () { - if (offlineFallbackPage === "ToDo-replace-this-name.html") { - return cache.add(new Response("TODO: Update the value of the offlineFallbackPage constant in the serviceworker.")); - } - - return cache.add(offlineFallbackPage); - }); - }) - ); -}); - -// Allow sw to control of current page -self.addEventListener("activate", function (event) { - console.log("[PWA Builder] Claiming clients for current page"); - event.waitUntil(self.clients.claim()); -}); - -// If any fetch fails, it will look for the request in the cache and serve it from there first -self.addEventListener("fetch", function (event) { - if (event.request.method !== "GET") return; - - if (comparePaths(event.request.url, networkFirstPaths)) { - networkFirstFetch(event); - } else { - cacheFirstFetch(event); - } -}); - -function cacheFirstFetch(event) { - event.respondWith( - fromCache(event.request).then( - function (response) { - // The response was found in the cache so we responde with it and update the entry - - // This is where we call the server to get the newest version of the - // file to use the next time we show view - event.waitUntil( - fetch(event.request).then(function (response) { - return updateCache(event.request, response); - }) - ); - - return response; - }, - function () { - // The response was not found in the cache so we look for it on the server - return fetch(event.request) - .then(function (response) { - // If request was success, add or update it in the cache - event.waitUntil(updateCache(event.request, response.clone())); - - return response; - }) - .catch(function (error) { - // The following validates that the request was for a navigation to a new document - if (event.request.destination !== "document" || event.request.mode !== "navigate") { - return; - } - - console.log("[PWA Builder] Network request failed and no cache." + error); - // Use the precached offline page as fallback - return caches.open(CACHE).then(function (cache) { - cache.match(offlineFallbackPage); - }); - }); - } - ) - ); -} - -function networkFirstFetch(event) { - event.respondWith( - fetch(event.request) - .then(function (response) { - // If request was success, add or update it in the cache - event.waitUntil(updateCache(event.request, response.clone())); - return response; - }) - .catch(function (error) { - console.log("[PWA Builder] Network request Failed. Serving content from cache: " + error); - return fromCache(event.request); - }) - ); -} - -function fromCache(request) { - // Check to see if you have it in the cache - // Return response - // If not in the cache, then return error page - return caches.open(CACHE).then(function (cache) { - return cache.match(request).then(function (matching) { - if (!matching || matching.status === 404) { - return Promise.reject("no-match"); - } - - return matching; - }); - }); -} - -function updateCache(request, response) { - if (!comparePaths(request.url, avoidCachingPaths)) { - return caches.open(CACHE).then(function (cache) { - return cache.put(request, response); - }); - } - - return Promise.resolve(); -} From 448fbf211811440faa830a8c74c8ed0bdd401b2a Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Tue, 3 Sep 2019 21:41:10 -0400 Subject: [PATCH 16/69] cleaning up unused files --- service-worker.js | 103 ---------------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 service-worker.js diff --git a/service-worker.js b/service-worker.js deleted file mode 100644 index c2eabaf..0000000 --- a/service-worker.js +++ /dev/null @@ -1,103 +0,0 @@ -/* - * @license - * Your First PWA Codelab (https://g.co/codelabs/pwa) - * Copyright 2019 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ -'use strict'; - -const CACHE_NAME = 'static-cache'; - -const FILES_TO_CACHE = [ - '/public/views/offline.html', - ]; - // '/', - // '/public/controllers/app.js', - // '/public/controllers/infoController.js', - // '/public/controllers/mapController.js', - // '/public/controllers/searchController.js', - // '/public/images/campusmap_logo.png', - // '/public/images/favicon.ico', - // '/public/images/logo.png', - // '/public/images/pin-128x128.png', - // '/public/images/pin-144x144.png', - // '/public/images/pin-152x152.png', - // '/public/images/pin-192x192.png', - // '/public/images/pin-256x256.png', - // '/public/images/pin-512x512.png', - // '/public/images/pin.png', - // '/public/images/rensselaer_logo.png', - // '/public/images/seal.png', - // '/public/style/homepage.css', - // '/public/style/locationInfo.css', - // '/public/style/searchResults.html', - // '/public/style/style.css', - // '/public/views/index.html', - // '/public/views/info.html', - // '/public/views/machine_sites_info.html', - // '/public/views/searchResults.html', - // '/public/geolocations.js', - // '/public/imagePreview.js', - // '/public/infoPreview.php', - // '/public/machine_sites.js', - // '/public/manifest.json', - // '/public/map.js', - // '/campusmap.sql', - // '/geolocations.json', - // '/machine_sites.json', -// ]; - -self.addEventListener('install', (evt) => { - console.log('[ServiceWorker] Install'); - // CODELAB: Precache static resources here. - evt.waitUntil( - caches.open(CACHE_NAME).then((cache) => { - console.log('[ServiceWorker] Pre-caching offline page'); - return cache.addAll(FILES_TO_CACHE); - }) - ); - self.skipWaiting(); -}); - -self.addEventListener('activate', (evt) => { - console.log('[ServiceWorker] Activate'); - evt.waitUntil( - caches.keys().then((keyList) => { - return Promise.all(keyList.map((key) => { - if (key !== CACHE_NAME) { - console.log('[ServiceWorker] Removing old cache', key); - return caches.delete(key); - } - })); - }) - ); - self.clients.claim(); -}); - -self.addEventListener('fetch', (evt) => { - console.log('[ServiceWorker] Fetch', evt.request.url); - if (evt.request.mode !== 'navigate') { - // Not a page navigation, bail. - return; - } - evt.respondWith( - fetch(evt.request) - .catch(() => { - return caches.open(CACHE_NAME) - .then((cache) => { - return cache.match('/public/views/offline.html'); - }); - }) - ); -}); From 88ae49eb0bd124337b3dcf07f03b537303f35835 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Tue, 3 Sep 2019 21:41:53 -0400 Subject: [PATCH 17/69] cleaning up unused files --- public/manifest.json | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 public/manifest.json diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 146b589..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "RPI Campus Map", - "short_name" : "RPI Map", - "icons": [{ - "src": "/public/images/pin-128x128.png", - "sizes": "128x128", - "type": "image/png" - }, { - "src": "/public/images/pin-144x144.png", - "sizes": "144x144", - "type": "image/png" - }, { - "src": "/public/images/pin-152x152.png", - "sizes": "152x152", - "type": "image/png" - }, { - "src": "/public/images/pin-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, { - "src": "/public/images/pin-256x256.png", - "sizes": "256x256", - "type": "image/png" - }, { - "src": "/public/images/pin-512x512.png", - "sizes": "512x512", - "type": "image/png" - }], - "start_url": "https://rpicampusmap.glitch.me/public/views/index.html", - "display": "standalone", - "background_color": "#dc3545", - "theme_color": "#000000", - "lang": "English", - "orientation": "portrait", - "scope": "https://rpicampusmap.glitch.me/public/views/" -} \ No newline at end of file From cfc798928e720a90ff970cef7785d36052d28620 Mon Sep 17 00:00:00 2001 From: Gabriel Wild <45672441+gwild37@users.noreply.github.com> Date: Tue, 3 Sep 2019 21:42:32 -0400 Subject: [PATCH 18/69] cleaning up unused files --- public/offline.html | 147 -------------------------------------------- 1 file changed, 147 deletions(-) delete mode 100644 public/offline.html diff --git a/public/offline.html b/public/offline.html deleted file mode 100644 index 3c701bc..0000000 --- a/public/offline.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - Weather PWA - - - - - - -
-

- Weather PWA - - Powered by Dark Sky - -

-
-
-
- -
- Oops, you appear to be offline, this app requires an internet - connection. -
-
-
- - \ No newline at end of file From de0039857dd6b948a3e5c60fdaea6243cdfdf152 Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Tue, 17 Sep 2019 16:34:32 -0400 Subject: [PATCH 19/69] Returned .envTEMPLATE to the repository --- .envTEMPLATE | 7 +++++++ .gitignore | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .envTEMPLATE diff --git a/.envTEMPLATE b/.envTEMPLATE new file mode 100644 index 0000000..b7c6186 --- /dev/null +++ b/.envTEMPLATE @@ -0,0 +1,7 @@ +NODE_ENV = development + +PORT = 3000 + +# Database Info +DB_USER = +DB_PASS = diff --git a/.gitignore b/.gitignore index ed2d1f4..aafc595 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,5 @@ node_modules/ # Ignore .env file, to be kept locally on machine running the server for security .env -.envTEMPLATE RPI Campus Map Project Proposal Summer 19.pdf +RPI Campus Map Project Proposal Fall 19.pdf From 679c0289f37c20bdaf00d14e83b1d1eaa76374a1 Mon Sep 17 00:00:00 2001 From: Justin Mai Date: Fri, 20 Sep 2019 16:48:37 -0400 Subject: [PATCH 20/69] Fixed Issue 85 Github Link --- public/views/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/views/index.html b/public/views/index.html index d4b33db..dc5f2d2 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -82,7 +82,7 @@
RPI Interactive Campus Map -- An RCOS Project -- - GitHub -- + GitHub -- Admin Panel
From 96570b52ebe69ca2dfa0f4f210358836f25c87ee Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 1 Oct 2019 14:57:34 -0400 Subject: [PATCH 21/69] Fixed the footer alignment. Now always at the bottom, even on mobile. --- public/style/homepage.css | 7 +- public/style/style.css | 12 +- public/views/index.html | 231 ++++++++++++++++++++------------------ 3 files changed, 135 insertions(+), 115 deletions(-) diff --git a/public/style/homepage.css b/public/style/homepage.css index f7d3237..e5aebb0 100644 --- a/public/style/homepage.css +++ b/public/style/homepage.css @@ -6,7 +6,7 @@ body { } a { - text-decoration: none; + text-decoration: none; } #mapPopup { @@ -26,10 +26,11 @@ a { /* Always set the map height explicitly to define the size of the div * element that contains the map. */ #mapContainer { - height: 85%; + font-size: medium; + height: calc(100% - 8em); width: 100%; } .popup:hover { cursor: pointer; -} +} \ No newline at end of file diff --git a/public/style/style.css b/public/style/style.css index f386500..7b9b436 100644 --- a/public/style/style.css +++ b/public/style/style.css @@ -1,4 +1,5 @@ -html, body { +html, +body { height: 100%; } @@ -13,8 +14,11 @@ header { } footer { - max-height: 11vh; - max-width: 100%; + font-size: medium; + position: absolute; + bottom: 0; + width: 100%; + height: 4em; color: #eeeeee; } @@ -36,4 +40,4 @@ footer a { .bd-placeholder-img-lg { font-size: 3.5rem; } -} +} \ No newline at end of file diff --git a/public/views/index.html b/public/views/index.html index f3a2f12..da2f820 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -1,114 +1,129 @@ - - - - - - - - RPI Campus Map - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

This is where the map goes... lol

-
- - -
-
- + + + + + + RPI Campus Map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

This is where the map goes... lol

+
+ + + - - - - - - - - - - - - - - - - - +
+ -- RPI Interactive Campus Map --
+ An RCOS Project -- + GitHub -- + Admin Panel +
+
+
+ + + + + + + + + + + + + + + + + + \ No newline at end of file From 9a55ff4f37865bd4ec6e7f37aa841dca65d6681d Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 1 Oct 2019 16:31:30 -0400 Subject: [PATCH 22/69] fixing footer --- public/service-worker.js | 72 ----- public/style/searchResults.css | 5 + public/style/style.css | 1 + public/views/index.html | 3 - public/views/info.html | 366 ++++++++++++---------- public/views/machine_sites_info.html | 451 ++++++++++++++------------- public/views/searchResults.html | 204 ++++++------ service-worker.js | 103 ------ 8 files changed, 544 insertions(+), 661 deletions(-) delete mode 100644 public/service-worker.js delete mode 100644 service-worker.js diff --git a/public/service-worker.js b/public/service-worker.js deleted file mode 100644 index 9babb35..0000000 --- a/public/service-worker.js +++ /dev/null @@ -1,72 +0,0 @@ -/* - * @license - * Your First PWA Codelab (https://g.co/codelabs/pwa) - * Copyright 2019 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ -'use strict'; - -// CODELAB: Update cache names any time any of the cached files change. -const CACHE_NAME = 'static-cache-v1'; - -// CODELAB: Add list of files to cache here. -const FILES_TO_CACHE = [ - '/public/ offline.html', -]; - -self.addEventListener('install', (evt) => { - console.log('[ServiceWorker] Install'); - // CODELAB: Precache static resources here. - evt.waitUntil( - caches.open(CACHE_NAME).then((cache) => { - console.log('[ServiceWorker] Pre-caching offline page'); - return cache.addAll(FILES_TO_CACHE); - }) - ); - self.skipWaiting(); -}); - -self.addEventListener('activate', (evt) => { - console.log('[ServiceWorker] Activate'); - // CODELAB: Remove previous cached data from disk. - evt.waitUntil( - caches.keys().then((keyList) => { - return Promise.all(keyList.map((key) => { - if (key !== CACHE_NAME) { - console.log('[ServiceWorker] Removing old cache', key); - return caches.delete(key); - } - })); - }) - ); - self.clients.claim(); -}); - -self.addEventListener('fetch', (evt) => { - console.log('[ServiceWorker] Fetch', evt.request.url); - // CODELAB: Add fetch event handler here. - if (evt.request.mode !== 'navigate') { - // Not a page navigation, bail. - return; - } - evt.respondWith( - fetch(evt.request) - .catch(() => { - return caches.open(CACHE_NAME) - .then((cache) => { - return cache.match('offline.html'); - }); - }) - ); -}); diff --git a/public/style/searchResults.css b/public/style/searchResults.css index c438254..3e3b225 100644 --- a/public/style/searchResults.css +++ b/public/style/searchResults.css @@ -1,3 +1,8 @@ .row { max-width: 100%; } + +#container { + min-height: 100%; + position: relative; +} \ No newline at end of file diff --git a/public/style/style.css b/public/style/style.css index 7b9b436..a093821 100644 --- a/public/style/style.css +++ b/public/style/style.css @@ -1,6 +1,7 @@ html, body { height: 100%; + overflow: auto; } main { diff --git a/public/views/index.html b/public/views/index.html index da2f820..ea1dd17 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -40,9 +40,6 @@ integrity="sha512-nMMmRyTVoLYqjP9hrbed9S+FzjZHW5gY1TWCHA5ckwXZBadntCNs8kEqAWdrb9O7rxbCaA4lKTIWjDXZxflOcA==" crossorigin=""> - - - diff --git a/public/views/info.html b/public/views/info.html index a6ed91a..6d50ace 100644 --- a/public/views/info.html +++ b/public/views/info.html @@ -1,139 +1,151 @@ - - - - - - - Info - {{name}} + + + + + + - - - + Info - {{name}} + + + - - - - - - - - - + + + + + - - - - - + + + + + - - + + + + + - + + - - - + + + -
-
-
-
-
-

{{name}}

-
-

{{desc}}

-

{{nick}}

+ +
- Show On Map -
+
+
+
+
+
+

{{name}}

+
+

{{desc}}

+

{{nick}}

+ + Show On Map +
-
-
+
+
+
+
- -
-
-

Comments:

-
-

No comments found. Be the first to leave a comment!

-
-
- +
+
+

Comments:

+
+

No comments found. Be the first to leave a comment!

+
+
+ - -
Post a Comment:
-
-
-
-
- -
-
- -
+ +
Post a Comment:
+
+ +
+
+
-
- +
+
- -
-
+
+
+ +
+ +
+
-
- -
Add an Image:
-
-
-
- -
-
- -
-
-
-
-
+
+ +
Add an Image:
+
+
+
+ +
+
+ +
+
+
+
+
- - -
+
-
+
- + - - + + + + + - - + + + - - - + - - + \ No newline at end of file diff --git a/public/views/machine_sites_info.html b/public/views/machine_sites_info.html index 128b589..7502af1 100644 --- a/public/views/machine_sites_info.html +++ b/public/views/machine_sites_info.html @@ -1,239 +1,260 @@ - - - - - - - - Campus Map - Search Results - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - -
- -
-
-

{{name}}

-

{{nick}}

-

{{desc}}

- -
- -
-

Sunday: {{sunHours}}

-

Monday: {{monHours}}

-

Tuesday: {{tuesHours}}

-

Wednesday: {{wedHours}}

-

Thursday: {{thurHours}}

-

Friday: {{friHours}}

-

Saturday: {{satHours}}

-
- -

Room info/permissions: {{info}}

-

List of Machines

-
  • - {{x}} -
  • -
    -

    Materials Inventory

    -
  • - {{x}} -
  • -
    -

    Available Equipment

    -
  • - {{x}} -
  • -
    + } + + + + + + +
    + + + + +
    + +
    +
    +

    {{name}}

    +

    {{nick}}

    +

    {{desc}}

    + +
    + +
    +

    Sunday: {{sunHours}}

    +

    Monday: {{monHours}}

    +

    Tuesday: {{tuesHours}}

    +

    Wednesday: {{wedHours}}

    +

    Thursday: {{thurHours}}

    +

    Friday: {{friHours}}

    +

    Saturday: {{satHours}}

    +
    + +

    Room info/permissions: {{info}}

    +

    List of Machines

    +
  • + {{x}} +
  • +
    +

    Materials Inventory

    +
  • + {{x}} +
  • +
    +

    Available Equipment

    +
  • + {{x}} +
  • +
    + + Show On Map + -
    +
    -
    - -
    - - - +
    + + - - + }); + } + + + + + + - - - - - + \ No newline at end of file diff --git a/public/views/searchResults.html b/public/views/searchResults.html index 2994fe8..8a171d1 100644 --- a/public/views/searchResults.html +++ b/public/views/searchResults.html @@ -1,65 +1,70 @@ - - - - - - - - Search Results - "{{params.query}}" - - - - - - - - - - - - - - - - - - - - - -
    -
    - - + + + + + + Search Results - "{{params.query}}" + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    + + -
    + + + - - - - - - +
    + +
    + + + + + + + \ No newline at end of file diff --git a/service-worker.js b/service-worker.js deleted file mode 100644 index c2eabaf..0000000 --- a/service-worker.js +++ /dev/null @@ -1,103 +0,0 @@ -/* - * @license - * Your First PWA Codelab (https://g.co/codelabs/pwa) - * Copyright 2019 Google Inc. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ -'use strict'; - -const CACHE_NAME = 'static-cache'; - -const FILES_TO_CACHE = [ - '/public/views/offline.html', - ]; - // '/', - // '/public/controllers/app.js', - // '/public/controllers/infoController.js', - // '/public/controllers/mapController.js', - // '/public/controllers/searchController.js', - // '/public/images/campusmap_logo.png', - // '/public/images/favicon.ico', - // '/public/images/logo.png', - // '/public/images/pin-128x128.png', - // '/public/images/pin-144x144.png', - // '/public/images/pin-152x152.png', - // '/public/images/pin-192x192.png', - // '/public/images/pin-256x256.png', - // '/public/images/pin-512x512.png', - // '/public/images/pin.png', - // '/public/images/rensselaer_logo.png', - // '/public/images/seal.png', - // '/public/style/homepage.css', - // '/public/style/locationInfo.css', - // '/public/style/searchResults.html', - // '/public/style/style.css', - // '/public/views/index.html', - // '/public/views/info.html', - // '/public/views/machine_sites_info.html', - // '/public/views/searchResults.html', - // '/public/geolocations.js', - // '/public/imagePreview.js', - // '/public/infoPreview.php', - // '/public/machine_sites.js', - // '/public/manifest.json', - // '/public/map.js', - // '/campusmap.sql', - // '/geolocations.json', - // '/machine_sites.json', -// ]; - -self.addEventListener('install', (evt) => { - console.log('[ServiceWorker] Install'); - // CODELAB: Precache static resources here. - evt.waitUntil( - caches.open(CACHE_NAME).then((cache) => { - console.log('[ServiceWorker] Pre-caching offline page'); - return cache.addAll(FILES_TO_CACHE); - }) - ); - self.skipWaiting(); -}); - -self.addEventListener('activate', (evt) => { - console.log('[ServiceWorker] Activate'); - evt.waitUntil( - caches.keys().then((keyList) => { - return Promise.all(keyList.map((key) => { - if (key !== CACHE_NAME) { - console.log('[ServiceWorker] Removing old cache', key); - return caches.delete(key); - } - })); - }) - ); - self.clients.claim(); -}); - -self.addEventListener('fetch', (evt) => { - console.log('[ServiceWorker] Fetch', evt.request.url); - if (evt.request.mode !== 'navigate') { - // Not a page navigation, bail. - return; - } - evt.respondWith( - fetch(evt.request) - .catch(() => { - return caches.open(CACHE_NAME) - .then((cache) => { - return cache.match('/public/views/offline.html'); - }); - }) - ); -}); From 1a531da7f3d3ffbdbbcd7a5e2faa2c8243c9934f Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 1 Oct 2019 16:50:29 -0400 Subject: [PATCH 23/69] fixed more pwa tags --- public/views/index.html | 6 ------ public/views/info.html | 8 +------- public/views/machine_sites_info.html | 3 +++ public/views/searchResults.html | 2 ++ 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/public/views/index.html b/public/views/index.html index 0ef3b6c..85d24b4 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -41,13 +41,7 @@ crossorigin=""> - - - - - - diff --git a/public/views/info.html b/public/views/info.html index a37b625..1ce4125 100644 --- a/public/views/info.html +++ b/public/views/info.html @@ -36,14 +36,8 @@ - - - - - - - + diff --git a/public/views/machine_sites_info.html b/public/views/machine_sites_info.html index 7502af1..77af5d6 100644 --- a/public/views/machine_sites_info.html +++ b/public/views/machine_sites_info.html @@ -28,6 +28,9 @@ integrity="sha384-DJ25uNYET2XCl5ZF++U8eNxPWqcKohUUBUpKGlNLMchM7q4Wjg2CUpjHLaL8yYPH" crossorigin="anonymous"> + + + diff --git a/public/views/searchResults.html b/public/views/searchResults.html index 8a171d1..d6e44ea 100644 --- a/public/views/searchResults.html +++ b/public/views/searchResults.html @@ -24,6 +24,8 @@ + + From 5d21d40da7f6438ac82f5089f3c41efbcd276e3e Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 1 Oct 2019 16:51:20 -0400 Subject: [PATCH 24/69] added pwa tags to index.html --- public/views/index.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/public/views/index.html b/public/views/index.html index 85d24b4..0ef3b6c 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -41,7 +41,13 @@ crossorigin=""> + + + + + + From b4fb0518c390ee31ae9677f0c602eeee0bf1cfed Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 1 Oct 2019 16:52:14 -0400 Subject: [PATCH 25/69] added theme color for all sites --- public/views/notfound.html | 189 ++++++++++++++++++++----------------- public/views/offline.html | 13 ++- 2 files changed, 109 insertions(+), 93 deletions(-) diff --git a/public/views/notfound.html b/public/views/notfound.html index 1c5a688..d0b962e 100644 --- a/public/views/notfound.html +++ b/public/views/notfound.html @@ -1,94 +1,107 @@ - - - - - - - - Page Not Found - - - - - - - - - - - - - - - - - - - - -
    -
    -

    We couldn't find the page you were looking for 😢

    - -

    The URL may have been mistyped or the page may have moved:

    -
      -
    • Please try navigating back to the homepage to find what you are looking for.
    • -
    • Alternatively you can contact us here.
    • -
    -
    -
    - - -
    -
    - + + + + + + Page Not Found + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    We couldn't find the page you were looking for 😢

    + +

    The URL may have been mistyped or the page may have moved:

    +
      +
    • Please try navigating back to the homepage to find what you are looking for.
    • +
    • Alternatively you can contact us here.
    • +
    +
    +
    + + + - - - - - - - - - +
    + RPI Interactive Campus Map -- + An RCOS Project -- + GitHub -- + Admin Panel +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/public/views/offline.html b/public/views/offline.html index db5b3b2..9a63be3 100644 --- a/public/views/offline.html +++ b/public/views/offline.html @@ -23,6 +23,8 @@ + + @@ -94,10 +96,11 @@

    Sorry this page doesn't work offline 😢

    + integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"> + + integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"> + - + + \ No newline at end of file From f8c8e90f3173cd7a056372347b8570ed75189527 Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Fri, 4 Oct 2019 16:45:19 -0400 Subject: [PATCH 26/69] Add .envTEMPLATE back to the repository --- .envTEMPLATE | 7 +++++++ .gitignore | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 .envTEMPLATE create mode 100644 .gitignore diff --git a/.envTEMPLATE b/.envTEMPLATE new file mode 100644 index 0000000..b7c6186 --- /dev/null +++ b/.envTEMPLATE @@ -0,0 +1,7 @@ +NODE_ENV = development + +PORT = 3000 + +# Database Info +DB_USER = +DB_PASS = diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..642b313 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.env +screenshots +node_modules From bdb4eb750924297947250799f259779c66ddae93 Mon Sep 17 00:00:00 2001 From: gwild37 Date: Tue, 8 Oct 2019 15:51:18 -0400 Subject: [PATCH 27/69] Myriad of footer adjustments --- public/style/style.css | 11 ++++++++ public/views/admin.html | 31 +++++++++++----------- public/views/index.html | 13 +++++----- public/views/info.html | 13 +++++----- public/views/login.html | 31 +++++++++++----------- public/views/machine_sites_info.html | 39 +++++++++++----------------- public/views/notfound.html | 13 +++++----- public/views/offline.html | 31 +++++++++++----------- public/views/register.html | 31 +++++++++++----------- public/views/searchResults.html | 28 ++++++++++---------- 10 files changed, 117 insertions(+), 124 deletions(-) diff --git a/public/style/style.css b/public/style/style.css index 4075042..16caee3 100644 --- a/public/style/style.css +++ b/public/style/style.css @@ -41,4 +41,15 @@ footer a { .bd-placeholder-img-lg { font-size: 3.5rem; } +} + +#seal { + float: left; + clear: none; + height: 3em; + width: 3em; +} + +#footerText { + margin: 0 3em 0 0; } \ No newline at end of file diff --git a/public/views/admin.html b/public/views/admin.html index 1a0d4df..3ffd9af 100644 --- a/public/views/admin.html +++ b/public/views/admin.html @@ -61,22 +61,21 @@
    - - + + diff --git a/public/views/index.html b/public/views/index.html index 0ef3b6c..13c4ab5 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -92,17 +92,16 @@ diff --git a/public/views/info.html b/public/views/info.html index 1ce4125..4e7ff7f 100644 --- a/public/views/info.html +++ b/public/views/info.html @@ -242,17 +242,16 @@
    Add an Image:
    diff --git a/public/views/login.html b/public/views/login.html index cf13ebb..7037345 100644 --- a/public/views/login.html +++ b/public/views/login.html @@ -84,22 +84,21 @@

    You must login with an administrator account to view this page.

    - - + + diff --git a/public/views/machine_sites_info.html b/public/views/machine_sites_info.html index 77af5d6..fd425fd 100644 --- a/public/views/machine_sites_info.html +++ b/public/views/machine_sites_info.html @@ -11,29 +11,21 @@ Campus Map - Search Results - - - + + - - - - - - - - - - - - - - - -
    - -
    -
    -

    {{name}}

    -

    {{nick}}

    -

    {{desc}}

    - -
    - -
    -

    Sunday: {{sunHours}}

    -

    Monday: {{monHours}}

    -

    Tuesday: {{tuesHours}}

    -

    Wednesday: {{wedHours}}

    -

    Thursday: {{thurHours}}

    -

    Friday: {{friHours}}

    -

    Saturday: {{satHours}}

    -
    - -

    Room info/permissions: {{info}}

    -

    List of Machines

    -
  • - {{x}} -
  • -
    -

    Materials Inventory

    -
  • - {{x}} -
  • -
    -

    Available Equipment

    -
  • - {{x}} -
  • -
    - - Show On Map - -
    - -
    - -
    -
    - -
    - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/views/mapinfo.html b/public/views/mapinfo.html new file mode 100644 index 0000000..a7bab7e --- /dev/null +++ b/public/views/mapinfo.html @@ -0,0 +1,274 @@ + + + + + + + + + + + Info - {{name}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +
    +
    +
    +

    {{name}}

    +
    +

    {{desc}}

    +

    {{nick}}

    + + Show On Map +
    + +
    + +
    + + +
    +
    +
    +
    + + +
    +
    +

    Comments:

    +
    +

    No comments found. Be the first to leave a comment!

    +
    +
    + + + +
    Post a Comment:
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    Add an Image:
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + + + + +
    + +
    + +
    + + + + + + + + + + + + + + diff --git a/server.js b/server.js index 38494ce..f1b47c5 100644 --- a/server.js +++ b/server.js @@ -200,7 +200,7 @@ app.route('/search') /* ===================================== INFO ======================================== */ app.route('/info') .get(function (req, res) { - res.sendFile(__dirname + '/public/views/machine_sites_info.html') + res.sendFile(__dirname + '/public/views/info.html') }) .post(jsonParser, function(req, res) { const comment = req.body.comment; From 01608b7e108ca553c607ba8706ffec569edc27c4 Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Tue, 29 Oct 2019 18:17:31 -0400 Subject: [PATCH 39/69] Changed dropdown menu to bootstrap, made photo carousel fixed height --- public/style/locationInfo.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/public/style/locationInfo.css b/public/style/locationInfo.css index 810a70b..6659df9 100644 --- a/public/style/locationInfo.css +++ b/public/style/locationInfo.css @@ -6,3 +6,11 @@ width: 100%; background-color: beige; } + +#photos { + height: 50vh; +} + +#photos img { + max-height: 100%; +} From 9037cef9d4292a3568bc96946164ccd22909d80b Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Fri, 1 Nov 2019 16:14:20 -0400 Subject: [PATCH 40/69] Fixed tab title of info page --- public/views/info.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/views/info.html b/public/views/info.html index 5bf39a0..ce0f5e6 100644 --- a/public/views/info.html +++ b/public/views/info.html @@ -8,7 +8,7 @@ - Campus Map - Search Results + {{name}} - CampusMap From 733b4c0b75ba9d1a6fc728fcea42df7b6d89df8e Mon Sep 17 00:00:00 2001 From: Unachieved Date: Tue, 19 Nov 2019 16:14:02 -0500 Subject: [PATCH 41/69] Jon_refactored_the_code_and_imp_log_and_register --- app.js | 65 ++ config/auth.js | 11 + config/keys.js | 13 + config/passport.js | 45 ++ models/User.js | 24 + package-lock.json | 529 ++++++++++---- package.json | 17 +- public/images/rpi_image.jpg | Bin 0 -> 325572 bytes public/style/admin.css | 5 + public/style/layout.css | 7 + public/style/layout2.css | 28 + public/style/login.css | 15 + public/style/register.css | 5 + public/style/style.css | 1 + public/style/welcome.css | 41 ++ public/views/login.html | 12 +- public/views/register.html | 17 +- routes/geolocations.js | 1308 +++++++++++++++++++++++++++++++++++ routes/index.js | 15 + routes/main_page.js | 7 + routes/map.js | 197 ++++++ routes/user.js | 108 +++ server.js | 2 + views/admin.ejs | 7 + views/info.ejs | 267 +++++++ views/layout.ejs | 55 ++ views/layout2.ejs | 103 +++ views/login.ejs | 30 + views/map.ejs | 138 ++++ views/notfound.ejs | 107 +++ views/offline.ejs | 103 +++ views/partials/messages.ejs | 37 + views/register.ejs | 40 ++ views/searchResults.ejs | 135 ++++ views/welcome.ejs | 18 + 35 files changed, 3355 insertions(+), 157 deletions(-) create mode 100644 app.js create mode 100644 config/auth.js create mode 100644 config/keys.js create mode 100644 config/passport.js create mode 100644 models/User.js create mode 100644 public/images/rpi_image.jpg create mode 100644 public/style/admin.css create mode 100644 public/style/layout.css create mode 100644 public/style/layout2.css create mode 100644 public/style/register.css create mode 100644 public/style/welcome.css create mode 100644 routes/geolocations.js create mode 100644 routes/index.js create mode 100644 routes/main_page.js create mode 100644 routes/map.js create mode 100644 routes/user.js create mode 100644 views/admin.ejs create mode 100644 views/info.ejs create mode 100644 views/layout.ejs create mode 100644 views/layout2.ejs create mode 100644 views/login.ejs create mode 100644 views/map.ejs create mode 100644 views/notfound.ejs create mode 100644 views/offline.ejs create mode 100644 views/partials/messages.ejs create mode 100644 views/register.ejs create mode 100644 views/searchResults.ejs create mode 100644 views/welcome.ejs diff --git a/app.js b/app.js new file mode 100644 index 0000000..90b6a19 --- /dev/null +++ b/app.js @@ -0,0 +1,65 @@ +const http = require('http'); +const express = require('express'); +const bodyParser = require('body-parser'); +const expressLayouts = require('express-ejs-layouts'); +const mongodb = require('mongodb'); +const mongoose = require('mongoose'); +const passport = require('passport'); +const flash = require('connect-flash'); +const session = require('express-session'); + +const app = express(); + + +// Passport Config +require('./config/passport')(passport); + +// DB Config +const db = require('./config/keys').MongoURI; + +// Connect to Mongo +mongoose.connect(db, {useUnifiedTopology: true,useNewUrlParser: true}) + .then(() => console.log('MongoDB Connected...')) + .catch(err=> console.log(err)); + +// EJS +app.use(expressLayouts); +app.set('view engine', 'ejs'); +//app.use(express.static(__dirname)).use(bodyParser.urlencoded({extended: true})).use(bodyParser.json()); + +// Bodyparser +app.use(express.urlencoded({ extended: false})); +app.use(bodyParser.json()) + +// Express Session +app.use(session({ + secret: 'secret', + resave: true, + saveUninitialized: true, + //cookie: { secure: true } +})); + +// Passport middleware +app.use(passport.initialize()); +app.use(passport.session()); + +// Connect Flash +app.use(flash()); + +// Global vars +app.use((req, res, next) => { + res.locals.success_msg = req.flash('success_msg'); + res.locals.error_msg = req.flash('err_msg'); + res.locals.error = req.flash('error'); + next(); +}); + +// Routers +app.use('/', require('./routes/index')); +app.use('/user', require('./routes/user')); +app.use( express.static( "public" ) ); + + +const PORT = process.env.PORT || 5000; + +app.listen(PORT, console.log(`Server started on port ${PORT}`)); \ No newline at end of file diff --git a/config/auth.js b/config/auth.js new file mode 100644 index 0000000..cb150c1 --- /dev/null +++ b/config/auth.js @@ -0,0 +1,11 @@ +// check if user trying to access the admin panel is already loged in +// if the are not it redirects them to the login page +module.exports = { + ensureAuthenticated: function(req, res, next) { + if(req.isAuthenticated()){ + return next(); + } + req.flash('error_msg', 'Please log in to view this resource'); + res.redirect('/user/login'); + } +} \ No newline at end of file diff --git a/config/keys.js b/config/keys.js new file mode 100644 index 0000000..86bd18e --- /dev/null +++ b/config/keys.js @@ -0,0 +1,13 @@ + +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); + + +const user = process.env.DB_USER; +const pass = process.env.DB_PASS; +const uri = `mongodb+srv://${user}:${pass}@rpicampusmap-fwvzb.gcp.mongodb.net/test?retryWrites=true`; +const options = {useNewUrlParser: true}; + +module.exports = { + MongoURI: uri +} \ No newline at end of file diff --git a/config/passport.js b/config/passport.js new file mode 100644 index 0000000..5f8860e --- /dev/null +++ b/config/passport.js @@ -0,0 +1,45 @@ +const LocalStrategy = require('passport-local').Strategy; +const mogoose = require('mongoose'); +const bcrypt = require('bcryptjs'); + + +// Local user model +const User = require('../models/User'); + +module.exports = function(passport) { + passport.use( + new LocalStrategy({ usernameField: 'email'}, (email, password, done) => { + //Match User + User.findOne({email: email}) + .then(user => { + if(!user){ + return done(null, false, {message: 'That email is not registered'}); + } + // Match password + bcrypt.compare(password, user.password, (err, isMatch) =>{ + if(err)throw(err); + + if(isMatch){ + return done(null, user); + } else { + return done(null, false, { message: 'Password Incorrect'}) + } + }); + }) + .catch(err => { + console.log("error in auth"); + console.log(err); + }) + }) + ); + + passport.serializeUser((user, done) => { + done(null, user.id); + }); + + passport.deserializeUser((id, done) => { + User.findById(id, (err, user) => { + done(err, user); + }); + }); +} \ No newline at end of file diff --git a/models/User.js b/models/User.js new file mode 100644 index 0000000..5de158e --- /dev/null +++ b/models/User.js @@ -0,0 +1,24 @@ +const mongoose = require('mongoose'); + +const UserSchema = new mongoose.Schema({ + name: { + type: String, + require: true + }, + email: { + type: String, + require: true + }, + password: { + type: String, + require: true + }, + date: { + type: Date, + default: Date.now + } +}); + +const User = mongoose.model('User', UserSchema); + +module.exports = User; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 074dcd9..bedeff3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,27 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "dependencies": { + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + } } }, "ajv": { @@ -200,26 +215,43 @@ "tweetnacl": "^0.14.3" } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } } }, "boxen": { @@ -278,9 +310,9 @@ "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==" }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cache-base": { "version": "1.0.1", @@ -426,10 +458,18 @@ "xdg-basedir": "^3.0.0" } }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA=" + }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -437,9 +477,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -589,6 +629,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "ejs": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -656,40 +701,79 @@ } }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "express-ejs-layouts": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/express-ejs-layouts/-/express-ejs-layouts-2.5.0.tgz", + "integrity": "sha512-27Kza3FR8UqvQsq1ewaxC2IwpgrQttYDEFN5s8D74Fv1VPdzsXFWsiKhPMlNauG+DrgMAmh7FhQl5hKHffd+wQ==" + }, + "express-session": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz", + "integrity": "sha512-t4oX2z7uoSqATbMfsxWMbNjAL0T5zpvcJCk3Z9wnPPN7ibddhnmDZXHfEcoBMG2ojKXZoCyPMc5FbtK+G7SoDg==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } } }, "extend": { @@ -812,16 +896,16 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, @@ -880,7 +964,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -898,11 +983,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -915,15 +1002,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1026,7 +1116,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1036,6 +1127,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1048,17 +1140,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -1075,6 +1170,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1147,7 +1243,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1157,6 +1254,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -1232,7 +1330,8 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -1262,6 +1361,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -1279,6 +1379,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -1317,11 +1418,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "optional": true } } }, @@ -1442,14 +1545,15 @@ } }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-signature": { @@ -1463,9 +1567,9 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -1496,9 +1600,9 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, "is-accessor-descriptor": { "version": "0.1.6", @@ -1726,6 +1830,11 @@ "verror": "1.10.0" } }, + "kareem": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -1816,9 +1925,9 @@ } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.38.0", @@ -1847,9 +1956,9 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -1885,6 +1994,74 @@ "saslprep": "^1.0.0" } }, + "mongoose": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.6.tgz", + "integrity": "sha512-2r87HmQMDCeZocoFmYGnJSpCW9ut95iQyPUcseG2B6EiAJjJBmR3pA01QyDF2+zQWpA8Ui4wH7xOq05U1nF6wg==", + "requires": { + "bson": "~1.1.1", + "kareem": "2.3.1", + "mongodb": "3.3.3", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.6.0", + "mquery": "3.2.2", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.1.2", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "mongodb": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.3.tgz", + "integrity": "sha512-MdRnoOjstmnrKJsK8PY0PjP6fyF/SBS4R8coxmhsfEU7tQ46/J6j+aSHF2n4c2/H8B+Hc/Klbfp8vggZfI0mmA==", + "requires": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "mpath": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", + "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" + }, + "mquery": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1915,9 +2092,9 @@ } }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "nodemon": { "version": "1.19.1", @@ -2029,6 +2206,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -2046,15 +2228,37 @@ } }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, + "passport": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", + "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" + }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -2080,6 +2284,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -2106,12 +2315,12 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.0" } }, "pseudomap": { @@ -2139,19 +2348,24 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, @@ -2199,6 +2413,11 @@ "safe-regex": "^1.1.0" } }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, "registry-auth-token": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", @@ -2323,9 +2542,9 @@ } }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -2334,29 +2553,36 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -2375,9 +2601,9 @@ } }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "shebang-command": { "version": "1.2.0", @@ -2392,11 +2618,21 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -2569,9 +2805,9 @@ } }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "string-width": { "version": "2.1.1", @@ -2667,6 +2903,11 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -2705,12 +2946,35 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + } + } + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" } }, "undefsafe": { @@ -2722,35 +2986,14 @@ } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-string": { diff --git a/package.json b/package.json index e586be3..43a3d31 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,10 @@ "name": "rpicampusmap", "version": "1.0.0", "description": "An interactive map for the Rensselaer Polytechnic Institute campus.", - "main": "index.html", + "main": "app.js", "scripts": { - "start": "nodemon server.js", + "start": "node app.js", + "dev": "nodemon app.js", "test": "ECHO \"no test command found\"; exit(1);" }, "repository": { @@ -21,10 +22,18 @@ }, "homepage": "https://github.com/gaskij/rpicampusmap#readme", "dependencies": { + "bcryptjs": "^2.4.3", + "connect-flash": "^0.1.1", "dotenv": "^7.0.0", - "express": "^4.16.4", + "ejs": "^2.7.1", + "express": "^4.17.1", + "express-ejs-layouts": "^2.5.0", + "express-session": "^1.17.0", "mongodb": "^3.2.3", + "mongoose": "^5.7.6", "nodemon": "^1.19.1", + "passport": "^0.4.0", + "passport-local": "^1.0.0", "request": "^2.88.0" } -} \ No newline at end of file +} diff --git a/public/images/rpi_image.jpg b/public/images/rpi_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89abfb315a026e7632c0a6338cc6ae049bc47478 GIT binary patch literal 325572 zcmeFacU)6T*C@P`5K1V5CWwd{P!xic&_PikfOHWEC4iC!1d{3qo=#9YTWi8Sq~S z1Af;LiegwA!0m{c-*Esz1nxTwN+VPuG{^_3P%mQcG(3dR`h_M@Oa~8eMi7Q#7z>JE z5X;4|B7o=bU_la7bPxuBWktX{_~$|8Qez^yEIMT8M$+}Bm;lbcY=xjDia+i)j7S<2 z?-3Rm8yOQ8$-|SpOz~Q7R62_bCul>421Ij915-;wGd$7Ml4xvcU;=?`{Aw?}AD(ES zXQBsaLeTt_13!329!WVo4VUfI_}Pw~OTNPl2+D#WDNs(rz|hbj3-zN-NI{mwG~AMn zoTk&2gAn&A=qKc(oS*4`=15GZzsx~TM6LZgCEAwzyQ1>3riyd@jEiJG&Th9 z?O)RX?$j75RP2Ff*jhuzSy#k&kO3~3XCLsJ1AhA82ajR+g3~1tKiVP*5~jy2YVFT4 ziwgO5%pwufeZ@si_n}&om?8u@ey1zGPxed>$@w{vNb5X2S35Yl+QX6t$vL{RxRFRO zx;fm~XwOx)ct3v%Ug|a&A2N_6M1&wJJ%;Dz<=_p|bh0PmV*t{3`rmKwyTsf>9lDMl zc>Le<{@W)dIxjjFwAKS)8ZnqLbO3J$FgqcZ2dBRRFqRep!$`PavC)7*0IR@o=oGwE zj57sW!!U!xWdIzQXC8yYfZ;0u-Weaq1Te}Kz-jR;W&(ik0eBHRj>7`*M*w3vOlk~x zg>rCuER!Aviw}V1qP;yy0A3CzEV%;&+BnzWFolXW5@=k;M>XJ`VaO>t`BmKLpjMLXb-D&$LCyAZW&R2om1; zr9H~5k%)1z9280Fk+I(msqy_0hhL9Pw46=so zA!lec`@lA$yx1E{Dx=m2ySDuK!&0dyLwht5HlpsUag=q}U= z^+5yB6X-eg3VIKHMj#MU2zkUT#2mx|geF1#ER%4QAWP6Cq9nFR?3OqnaZ*AkaYdp-Vo>6h z#5c4&S`Dp(wnRIj{m`N41aulYA662yE2J+-w@d#e{aHp)MpMR8X0;4MW`oRLnG%^snL9F1WIkh*FiS927;j8CCK*$R z5nx1^2bj0Ava%Yo7P4z(S+ZMY3uUWiugea~ev+FhN01}Q1-6!a9F6c`Fg3I`R03hfFnXUNRZoMAI#?Tn2x@@Jfx zac9P;qKx8VMUo;_af{+X#j}dtisMSNl!!{Jl{iYfl`524m7dO&nz?wU{Y=Kp?K6+h zygYMw7HZbQS)^I?S=(ln%o5Fdf|bNB!8&2Xu^HGZ>}~8T+)SJ?&Ih+1cMx|TH=vAC zUaah-%vRp3d|J6nd1Cgw**3G8vv_}{2co^5p%NV z)X#aSDxpeHU89T(Hv}EHF{*nh;@>(mkqO^*&?rBSEn`=jCAJ)E0KoU#{VT6N(J32@m zQyrGhVV$<6=%p4*xl4r|4(vU(^3)U}C^F zC^6_G&Llb$Q;3bkH--d5y5T{?dq(m`4n|2v4Mwkxb&Q$DM~r(+W|_E|>@aCD`D$ur z8f_{teP*`EEZFRjS+_aX+{1jg`E?7lg{?)B#W{;lmZp}mmZvSpmgz2wSXQy@>GCDZ znafL-4_j$iQLT!s23Fu#1g|)@Vqm5EO6tnul|$AGtr^y3)_>V(+l1Rx+Pt(iu#L8@ zv;9D_ByA=&+o9}M*`?dvwx4NFwm)G1$U(y))Pe8tYL&^VO{#^PK2T zrcD^~j1Ah8` zoBeM1tNOG28z@o~A4(ZzJitC6FW^a_Nnl!FSJ0B6^+By`RoAlDo?ka(9d+HAV05r= za7FMJ>S}5+b)4ozJ4Aa$C(#S&&l%Q?eT-*JD`pP!uMn${oRFuXR-w6}&%#!Q<%f;3 zNUQ^_*Wr%gN5elvtd2MlG0FC2pW;Y!f;nfoGr1AmE0Oaf*GIPTba-jJfhfzUyr@^v zF41K%h?t<5hFC0EOx=vric5_fj9(FdF#cnLPr{k?O6$4nZ*CxL*tOxWjSd@2H%V-w zZ)!cvO6+9qyuHh4*Zy7K(i!Q0WEf=RXMEXB-~GoP;-11ilbIoz zxA&UvJ(4Av#m(x1od<0Xo;svEALj>RW%571x2Tn zPi0g?)p6A$HNiDqr(I6BoH0KmsMV}JR5z3aZ)iK~e72==Sz}$3 zUek$l>gNug$DQAM0drydg~^K>FOE0!nny2%UK(y$*V1>{@AADXYp&cDxrnY`b+~%@ zn$5L~*R8IfYqe}W`-k}-^*2m!2ydF)th;4$tM0bxZQ&iWI}LX&?l!h9Z@bXGvi(wr zUB}gXPWNtfx_7p9k-K`j1G@)$7(Gw#v+uv|jqm;3xAg(~LHa|*hxw1x9u@a%_n#Ut z9XLN|H+XZ%Yp8FSKK%S~%;PUlw*M*rXZ~Lc{wjZJ`1IT}hi7+30!E%Z=RN;Cn)X8J z#i5s4FKfrF$8Nszd-ddX^y|qtyWh@vd*Yq(yOwc}@kj4D?>~P?|2XI4$xr5=u1)w( z{Pj8Ei`19Gui9T5zqx#SFv*#moO}VviEZ3&>ulIUZ{|yPZ75d~;^|<&L=Fw+>78 zm890@UAg!8U1^=D^U1hRNPJp;neb}YpYP39`GzL!C^%7nt^2PJN)QqWxRns|BqfP9 z5woC9oGAe~h|-vaHcZaO!W>-kY4kfNr30et_$$Cq#Qn#-2M+>&5&Q!|qmUgdISGV3y!@8{T zoY{#~+POy8`R?{qB*>CoW2@0=5H1gOFFCvKu~t^*)BE@>%N?5AH)!>9!w|>a&R zmf1<#irtlU;AZiMIV(DYL;|Vm(foTE7!5rB`aX_g=uwTz;o*a;FFNG5k`#^i9*y;R ztZWuxF|R%EaGvU1;d_&;uB{Kx-_7v*@bYZm*1^LU!kYwjy*VXUEgo;$CXw*CjF)|u zF(ef{2~FO8XNZ+{0L;6~qBX!xrOvKS(POKaR~N4;X&1opPLJx-=h?i_v>~Y{4xNqz zD1O3>hdB?E1gJ@91ea7tQ_D^rVc+Oo8fP zP*Y=O>9FTR<5@*B-MdCsZusMTJ^kMExtzML5r^lLziO3t_P=DUY&>ImZFSkB98S~8 z{_J&plB!BPvF}s`KjIo)=rv-LFtM^tZ}oFYeRuw;zKlJbo;@c`ZjH;%SKDkbR=PBy z;={71n)5?ey|dk`JMT(H*OSf6r-fIf9<2?uMhbK9B*lx0+ppD~s=73~KHs7-Wd`ru z)!Rq2{)(hWT#wB@pZRX|L66>C-TPx9e@;T%H+DZ=;2+e^R@pH4;!0vpckPa@r1pC~ zAG*d~Rnl_iw3?_}R~|uJjxt@_AMR1=_4GQmUb*)T>jg(|M&zf?f+eX|b30I_tJ!REEywwE5Xw!_rO$Gt*eIK+xHD<8 z?Ok!_%qzC3xp97-me1=YtGVh`F%K79uPD24V`cS~&vYW~#hyJ6Z_2bgjqV?dh*PgZ zeK?lXsps;1N!Lxv8^VbNOXi=TFAofS9zbtpzlgkla(rIEgRxf$TXMhYdM0%#hnzF& z963*Ed5RkxJ`m12eDn^5a%bYNvaG_>%XGG%k9XgKL$a&QUZTD{msLFzIdLteLwNk$ z`(D`-WAFSYA-Cs8E53XVoP=uLsrpSkthsaN57Xt#&vfGY9n6GHardA4^?Tj>7UkOX zT)XPgDW5CP>Nw-`EjQ~%q_Ss4@Xy4s-#?s~&E@Re-%XZYx4L(9^O>s0DWi!xs@D&{ z&kb03jrUn6=~Y67|D4(Mw2NjHv;or&$opB;$_dG9XD6Y)>w#zH?LB&L-rjD*xB92g z)T?&)khUF(KX|17uQ~M}Hi!7GyL)P5@4OkuJfh{TmTkJcKfub(NusVh@LFKB)fm11 z;x}zOBfE@?_2k#0h1DxpyKpNf`jfM67aSUG9IdNc(f{YA>c*r%C zt6#YG>EPR=4!SR+$fOL9ELa`?FmH@`@ZqPCG%tQx)&zmBQ+}_mQc^WuIeg63=)>lb zXXU#`4!fw>VDEMNA_D`vC1YN`e{p7F#7M(w;k7rRN=lH@-K6&DiNiNn`c@OSF1dSg z-jyRV^%@zbbr%oTM6V18l zN1lm(e4%z*XqOJkFX&6(PNXZQ@9bTvyWzwOx=96pd9@|YV^{u+ia8R1;I+Aj+zy2u@n1KkIisP9_?Ve zBz*R}RW%7&kZ(nV$XDTUHG*`ciR2 z%?rc}#HnE3qrn#+?nNZDEn9PcUy%PvcAbDzw<)Oh^X(6x^>LGs@$0k8-F9AjUcIF$ z_F(4CKVDoqv#nv{%}K~I|7+33@tZz+J7z7Lt&!iK5n-rhh~C#=QIZ+Zuq9!PxZ${7 zNt;(>WxlabyNe7KgXfP-9IA|c@L;#=j`;`oji|ow`b#pK85utuAgb*f>Hgfb zx$+DxNpV@#z{1dWx5uv@I>(zObUeHR=_Sp5eq^DD-MFKJx#vM(&*^HboEMkh^$!NT zc$fWVMeV@pf=B4CHEZvFCRAKAo_%;XSP-A@+mey%gu29&_;_)${pG~in&VO`hHw6C zS`rhnwEErvWl0SC)VrgHKV|G2F{U1^*pENR`C61~ufJK?m-Ru4LGOMymQem8V(EKg zluA&HK0wHCMEy&tQqJM;Eyy8k-L+c$H_NfGbHOf$;Uo^~5{ z3-_+M@MRrm-K&+acb%i%n)@bbP0^$A*v1z(ueD;y+sJXgPciZBS7)2_^~Z5HUEFfW z?Z}BYOCOEjT{FHzzqHNcddn8K{p5)*N&kR&MP{eWx2QW0M=rj#T6Lax-{SseU+q0- zv|rNMo7rkyCfn5N(V4jcE1fRV_kWv_^ilJ8#`xZf-5W2nX9x$GyE#WbC|3u>(BDRc zp706?h%b|I`4j(Q3t^F>^~l(}=bY>OWh;8`lk{)3Htz5nh&8>vva0%g)w{8{qpLnB zF9^JGgY&YazMa29r=sdsn$bMb{Z39oS)Y~fnJ&Ig`&atAq+45Z@(NOq9&|aFmz&F6 z@1s_BaY6S6`D%mnukH2d;p6%jlfG^8p5Z2ZS$5Mb-?;I`j`=5MjT~HnPXkgx}bus-Hd%7E6969>-gI>eNILj@W zy$8L_UPLx*RM>nw_uY}vgrvS3w=KD|Ubj|vueBErtqZQW+GOK336VmN*FQWvo+M&V zLNf2})s&YV+Hy!gY<b?mEVtnb*WGyKQh%>22miZ*2X+;t~6_eDsUU$|!0 zmGpEH%0Ii8uVS(CZ73$ErRDwkOLyqo9G=gAfA-O>zN8A#{_&FjJ@-yW#$WA^unJwi zqvpe?GruOlGccbr2la9M(YkavL=mtd`+jyb0>(r_F$BZ@?j|9rEEezwt8*Osv z6`H;6IlG|J|Gd|dQxD&7s$AdauX(8i@oaB@Xxo=3``x!#U#hrzaYJQ(&gMs7uQYwS zRr%%5(VmJ!hju)ESl}gF9vl{T(WzL~lsmC@LE(1hvb@;)tgM9|PyP3I`hDn5I=(5^ zOeOSenc1BFwO^aa?xhFG<14r5#9M9e;C;oV?ooL6V4^3o>Y_`(@5!RoYi3&vG?GjTE{nrbx=IeWXGK`q@RZwVZ?wWPYf= z&rn|WuKm7litM_V1xec`=8tO_GwpXX)vM|%t4#)MHp%4%JpX{Ge^~c)tY%C|y3fnN z=Un?1|L4flq_;^np>)3+T6)#S%V+P(QrP|A;f$B(HhI4g=0DJhKtxRM8R|1y~+k#!}@iJxa&e89iY#P)U} zZ8l|A8X*I_UVnbnsdi{b*F^KCBd-#Ox7BZ{<{vFv@cCq~anfYR(Eagk%V)l*%^5%} zt}$4#^KR+qP5NydheJtj2jlChimGF4_PoFNwC)A@;3}6%=xpRC&y{;xO$GTYU)VoR z5*a5w?UY8Hn9-4n$~ZAAW?$F0^uMI{Iu&gyO4>JIKuw%^O8z)peX59HDW(N&URreb2cM zN4(A+8F%Zi!E@&*{rTsN8(w)2F8kiU)_XrI>PgLotDM3WN85@lms`F_>XaTT2#x#} z9e3Hj&TP>FZ*%wisF<&zo7Rn(#lPrN>pxaNo@l!_k#X{bZXfE%2Ln&ar3SO8nD_VY z9P2-Ru`}?APwdnAdz6n#*G@wH+CJ#KgAocvEv*S9?9;d7zvZl4b@5ZJoLyt~*A9cG zjB}1}B6ok8c!+(%w9hxbaLjEt^o+SX_}zuQ?LD3AR($vi6MpNa1)`( zP`lsrb!YCMnS|Dqn{>_I>$W?hNxAXboKM2qCwIDI6vi|ZF81~mXPO7u(w=SP`G4zIiC$sf5xUf}cgv>-zA z=I)LDdhBM--uOF_Z=Ov;(tC0!?A=8H>q-hXCf%RVTQRW``)7#CD`WAl}u!i zWF&Ge@!5*I%T^UF$i8mQ9pUiDO$&x^2saX+xi%%0zW40ia%Ak!+~@k^N&25lckH-0 z@J2VugJHzUx@*m%&O83Wb3vUeN$*Ws)8_)#B*bvdTEM5O~uPSlkaxC_-am?}g7M~WIKlHyXA-r|#aOqX)qw=Eo z&c5A)ddKG+7?FJ*bK+a0>ez(i(9PBF*r-nn)%Je*qSP%~Eg5Bb@IklLaLksBqcMwC zj~_YQV^LD~vbFN8Kxra)Xi356gw42qDe9`W(D!?+lLodFyPJPaGY5;5qZ97o>qs9L zpCe7)pM0@6@#o>Wk)8o$ZtLVGAtAQZ$!Z7+gqo|lYWj`@ClwG<4T*-Zwya3_437&= ze?m9lNlb1mGg=L421&yww+0qQ25QLVkSx)ZXl87vV*oBSESe0gQmC!#jlHG zE)@>=p9#(P4N`m~uOP17Qk?e${8a?MseJ=kUNkt;UmX|Ai-XSr!KpX|dBnte(IO++ zVhkt10FxWXfiqwjzLVI|@be6DSufUl7{ito3zvbjr)V;x-KiX=x4j>Hra4vFQ~{6Z z$jA^cW^5d9H7y(*o2(X1l}U=GFCs%Y-Nq}j6n70))B;Z5eoIxO^Li_ds}l(%Iw@c%B| zGlm^2PWM>Pw)Xsi4PoM$^w`K~J8CQyZh@Fdk5G@8AEN?>VPtTJ*@j%1AyZ`jQLQ&{ zBl&mLdePZa=^oK^Yk!!6_)?@tNAi5bnBe7t5eiNue{`P$oZ$(0vW<+5jpVQ+xuM^S z$o!n7 z5z~a-1%QJA1c43Ee{+dlNB$4wiTgrYT=#c5 zL|Oy61i$b7HXnw>jv-V1s0u%#>cF3=Hp7n)svP*@Yz2TdIE;;kSYVc5L0l*l%o)+3 zO)PNt1ak)$iUI$a5F4U`ztJGo1I#RJXam4!ijQ--0GAHZoy52>6?ndZbMc@gJoE4X zJ`)`K!qj2`9X7~eis@1T9eA`O!0(^eFKIBJFu#AlenFVd_&G5_+&DHoe*$FyNzx+Y zxQv*8%nS5b*u6rmL||c>9XzPJk|W7sS@GscJQDsIf*>OqV1 z0L_`;CnbJxviqejsnF=iINslqBqM?E2y1#)w)cXmuNJ2P8uHY**vM5(E;E`M3wyIb zkoN}O52b>cLWWb|94C(Wy#D`m`%!Vx?7yidap(U%#VscE@9ImE%8vD>hW-spfzD*J zy@3;rQ;egxo9mAWQu;^o-;ia(BBM9juvwu$dTPd0;~jq_gAR~lO!5f=wCWlX^Ot>s_6_+1agn$!hJ0h8_5HTKZg11jEG@_sq|i*rd?kjbBpWM+;UO%Z<-|@)kXkqV41UMJ&mDjRzzNS9 zf`D6?3OJ1U?FRPS4eYlY*l#y5Ffsgg1N-d;_S+5Yw;R}RH?ZGsV87kKe!GGFb_4sT zr`K;cFtI1vZ#S^tZeYLNz<#@d{dNQU?FRPS4eYlY*l#zm-)>;P-N1gkf&F#^`|Sqy zf6onU>daFeoN7W48T`Z_Yt4XcAO>(rpotw0Jizzmk-*6y61Ww>5D%cu`fo7s5DBwZ75L@rE!T5+9A+#P zzn;V9##pYm(hw831TdVeuYnh%#70?TNMtmJ3Rq)t zsG&^#a2_)h?k}FDxN6|*036b+G}gqi=n>v54ij$%2OgTj0QIp#Ho$Dc{1E|vAU=ti zm_ImLk*)#wYw!y(<`2|=(-gQyH!#2%zz6OJ+JBCguW^apK0rQb7z3xD2RLkHunGnwi+xnHks` znj0DsP0fi!3q$aEInl`0$iSFnZfa)xqwJKo4VC@>sa_yuppRo&v25mdfwN)9euvmB zcm!LrsoYS&jqZ216pa=C&Ovp#J}g>n7APu)rl{!uLK}cFakOyYwfCL8Ej4tyq7}e> z^`9iB@?jD`%Yi-tz2wM>0q%$!zL)l5MorVfi>1PnN{78Vtu$h&@l1xs_e9qJsBfnT zCIBzQ|2T-I&|)G(ViTy*Oq)>f-ha%1KfQqe5kl(+WArf4!>|zPYv_ZPi2HA0Q3GD|um?dFwdU{^*eHQ(F``rV-d*F8u{O*C@J@C5+{$J{Wp9UV23zilMz~uDcX2=xB^=ff^p&d->;vs6#sqx-?9Jk zBs&!w5dnW3@I5vn0z|(A@e_fkA24qXVEB7nMLQSZFJvsTg zcyjXVaZtwt2x?~kj7bN=w-|w#mh3pXxGea*3f$$GT(TFqF9LiXVaC|Q@KQk7l|i)w zyh6qR?qx9T?7ycMhOiu*01UfdUkQnJfHxgL{6}O9E7r+-3I`d@WxK=g6Q-%ajdWiP zU_79+o)>HD31Cnb=^PX91=ED1-HwJ+ojt%EycdLWM5GIh1KN)?+!*E!`TznSYajqj z0*>2|GJvl@F5r_1_~VIaaOVQrp3o}D7JQ7t11a!FUM%pB4SxTc4u5D70wU+ZpKbg? z#ei=xXz*;B65gQO;Dte_K@o`l^_;nWwOjnh@O3|PQ=-?g=y&$M0v~?BJiztAbf;>= z11_jy&fr~?LBQwK(+^%Ee&PKmzwBvVr#@BtK{EvU@=so&nD~#OmOtx*IbrT_e?LtD z-uH=tB0xD76c1oFc!EDYfj>ln`TV8b(`9~g0^`G+PxtWc*hcUA#GmzbN;Cv^$X!eP zFIvwK*F}Pcrr*%7EsFd}2XgqnFGc@Z*RS>dg83^2=J${Je)Nzhh#hMSaHr~J}MQQN}FpS5Av{_?Y}_n&Mw`X#AshWMV4X6bg+75wIkrQ7F!Iz$+W{8o;q+RC2aqQOzstrMAI^wm45(^lPI< z#-tSG952mc`so&_n0AvPyKS?*b3tq^l{t$|?NygBV##K2j-R=#rQI?7cKg1P+P|~x z@Jr;YUjtwLjpzTs^4|kgy*zt5?xiRwH89FojeJi;DI<&wRjH9HhN_0Dd~p%DctRI0 zj+GpgN-@V(5=NctQiIZ)khM`h)% zht%b11!~F};Ya2ys!N}j9+c8~JXJv?ujao@Akl=2cao1AZnXFeh`h;&t2($wXip z>n^n_lo3=*qcmNT`=xzan~_zY1_R=IiaJr)J}N(%Q)XULm-FWinm|B!S*T4B7^hv; z4sWQcGWY3|LiP?sIk)!|cjczay5qw0E`@gydPFQ1P88%ye#qmm!kQ0N#fq?_{+4-H z?{<^+@Z&^59oQzUi7UCM^fE?>=BXc3&<@+}F*4|4H&nIFRXS`eRjbcWlos3)@zB$a-HqYhf)pEWWk4N!XYI?5f;}m66#ni>vmQ-cuL3{1xbom-}TgOYS$g5eSwS9|aaT-mJtJ2R! zxS|i1PzI#6qIWEoRes7Vjh>;FPRUJFM_Z>D)C9O5$gcqbd|Eq2%C$pjADXLn`|B^> zhV1QR8}rXH90LMwB;-}<1OlTH1n%_{9XfK|bQJ=Ug1h=hwp=*^>zr4EB zo@lo6cprAzjx<>}!Xg!2y#BGE>c#sQxk5)tO*dw%XK&Y{!Br;bA~IA1`CIe7Pu9FK zR?%h6#a*pC;7>~2v>5a$Y+S}U!Lmi|Ek9J_I>}lp!lRVU7=d9`)bC#^Enn&5XC62-h zC(*jeyD!h4iF>gdD`=^r2}D8Z4MX5=&JTh`Nl?hI@u~5p`g$SjQYp<JNqq;N>`0Q*Elo^*66J2UZexNZ53z3b5 zZ)M!o zdwK>PiE6I-6O6%H!Zq%u$8!6jlU)OHd#cnAYj-ad8u#k!rpZ$5FQFBz^Mf@SeAPMW z?ptH8DC;=RF*kSldHqoy=INb?TzkM!p`T}wWnnElqQrAYdaDV*UJtlb;xLy?Nq@f z(i1%^CGB;06GjHeg3CC+wS{D-$7RliCu<9fWS99aR++i2uv=H2X@?5bVjrO8r{s$$ zL^?}d33qZVOEYW6WZTQ;kn4>ffI#5lh`uy1&36$7h(4KwQE~;X3QUh+;)JydJhu}@ z30-KQc~pIAK%!a%OTY-JOK&Q}MI^$4m5Gbj;Q+;<9VMcC8uSeYM1aa@+2Mt)OP5{G z4tyP1;zaU{oYC|;Fy(r5X~&}@775BEOk4@0=}nm0L{L|0rN<+QIv}=b)uljI z%!`hvHwnYOk)FfSwA+fp{TQ^D(-4tBRq|)=qUo-qLki*=9dTNfi}qm2wp0g|CxbShpm3^=3HLJaZ_;So*xxAV|3P)kS=Ab=^Wply0^(dyO9%68e>+kln zIckI(XkGxpU-zsEM?(G4qw~C!DHOO>rZV(_9Ii5n!1?POa8Sd`)t2CDi9d`DDcoXs2ShA8mCVTT|2fy@WVc$tV#a>*9+6+RBetaevu>Ry}zbJ>w0Iad{$aiV4;?O zj=eED%DK4cS(c`BA?G>JT?R@lN!$BgAh_FKrtaq}2_x`)3WhVkJRKgkVr}CG^h`Ne zl-0U}Nj1(OFKhq^R|{CeRg%vDthx@cgllW5qKd_2l%$-g9d8WARl{!WcnOnq%0f_v zU#(tAuJkq^^vTq5UpC;=NOvAi4NA%D0RoYhiES*@CD~DH&4==9eAPUG z(bpQEhJ5p~gUVlTo1P=^73a+K*BjDKSN6gP>~YsiG;lmaO4}O|w!_+>SG#DonsV(4 zOJ8XlY4`aS%V;lGsPwkK7HY38E5wllH2f)x7iO36j}I`)ZyRItU@q0Ca7b8> znF|KFJFJ#P)r6Lh9yJFsz5Dj2N{8&*mQ$u&eLaF4fz;=mILY*TiRI+5hreol2tbXQ9ce{LRjeG(_hUwgPEn7%c zoTc$cK{3PGwn9(RrQB6ICNkCgdJA7himkU=wOtm zR4eUsG749o4KjLiJU0 zdj%{YKYk;yS#VL!sbvkGVqG@ilev^qHrJ(bIDC}Mx)grDB|i-eOJfIgREq$GT~?+I z7JJEn7w=Y`@?`8VsCXC2Uo%Rj6c||2@!G;n!eA;GvwG&e9AJ?>PY1dv)83`}n29T} z82lRKJiCB-Q2@(cO#m3!etolH(@njn3aGkfnsZYhE`kl$(7a<4P`5Kd@m-glJKYK0 zZnp^|z8F>W(jI;zm?o+`8~D{VkGq!Vs7cCFqEvJ#Wj#KJUA1{CK<9XL5?z{trQ@+? zfii40PbJfFf%O@gL&jy^0k$WWro*%HNAL2xYNjIIvCHg~R}RR76h=RC9;l%H1{+g$ z)1au9?QCPWup8e>cGu<}3%0#VP4(7ftD_zEwGvDBtnKkRk=ULn_b9-HyHg<1_MnM^qM}dCi?pnM0!{cZ(V(g- zk-YkdvV28%qQCjEv1FfpuUjQNubP+A8QX9TEQRK(!>=(f4-?6kXXanJnsZXYMu+c; z<>$MyIGa}7R}Bqc>flQBVrP-8X?`6$%Or&7qXjsYtfKi!OjwhW<|Jfa`$7Ho+<9E^*~V8uE1O&OXa|oOieRc8}aXiAzf(_PsXUS*%efo2{9Z zPB1RB&X27)j?%O?)J~ebH)eb*<5akKxik|jn{ekaT~1;v;y9T7$;Z>{oQDL@;pNda zV3&Y38CbV~$(NsrP6!0KV2u<7^HHVdIjR+p@!_Wf)8BQC8?6AWw}4IoB9V!X*NVV^ zDHn`>0W4g8We-yoV2uLSS_KS0^PyIb0e?N2Yp)=p2vl8mi6~W3v>s9JD$sN=!o?C6 z6i62^UYVB|`u;xd74zvgs z0%O`^R69yV`M^RT^BHzjnRuL@xi)BGb3w3gY^%;Hq^zIEykxy+d(;IDMHjZo5`g`s zRj-sz5ol8SfeM3{g%T!#o_is&Kc`I3rwn;==Yg}z!F;|KO7oN+q>@v5XOZw>M0!;jw$>NBG%7XyULe^YZD8mv zuq$1&0IeC7i%TF3RdruO1_ofYjRp}u1(zMetQ3s-pN5@lh1!0%hJn>?3TM&7XIe$u zU=mNea#$Pbj`cFcl9Y2+JYB)n`?}iwb4e*5!DQsqm7T85G<1x>=E+Dp8u)wV0OLYe zH`~2X*SI#*kDo(0&0wI-LY7u_fbQyMZGh_w$prfP9TxA ze&)j{H-VH!(dj5AH*k$hhA*;eiM&qZkjDruzo8owVBe2aB34NPwHl=|vq6_PGv};V zqD)C3@d@J$La}CmakAWXPbt}F|6E3coJ=6m=PFiLv}Om>c0)Wp4fmfl!MzKjIJJctNX0IkXw7|7(Fie9j? z3XBK)PGBJg4|`yC^S!~gnAjF+YsOV#MhPQ>V8-<$Uqb>#(FM$w{-p#}QBcOrHjyq( z(3}rj+&w@V;&_A(p(5BmQzM^~jo3&9n*o&`gXw*MoGan3IlRdR8~@ch4Fi;Tbq<*G zfj;Qc0z(rWMkUqwZVI-qPxm=Q7?q>6wDvC->y(uHxaK0RSnBL84-SE0>gUlN=*3av z1UXY(s`0aFKw^O%b74KddV6gY$s5Q3`HGi@0JW&K*g#TOzPjjM%N%n#iQ)q-RUJrG z75*v#s4rf}9atw|pD&)^;@7(aZ2JMNNEib<1hT$LTXA87wT*>*Ags#<>%s;|!Bm&n zem15JCvprgEIQ{YR;pkcxJOGRhsRz&?VGs~!;lWa6y-E%o7Nvu4G3#Z<(vvYYjnL8 z;OdtaYICke%CR`7d{qN@(eWz2yEdZw5lizr9qiTp zfC;xNP_AlyKhhT~&~z42=2aJM)=t)uS%~B19F)_ldnCX(k0*K#FP6|9=T((A4cZpw zVg$bCxb@*ff{-$8&(N!dl_8fMJ>px7><`MK%{DR$%jf8%NV`nmQw+tJv!q4o%xg8Zc=Q-ES zSribcFqc+WfK{wck4$TGi@TcDrLG5FZy(lN&a){E@^VQTX349Ouc`WSd5Zk4rvg3O z`pU4D4gB@JzJmKR^Q?Qc3EL8PIoGnXgf?rVX@rMSzLQ;J-as+L6J9p(Yg|@gO~4?>aSJORV5=VI zanW4(jYnXcFkruD6w@YN7lA#fieO(gLOl{Br#FF2HJ*-NFRVb|Jt?u~sB_hd*9Q6k z3)|Z@^=h8AyD>vR#(c`R7TpsC1!_lKa+Ifn8J%*1&Dj-!l+9Fj^Gfu9cbh$j41lq_ zgO=4r2ujYVaRIinXBXI|dSvhOIPYFFu8?5`lT%DNZQ;m)@C_Yez1^d+YQKX%~mapSZG{b_y0;-Bi+I7h(9^>l^k^C1m zHXN%<*X=nSiCvaRuJqyzrPTnNCTOeXL!j%5u6Ush*_;c6@)1sUsqnn>unRXt

    lR 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 z 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�~ea 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

      2f{+uqxOX|Ey+H% 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 must login with an administrator account to view this page.

      - - + +
      - - + +
      + +
      +

      Hello <%= name %>

      + +
      \ No newline at end of file diff --git a/views/info.ejs b/views/info.ejs new file mode 100644 index 0000000..23b7ec1 --- /dev/null +++ b/views/info.ejs @@ -0,0 +1,267 @@ + + + + + + + + + + + Info - {{name}} + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + +
      + +
      +
      +
      +
      +
      +

      {{name}}

      +
      +

      {{desc}}

      +

      {{nick}}

      + + Show On Map +
      + +
      + +
      +
      +
      +
      +
      + + +
      +
      +

      Comments:

      +
      +

      No comments found. Be the first to leave a comment!

      +
      +
      + + + +
      Post a Comment:
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      +
      +
      + +
      + +
      Add an Image:
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + + + + +
      + +
      + +
      + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/layout.ejs b/views/layout.ejs new file mode 100644 index 0000000..9cda9a5 --- /dev/null +++ b/views/layout.ejs @@ -0,0 +1,55 @@ + + + + + + + + + + + Info - {{name}} + + + + + + + + + + + + + + + + + <%- style %> + + + + + + + + +
      +
      + <%- body %> + + + + + + + + + \ No newline at end of file diff --git a/views/layout2.ejs b/views/layout2.ejs new file mode 100644 index 0000000..95a5f6c --- /dev/null +++ b/views/layout2.ejs @@ -0,0 +1,103 @@ + + + + + + + + + + + Info - {{name}} + + + + + + + + + + + + + + + + + <%- style %> + + + + + + + + + + + +
      +
      + <%- body %> +
      + + + + + + + + + + + + \ No newline at end of file diff --git a/views/login.ejs b/views/login.ejs new file mode 100644 index 0000000..9fc8376 --- /dev/null +++ b/views/login.ejs @@ -0,0 +1,30 @@ + + +
      +
      +

      You must login with an administrator account to view this page.

      + +
      + <% include ./partials/messages %> +
      +
      + + +
      +
      + + +
      + + +
      + +
      +
      +

      Don't have an account?

      Request admin access. +
      +
      + +
      \ No newline at end of file diff --git a/views/map.ejs b/views/map.ejs new file mode 100644 index 0000000..ca34393 --- /dev/null +++ b/views/map.ejs @@ -0,0 +1,138 @@ + + + + + + + + + + + RPI Campus Map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      + +

      This is where the map goes... lol

      +
      +
      + + + + + + + + + + + + + + + + + + + + + diff --git a/views/notfound.ejs b/views/notfound.ejs new file mode 100644 index 0000000..2f14482 --- /dev/null +++ b/views/notfound.ejs @@ -0,0 +1,107 @@ + + + + + + + + + + + Page Not Found + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +

      We couldn't find the page you were looking for 😢

      + +

      The URL may have been mistyped or the page may have moved:

      +
        +
      • Please try navigating back to the homepage to find what you are looking for.
      • +
      • Alternatively you can contact us here.
      • +
      +
      +
      + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/offline.ejs b/views/offline.ejs new file mode 100644 index 0000000..2473a51 --- /dev/null +++ b/views/offline.ejs @@ -0,0 +1,103 @@ + + + + + + + + + + + Page Not Found + + + + + + + + + + + + + + + + + + + + + + +
      +
      +

      Sorry, this app doesn't work offline yet 😢

      + +

      Please try reconnecting to the internet before trying to access this app.

      +
      +
      + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/partials/messages.ejs b/views/partials/messages.ejs new file mode 100644 index 0000000..19df2f1 --- /dev/null +++ b/views/partials/messages.ejs @@ -0,0 +1,37 @@ +<% if(typeof errors != 'undefined') {%> + <% errors.forEach(function(error) { %> + + <% }); %> +<% } %> + +<% if(success_msg != '') { %> + +<% } %> + +<% if(error_msg != '') { %> + +<% } %> + +<% if(error != '') { %> + +<% } %> \ No newline at end of file diff --git a/views/register.ejs b/views/register.ejs new file mode 100644 index 0000000..c80d552 --- /dev/null +++ b/views/register.ejs @@ -0,0 +1,40 @@ + + +
      +
      + +

      Sign up to request access to an administrator account.

      +
      + <% include ./partials/messages %> +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      + + +
      + +
      +
      + +
      \ No newline at end of file diff --git a/views/searchResults.ejs b/views/searchResults.ejs new file mode 100644 index 0000000..ad3b094 --- /dev/null +++ b/views/searchResults.ejs @@ -0,0 +1,135 @@ + + + + + + + + + + + Search Results - "{{params.query}}" + + + + + + + + + + + + + + + + + + + +
      + + + + + +
      + +
      + + + + + + + + + + \ No newline at end of file diff --git a/views/welcome.ejs b/views/welcome.ejs new file mode 100644 index 0000000..702d6d7 --- /dev/null +++ b/views/welcome.ejs @@ -0,0 +1,18 @@ + + + +
      +
      + +
      +
      +
      +
      +

      Login, Register or Continue as Guest

      + Register + Login + Continue as guest +
      +
      +
      +
      \ No newline at end of file From a8df5cdc4b8c974547ec8a24d745fcf11d499aed Mon Sep 17 00:00:00 2001 From: Unachieved Date: Fri, 6 Dec 2019 12:01:45 -0500 Subject: [PATCH 42/69] jon_welcome_login_registration_2 --- public/controllers/{app.js => mapApp.js} | 0 public/mapApp.js | 20 +++ public/mapController.js | 47 ++++++ public/style/homepage.css | 10 +- public/style/layout2.css | 3 +- public/views/index.html | 20 ++- routes/index.js | 2 +- routes/infoController.js | 39 +++++ routes/machine_sites.js | 201 +++++++++++++++++++++++ routes/mapApp.js | 20 +++ routes/mapController.js | 47 ++++++ routes/user.js | 7 +- views/layout.ejs | 4 +- views/layout2.ejs | 12 +- views/map.ejs | 150 +++-------------- 15 files changed, 435 insertions(+), 147 deletions(-) rename public/controllers/{app.js => mapApp.js} (100%) create mode 100644 public/mapApp.js create mode 100644 public/mapController.js create mode 100644 routes/infoController.js create mode 100644 routes/machine_sites.js create mode 100644 routes/mapApp.js create mode 100644 routes/mapController.js diff --git a/public/controllers/app.js b/public/controllers/mapApp.js similarity index 100% rename from public/controllers/app.js rename to public/controllers/mapApp.js diff --git a/public/mapApp.js b/public/mapApp.js new file mode 100644 index 0000000..9c9c8ba --- /dev/null +++ b/public/mapApp.js @@ -0,0 +1,20 @@ +const app = angular.module('CampusMap', []); + +let getParams = function() { + let params = {}; + let url = window.location + ''; + let queryString = url.split('?'); + + if (queryString.length == 1) { + console.log("no queries given"); + return null; + } + paramString = queryString[1].split('&'); + let param; + for (let i = 0; i < paramString.length; i++) { + param = paramString[i].split('='); + params[param[0]] = param[1]; + } + console.log(params); + return params; +} diff --git a/public/mapController.js b/public/mapController.js new file mode 100644 index 0000000..b302fa6 --- /dev/null +++ b/public/mapController.js @@ -0,0 +1,47 @@ +app.controller('mapController', function($scope, $http) { + console.log("mapController activated!"); + + const parameters = getParams(); + console.log(parameters); + const location = parameters.loc; + $scope.isMachine = parameters.machine; + + if (parameters != null) { + $http.post(`/index?loc=${location}`, {query: location, machine: $scope.isMachine}) + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); + + $scope.name = httpResponse.data[0].properties.name; + $scope.nick = `Nicknames: ${httpResponse.data[0].properties.nick}`; + $scope.desc = httpResponse.data[0].properties.description; + + let latitude = httpResponse.data[0].geometry.coordinates[1]; + let longitude = httpResponse.data[0].geometry.coordinates[0]; + + let newPopupContent = ''; + if (httpResponse.data[0].properties.type == "machine") { + newPopupContent += `` + } + else { + console.log(httpResponse.data[0].properties.type); + newPopupContent += ``; + } + newPopupContent += ` + \ + \ + `; + + mymap.setView([latitude, longitude], 19); + let marker = L.marker([latitude, longitude]); + marker.addTo(mymap).bindPopup(newPopupContent).openPopup(); + // mymap.on('click', marker.remove()); + + }); + } + +}); diff --git a/public/style/homepage.css b/public/style/homepage.css index 7bfc90a..25d940f 100644 --- a/public/style/homepage.css +++ b/public/style/homepage.css @@ -1,6 +1,7 @@ body { background-color: #000000; height: 100%; + width: 100%; margin: 0; padding: 0; } @@ -31,9 +32,12 @@ footer a { /* Always set the map height explicitly to define the size of the div * element that contains the map. */ -#divContent{ - height: 100%; - position: flex; +div.divContent{ + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; } .fill{ diff --git a/public/style/layout2.css b/public/style/layout2.css index b6cc33f..0fadb0b 100644 --- a/public/style/layout2.css +++ b/public/style/layout2.css @@ -7,11 +7,12 @@ html, body { } -.wrapper{ +div.wrapper{ /*this is the height of the footer and header minus the total file length) so that all remaining space% is given to the body --- this keeps the footer at the bottom of the page*/ min-height: calc(100% - 140px); + position: relative; } #footerText{ diff --git a/public/views/index.html b/public/views/index.html index 1639dd6..d509ca9 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -66,9 +66,13 @@ -
      - -

      This is where the map goes... lol

      +
      +
      +
      + +

      This is where the map goes... lol

      +
      +
      @@ -91,11 +95,11 @@ - - - - - + + + + + diff --git a/routes/index.js b/routes/index.js index 48ad79a..0db4489 100644 --- a/routes/index.js +++ b/routes/index.js @@ -3,7 +3,7 @@ const router = express.Router(); var path = require("path"); const {ensureAuthenticated} = require('../config/auth'); -router.get('/', (req, res) => res.render('welcome', {layout: "layout.ejs", extractStyles: true})); +router.get('/', (req, res) => res.render('welcome', {page_name: "Welcome", layout: "layout.ejs", extractStyles: true})); router.get('/admin', ensureAuthenticated, (req, res) => res.render('admin', { diff --git a/routes/infoController.js b/routes/infoController.js new file mode 100644 index 0000000..4775195 --- /dev/null +++ b/routes/infoController.js @@ -0,0 +1,39 @@ +mapApp.controller('infoController', function($scope, $http) { + console.log("infoController activated!"); + + const location = getParams(); + console.log(location); + + $http.post(`/info?loc=${location.loc}`, {query: location.loc}) + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); + + $scope.id = location.loc; + $scope.name = httpResponse.data[0].properties.name; + $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; + $scope.desc = httpResponse.data[0].properties.description; + }); + + $scope.comment = function(title, body) { + if (!title || !body) return; + + let data = { + comment: { + title: title, + body: body + } + }; + + console.log(data); + + $http.post(`/info?loc=${location.loc}`, data) + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); + + $scope.cmtTitle = ""; + $scope.cmtBody = ""; + }); + } +}); diff --git a/routes/machine_sites.js b/routes/machine_sites.js new file mode 100644 index 0000000..40ece21 --- /dev/null +++ b/routes/machine_sites.js @@ -0,0 +1,201 @@ +var locations_shops = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "jec_shop", + "properties": { + "name": "JEC Student Machines Shop", + "nick": "Processes Shop", + "thumbnail":"https://www.rpiviews.com/images/rpi/card00188_fr.jpg", + "description": "Machine Shop located in JEC", + "popupContent": "JEC Student Machines Shop", + "type": "machine" + }, + "geometry": { + "type": "Point", + "coordinates": [-73.680042, 42.729716] + }, + "room": { + "hours": { + "mon":"9 a.m.-noon and 2-8 p.m.", + "tues":"9 a.m.—noon and 1-7 p.m. ", + "weds": "10 a.m.—1 p.m. and 2-8 p.m.", + "thurs":"9 a.m.—noon and 2-8 p.m.", + "fri":"8-11 a.m. and noon-3 p.m.", + "sat":"11 a.m. -3 p.m.,", + "sun":"2-6 p.m." + }, + "info": "All students who intend to use the machines in this room\n\ + must pass the SOE Safety Test Rensselaer Manufacturing and Prototyping\n\ + Laboratories-Safety Orientation listed on RPI HR Skillport Site. \n\ + They must show proof of taking and passing the class to shop supervisors.\n\ + Afterwards, all students are welcome to use the machines in the JEC Student Machines Shop.\n\ + No prior knowledge of machining is required. However, it is recommended\n\ + that students take Engineering Processes (ENGR 1300).", + "location": "Jonsson Engineering Center (JEC) 1010" + }, + "contents": { + "machines": ["Haas TL 1 CNC Lathe", "Acer 3-Axis CNC Milling Machine", + "Laguna Swift 4’x4’ CNC Router", "Thunder Mars90 100w laser Cutter", + "Snap-on Sandblaster", "General Machining and Fabrication Equipment", + "Metal and Plastic Forming and Shearing Equipment", + "Steel and Plastic Welding Equipment" ], + "available_materials": "", + "equipment": "" + } + }, + { + "type": "Feature", + "id": "ied_shop", + "properties": { + "name": "Design Lab/IED Shop", + "nick": "IED Shop", + "thumbnail": "", + "description": "Machine Shop located in JEC", + "popupContent": "Design Lab/IED Shop", + "type": "machine" + }, + "geometry": { + "type": "Point", + "coordinates": [-73.68053,42.729704] + }, + "room": { + "hours": { + "mon":"9 am - 4 pm and 5-9 pm", + "tues":"9 am - 4 pm and 5-9 pm", + "weds":"9 am - 4 pm and 5-9 pm", + "thurs":"9 am - 4 pm and 5-9 pm", + "fri":"9 am - 4 pm and 5-7 pm", + "sat":"", + "sun":"" + }, + "info": "All students who intend to use the machines in this room\n\ + must pass the SOE Safety Test Rensselaer Manufacturing and Prototyping\n\ + Laboratories-Safety Orientation listed on RPI HR Skillport Site. \n\ + They must show proof of taking and passing the class to shop supervisors.\n\ + Afterwards, usage of machines is determined on case-by-case basis.\n\ + Students are always welcome to see the shop supervisor to discuss their projects.", + "location": "Jonsson Engineering Center (JEC) Room 2332" + }, + "contents": { + "machines": ["Haas CNC Control Simulators", "Haas Mini Mill", "Haas SL 10", + "Haas Super VF 2", "Haas Tool Room Mill", "Mitutoyo Crysta-Plus M574 CMM", + "Paint Booth", "General Machining and Fabrication Equipment", + "Electronic Scopes and Meters"], + "available_materials": "", + "equipment": "" + } + }, + { + "type": "Feature", + "id": "forge_shop", + "properties": { + "name": "Maker Space: The Forge", + "nick": "The Forge", + "thumbnail": "http://manufacturing.eng.rpi.edu/sites/default/files/facilities/Forge.jpg", + "description": "Maker Space located in", + "popupContent": "Design Lab/IED Shop", + "type": "machine" + }, + "geometry": { + "type": "Point", + "coordinates": [-73.678974, 42.729574] + }, + "room": { + "hours": { + "mon":"", + "tues":"", + "weds": "", + "thurs":"", + "fri":"", + "sat":"", + "sun":"" + }, + "info": "The Forge charges $10 per semester for students to gain access to\n\ + all of the machines. Afterwards, students are charged $0.05/gram of filament\n\ + for the 3D Printer and $0.50 per hour of light time for the laser cutter.", + "location": "George M. Low Center for Industrial Innovation (CII) Room 2037" + }, + "contents": { + "machines": ["3D Scanners","Form 1+ 3D Printer","gCreate 3D Printer", + "Laser Cutter","Makerbot Mini","Makerbot Z18’s","Prusa i3’s", + "Sewing Machine","Taz 5","Taz Mini","Taz MOAR-Struder","Taz Quadfusion", + "Vinyl Cutter"], + "available_materials": ["PLA", "ABS", "PETG"], + "equipment": "" + } + }, + { + "type": "Feature", + "id": "mill_shop", + "properties": { + "name": "Manufacturing Innovation Learning Laboratory", + "nick": "The MILL", + "thumbnail":"", + "description": "Manufacturing/maching shop located in the CII.", + "popupContent": "Manufacturing Innovation Learning Laboratory", + "type": "machine" + }, + "geometry": { + "type": "Point", + "coordinates": [-73.679208, 42.72975] + }, + "room": { + "hours": { + "mon":"", + "tues":"", + "weds": "", + "thurs":"", + "fri":"", + "sat":"", + "sun":"" + }, + "info": "All students who intend to use the machines in this room\n\ + must pass the SOE Safety Test Rensselaer Manufacturing and Prototyping\n\ + Laboratories-Safety Orientation listed on RPI HR Skillport Site. \n\ + They must show proof of taking and passing the class to shop supervisors.\n\ + Afterwards, usage of machines is determined on case-by-case basis.\n\ + Students are always welcome to see the shop supervisor to discuss their projects.", + "location": "George M. Low Center for Industrial Innovation (CII) Room 1027" + }, + "contents": { + "machines": ["Haas VF 1 – CNC Milling Machine", + "Haas OM-2 CNC Milling Machine", + "Moore Nanotechnology Systems 350 UPL Lathe", + "Hurricane Laser Cutter Category 4 Charley 80W", + "Adept Cobra 800 SCARA Robot", + "SONY Conveyor System", + "Staubli RX 90 Robot", + "Fanuc LR Mate, with Vision, Robot Educational Training System", + "Stratasys Dimension FDM Machine", + "Stratasys UPrint FDM Machine", + "Z-Corporation Z310 3D Printer", + "B-9 Creator Stereolithography Printer", + "Phenix Direct Metal Selective Laser Sintering 3D Printer", + "Brown and Sharpe Gage 2000 CMM", + "Faro Platinum Inspection Arm", + "Arburg Allrounder 270c Injection Molder", + "Arburg Allrounder 221k Injection Molder", + "Battenfeld Injection Molder", + "Formech 660 Vacuum Former", + "Flow Mach2 Abrasive Water-Jet Cutter", + "Sonitek S840 Ultrasonic Welder", + "Sonitek TS500 Thermal Press", + "Branson Ultrasonic Welder 2000 D", + "Branson Ultrasonic Welder 2000 DT", + "General Machining Equipment"], + "available_materials": [], + "equipment": "" + } + } + ] +}; + +/* +Locations: +JEC Student Machines Shop +Design Lab/IED Shop +Maker Space: The Forge +Manufacturing Innovation Learning Laboratory +*/ diff --git a/routes/mapApp.js b/routes/mapApp.js new file mode 100644 index 0000000..431122a --- /dev/null +++ b/routes/mapApp.js @@ -0,0 +1,20 @@ +const mapApp = angular.module('CampusMap', []); + +let getParams = function() { + let params = {}; + let url = window.location + ''; + let queryString = url.split('?'); + + if (queryString.length == 1) { + console.log("no queries given"); + return null; + } + paramString = queryString[1].split('&'); + let param; + for (let i = 0; i < paramString.length; i++) { + param = paramString[i].split('='); + params[param[0]] = param[1]; + } + console.log(params); + return params; +} diff --git a/routes/mapController.js b/routes/mapController.js new file mode 100644 index 0000000..ebaea9b --- /dev/null +++ b/routes/mapController.js @@ -0,0 +1,47 @@ +mapApp.controller('mapController', function($scope, $http) { + console.log("mapController activated!"); + + const parameters = getParams(); + console.log(parameters); + const location = parameters.loc; + $scope.isMachine = parameters.machine; + + if (parameters != null) { + $http.post(`/index?loc=${location}`, {query: location, machine: $scope.isMachine}) + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); + + $scope.name = httpResponse.data[0].properties.name; + $scope.nick = `Nicknames: ${httpResponse.data[0].properties.nick}`; + $scope.desc = httpResponse.data[0].properties.description; + + let latitude = httpResponse.data[0].geometry.coordinates[1]; + let longitude = httpResponse.data[0].geometry.coordinates[0]; + + let newPopupContent = ''; + if (httpResponse.data[0].properties.type == "machine") { + newPopupContent += `` + } + else { + console.log(httpResponse.data[0].properties.type); + newPopupContent += ``; + } + newPopupContent += ` + \ + \ + `; + + mymap.setView([latitude, longitude], 19); + let marker = L.marker([latitude, longitude]); + marker.addTo(mymap).bindPopup(newPopupContent).openPopup(); + // mymap.on('click', marker.remove()); + + }); + } + +}); diff --git a/routes/user.js b/routes/user.js index ed3c8a5..4790264 100644 --- a/routes/user.js +++ b/routes/user.js @@ -7,7 +7,7 @@ const passport = require('passport'); const User = require('../models/User'); // login page -router.get('/login', (req, res) => res.render('login',{layout: "layout2.ejs", extractStyles: true})); +router.get('/login', (req, res) => res.render('login',{page_name: "Login",layout: "layout2.ejs", extractStyles: true})); // Login Handle router.post('/login', (req,res,next) => { @@ -26,7 +26,7 @@ router.get('/logout', (req, res) => { }); // registration page -router.get('/register', (req, res) => res.render('register', {layout: "layout2.ejs", extractStyles: true})); +router.get('/register', (req, res) => res.render('register', {page_name: "Register", layout: "layout2.ejs", extractStyles: true})); // Register Handle router.post('/register', (req, res) => { @@ -99,9 +99,8 @@ router.post('/register', (req, res) => { - // main page --- the map -router.get('/main_page', (req, res) => res.render('main_page', {layout: "layout2.ejs", extractStyles: true})); +router.get('/main_page', (req, res) => res.render('map', {layout: "layout2.ejs", extractStyles: true})); diff --git a/views/layout.ejs b/views/layout.ejs index 9cda9a5..3470384 100644 --- a/views/layout.ejs +++ b/views/layout.ejs @@ -8,7 +8,7 @@ - Info - {{name}} + Info - {{page_name}} @@ -40,7 +40,7 @@
      <%- body %> - +
      - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      -
      - -

      This is where the map goes... lol

      + + + + +
      +
      +
      + +

      This is where the map goes... lol

      - - - +
      - - - - - - - - - - +<%- contentFor('map_scripts') %> + + + + - +<%- contentFor('bottom_map_scripts') %> + + + + + + \ No newline at end of file From b0853d144fa32a250361dc849b70a706ea32f017 Mon Sep 17 00:00:00 2001 From: Unachieved Date: Fri, 6 Dec 2019 12:31:29 -0500 Subject: [PATCH 43/69] slight changes --- public/style/searchResults.css | 23 ++++++--- routes/user.js | 89 +++++++++++++++++++++++++++++++++- views/layout2.ejs | 2 +- views/searchResults.ejs | 86 +------------------------------- 4 files changed, 106 insertions(+), 94 deletions(-) diff --git a/public/style/searchResults.css b/public/style/searchResults.css index 6c908bb..3522c41 100644 --- a/public/style/searchResults.css +++ b/public/style/searchResults.css @@ -1,3 +1,20 @@ +body { + background-color: #000000; + height: 100%; + width: 100%; + margin: 0; + padding: 0; +} + +a { + text-decoration: none; +} + +footer a { + text-decoration: underline; + color: inherit; +} + .row { max-width: 100%; } @@ -5,9 +22,3 @@ main { min-height: calc(92vh - 4em); } - -footer { - position: relative; - bottom: 0; - height: 4em; -} diff --git a/routes/user.js b/routes/user.js index 4790264..4edb1a6 100644 --- a/routes/user.js +++ b/routes/user.js @@ -2,6 +2,8 @@ const express = require('express'); const router = express.Router(); const bcrypt = require('bcryptjs'); const passport = require('passport'); +const bodyParser = require('body-parser'); +const jsonParser = bodyParser.json(); // UserModel const User = require('../models/User'); @@ -97,11 +99,94 @@ router.post('/register', (req, res) => { } }); - +router.get('/search', (req, res) => res.render('searchResults', {page_name: "Search", layout: "layout2.ejs", extractStyles: true})); +router.post('/search', jsonParser, function(req, res) { + const query = req.body.query; + console.log("Query:", query); + + MongoClient.connect(uri, options, function(err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/search'!") + let db1 = db.db("rpicampusmap"); + let db2 = db.db("forgemill"); + let results = []; + + // Search the database for locations matching the given regular expression + // Search by name and by nickname for any match of the substring + db1.collection("locations").find({'$or': [ + {'properties.name': {'$regex': query, '$options': 'i'} }, + {'properties.nick': {'$regex': query, '$options': 'i'} } + // add here to look through machines + ]}).toArray() + .then(function(result1) { + console.log("Result1:\n", result1); + results = results.concat(result1); + }) + .catch(function(err) { + if (err) + console.error("ERROR:", err); + }); + + db2.collection("locations").find({'$or': [ + {'properties.name': {'$regex': query, '$options': 'i'} }, + {'properties.nick': {'$regex': query, '$options': 'i'} }, + {'contents.machines': {'$regex': query, '$options': 'i'} } + ]}).toArray() + .then(function(result2) { + console.log("Result2:\n", result2); + results = results.concat(result2); + console.log("Results:\n", results); + res.send(results); + }) + .catch(function(err) { + if (err) + console.error("ERROR:", err); + }); + + db.close(); + } + }); + + }); // main page --- the map router.get('/main_page', (req, res) => res.render('map', {layout: "layout2.ejs", extractStyles: true})); - +router.post('/main_page', jsonParser, function(req, res) { + //get the location to highlight + const query = req.body.query; + const machine = req.body.machine; + console.log(req.body); + console.log("Query:", query); + console.log("Machine:", machine); + + MongoClient.connect(uri, options, function(err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/index'!") + + let dbo = db.db("rpicampusmap"); + + // switch database if necessary + if (machine == "true") + dbo = db.db("forgemill"); + + dbo.collection("locations").find({'id': query}).toArray() + .then(function(result) { + console.log("Results:\n", result); + res.send(result); + }) + .catch(function(err) { + if (err) + console.error("ERROR:", err); + }); + db.close(); + } + }); + + }); module.exports = router; \ No newline at end of file diff --git a/views/layout2.ejs b/views/layout2.ejs index 5fbc541..6d67000 100644 --- a/views/layout2.ejs +++ b/views/layout2.ejs @@ -55,7 +55,7 @@ Back to Map diff --git a/views/searchResults.ejs b/views/searchResults.ejs index ad3b094..60b0fc6 100644 --- a/views/searchResults.ejs +++ b/views/searchResults.ejs @@ -1,62 +1,5 @@ - - - - - - - - - - Search Results - "{{params.query}}" - - - - - - - - - - - - - - - - - - -
      - - - -
      @@ -105,31 +48,4 @@
      - - - - - - - - - - \ No newline at end of file +
      \ No newline at end of file From c11a932103978411937502175498015e5966367e Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Wed, 15 Jan 2020 18:15:55 -0500 Subject: [PATCH 44/69] Started comment functionality --- server.js | 428 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 240 insertions(+), 188 deletions(-) diff --git a/server.js b/server.js index f1b47c5..0eeb957 100644 --- a/server.js +++ b/server.js @@ -10,22 +10,22 @@ const locations = require('./machine_sites.json'); const app = express(); app.use(express.static(__dirname)) - .use(bodyParser.urlencoded({extended: true})) - .use(bodyParser.json()); + .use(bodyParser.urlencoded({ extended: true })) + .use(bodyParser.json()); -dotenv.config({path: './.env'}); +dotenv.config({ path: './.env' }); /* =========================== DATABASE CONNECTION INFO ============================== */ const user = process.env.DB_USER; const pass = process.env.DB_PASS; const uri = `mongodb+srv://${user}:${pass}@rpicampusmap-fwvzb.gcp.mongodb.net/test?retryWrites=true`; -const options = {useNewUrlParser: true}; +const options = { useNewUrlParser: true }; /* =================================================================================== */ /* ================================= SERVER START ==================================== */ const port = process.env.PORT; -MongoClient.connect(uri, options, function(err, db) { +MongoClient.connect(uri, options, function (err, db) { if (err) { throw err; } @@ -46,19 +46,19 @@ MongoClient.connect(uri, options, function(err, db) { // Download initial location data from database before starting server dbo.collection('locations').find().toArray() - .then(function(result) { - // console.log(result);(location + .then(function (result) { + // console.log(result);(location - var locationData = result; + var locationData = result; - // Start server after initial database connection - app.listen(port); - console.log('Listening on port ' + port); - db.close(); - }) - .catch(function(err) { - if (err) throw err; - }); + // Start server after initial database connection + app.listen(port); + console.log('Listening on port ' + port); + db.close(); + }) + .catch(function (err) { + if (err) throw err; + }); } @@ -66,27 +66,7 @@ MongoClient.connect(uri, options, function(err, db) { /* =================================================================================== */ /* =================================== HOMEPAGE ====================================== */ -app.get('/', function(req, res) { - /* - MongoClient.connect(uri, options, function(err, db) { - if (err) { - throw err; - } - else { - console.log("Database connected in route '/index'!"); - let dbo = db.db("locations"); - } - - db.close(); - }); - console.log("here") - */ - - res.sendFile(__dirname + '/public/views/index.html'); -}); - -app.route('/index') -.get(function(req, res) { +app.get('/', function (req, res) { /* MongoClient.connect(uri, options, function(err, db) { if (err) { @@ -103,197 +83,269 @@ app.route('/index') */ res.sendFile(__dirname + '/public/views/index.html'); +}); + +app.route('/index') + .get(function (req, res) { + /* + MongoClient.connect(uri, options, function(err, db) { + if (err) { + throw err; + } + else { + console.log("Database connected in route '/index'!"); + let dbo = db.db("locations"); + } + + db.close(); + }); + console.log("here") + */ + + res.sendFile(__dirname + '/public/views/index.html'); }) -.post(jsonParser, function(req, res) { - //get the location to highlight - const query = req.body.query; - const machine = req.body.machine; - console.log(req.body); - console.log("Query:", query); - console.log("Machine:", machine); + .post(jsonParser, function (req, res) { + //get the location to highlight + const query = req.body.query; + const machine = req.body.machine; + console.log(req.body); + console.log("Query:", query); + console.log("Machine:", machine); + + MongoClient.connect(uri, options, function (err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/index'!") - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/index'!") + let dbo = db.db("rpicampusmap"); - let dbo = db.db("rpicampusmap"); + // switch database if necessary + if (machine == "true") + dbo = db.db("forgemill"); - // switch database if necessary - if (machine == "true") - dbo = db.db("forgemill"); + dbo.collection("locations").find({ 'id': query }).toArray() + .then(function (result) { + console.log("Results:\n", result); + res.send(result); + }) + .catch(function (err) { + if (err) + console.error("ERROR:", err); + }); + db.close(); + } + }); - dbo.collection("locations").find({'id': query}).toArray() - .then(function(result) { - console.log("Results:\n", result); - res.send(result); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); - db.close(); - } }); - -}); /* =================================================================================== */ /* ==================================== SEARCH ======================================= */ app.route('/search') -.get(function(req, res) { - console.log("Get search results!"); - res.sendFile(__dirname + '/public/views/searchResults.html'); -}) -.post(jsonParser, function(req, res) { - const query = req.body.query; - console.log("Query:", query); - - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/search'!") - let db1 = db.db("rpicampusmap"); - let db2 = db.db("forgemill"); - let results = []; - - // Search the database for locations matching the given regular expression - // Search by name and by nickname for any match of the substring - db1.collection("locations").find({'$or': [ - {'properties.name': {'$regex': query, '$options': 'i'} }, - {'properties.nick': {'$regex': query, '$options': 'i'} } - // add here to look through machines - ]}).toArray() - .then(function(result1) { - console.log("Result1:\n", result1); - results = results.concat(result1); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); + .get(function (req, res) { + console.log("Get search results!"); + res.sendFile(__dirname + '/public/views/searchResults.html'); + }) + .post(jsonParser, function (req, res) { + const query = req.body.query; + console.log("Query:", query); - db2.collection("locations").find({'$or': [ - {'properties.name': {'$regex': query, '$options': 'i'} }, - {'properties.nick': {'$regex': query, '$options': 'i'} }, - {'contents.machines': {'$regex': query, '$options': 'i'} } - ]}).toArray() - .then(function(result2) { - console.log("Result2:\n", result2); - results = results.concat(result2); - console.log("Results:\n", results); - res.send(results); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); + MongoClient.connect(uri, options, function (err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/search'!") + let db1 = db.db("rpicampusmap"); + let db2 = db.db("forgemill"); + let results = []; + + // Search the database for locations matching the given regular expression + // Search by name and by nickname for any match of the substring + db1.collection("locations").find({ + '$or': [ + { 'properties.name': { '$regex': query, '$options': 'i' } }, + { 'properties.nick': { '$regex': query, '$options': 'i' } } + // add here to look through machines + ] + }).toArray() + .then(function (result1) { + console.log("Result1:\n", result1); + results = results.concat(result1); + }) + .catch(function (err) { + if (err) + console.error("ERROR:", err); + }); + + db2.collection("locations").find({ + '$or': [ + { 'properties.name': { '$regex': query, '$options': 'i' } }, + { 'properties.nick': { '$regex': query, '$options': 'i' } }, + { 'contents.machines': { '$regex': query, '$options': 'i' } } + ] + }).toArray() + .then(function (result2) { + console.log("Result2:\n", result2); + results = results.concat(result2); + console.log("Results:\n", results); + res.send(results); + }) + .catch(function (err) { + if (err) + console.error("ERROR:", err); + }); + + db.close(); + } + }); - db.close(); - } }); - -}); +/* =================================================================================== */ /* ===================================== INFO ======================================== */ app.route('/info') -.get(function (req, res) { - res.sendFile(__dirname + '/public/views/info.html') -}) -.post(jsonParser, function(req, res) { - const comment = req.body.comment; - const query = req.body.query; - const machine = req.body.machine; - console.log(req.body); - console.log("Query:", query); - console.log("Machine:", machine); - - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/info'!") + .get(function (req, res) { + res.sendFile(__dirname + '/public/views/info.html') + }) + .post(jsonParser, function (req, res) { + const comment = req.body.comment; + const query = req.body.query; + const machine = req.body.machine; + console.log(req.body); + console.log("Query:", query); + console.log("Machine:", machine); + + MongoClient.connect(uri, options, function (err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/info'!") - let dbo = db.db("rpicampusmap"); + let dbo = db.db("rpicampusmap"); - // switch database if necessary + // switch database if necessary - if (machine == "true"){ + if (machine == "true") { dbo = db.db("forgemill"); + } + + + dbo.collection("locations").find({ 'id': query }).toArray() + .then(function (result) { + console.log("Results:\n", result); + res.send(result); + }) + .catch(function (err) { + if (err) + console.error("ERROR:", err); + }); + db.close(); } + }); - - dbo.collection("locations").find({'id': query}).toArray() - .then(function(result) { - console.log("Results:\n", result); - res.send(result); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); - db.close(); + if (comment) { + console.log(comment); } + }); - if (comment) { - console.log(comment); - } +/* ================================================================================== */ -}); +/* =================================== COMMENT ====================================== */ +app.route('/comment') + .post(jsonParser, function (req, res) { + const loc = req.body.loc; + const author = req.body.author; + const text = req.body.text; + const date = req.body.date; + console.log(req.body); + console.log("author:", author); + console.log("text:", text); + console.log("date:", date); + + MongoClient.connect(uri, options, function (err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/info'!") + + let dbo = db.db("rpicampusmap"); + + // switch database if necessary + + if (machine == "true") { + dbo = db.db("forgemill"); + } + + dbo.collection("locations").findOne({ '_id': loq }) + .then(function (result) { + console.log("Results:\n", result); + res.send(result); + }) + .catch(function (err) { + if (err) + console.error("ERROR:", err); + }); + db.close(); + } + }); + + if (comment) { + console.log(comment); + } + + }); /* ================================================================================== */ /* ==================================== ADMIN ======================================= */ app.route('/admin/request') -.get(function (req, res) { - res.sendFile(__dirname + '/public/views/register.html'); -}) -.post(function (req, res, next) { - const username = req.body.rcsID; - const password = req.body.password; + .get(function (req, res) { + res.sendFile(__dirname + '/public/views/register.html'); + }) + .post(function (req, res, next) { + const username = req.body.rcsID; + const password = req.body.password; - console.log("Username:", username); - console.log("Password:", password); + console.log("Username:", username); + console.log("Password:", password); - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/admin'!") - } + MongoClient.connect(uri, options, function (err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/admin'!") + } + }); }); -}); app.route('/login') -.get(function (req, res) { - res.sendFile(__dirname + '/public/views/login.html'); -}) -.post(function (req, res) { - res.send("Logged in Successfully"); -}); + .get(function (req, res) { + res.sendFile(__dirname + '/public/views/login.html'); + }) + .post(function (req, res) { + res.send("Logged in Successfully"); + }); app.route('/admin') -.get(function (req, res) { - // if (req.body.admin) + .get(function (req, res) { + // if (req.body.admin) res.sendFile(__dirname + '/public/views/admin.html'); - // else - // res.sendFile(__dirname + '/public/views/login.html'); -}).post(function (req, res) { - console.log("Post request in /admin"); -}); + // else + // res.sendFile(__dirname + '/public/views/login.html'); + }).post(function (req, res) { + console.log("Post request in /admin"); + }); /* ================================================================================== */ // Handle 404 - app.use(function(req, res) { - res.status(404) - .sendFile(__dirname + '/public/views/notfound.html', {error: '404: Page not Found'}); - }); - - // Handle 500 - app.use(function(error, req, res, next) { - res.status(500).send('Error 500: Internal Server Error'); - }); +app.use(function (req, res) { + res.status(404) + .sendFile(__dirname + '/public/views/notfound.html', { error: '404: Page not Found' }); +}); + +// Handle 500 +app.use(function (error, req, res, next) { + res.status(500).send('Error 500: Internal Server Error'); +}); From 7328835c555517dcf4c78b6390b9fe61b6e24feb Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Wed, 15 Jan 2020 20:12:41 -0500 Subject: [PATCH 45/69] Added eslint to define and enforce style --- .eslintrc.json | 34 + package-lock.json | 817 ++++++- package.json | 3 +- public/controllers/admin.js | 34 +- public/controllers/app.js | 4 +- public/controllers/infoController.js | 32 +- public/controllers/machineInfoController.js | 22 +- public/controllers/mapController.js | 44 +- public/controllers/searchController.js | 4 +- public/geolocations.js | 2420 +++++++++---------- public/imagePreview.js | 16 +- public/machine_sites.js | 348 +-- public/map.js | 186 +- server.js | 96 +- sw.js | 32 +- 15 files changed, 2430 insertions(+), 1662 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..eee466b --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + "extends": "eslint:recommended", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + "indent": [ + "error", + 2 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ] + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 074dcd9..b95aa68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,24 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -18,6 +36,16 @@ "negotiator": "0.6.1" } }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", @@ -37,6 +65,14 @@ "string-width": "^2.0.0" } }, + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "requires": { + "type-fest": "^0.8.1" + } + }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -69,6 +105,14 @@ } } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -112,6 +156,11 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -298,6 +347,11 @@ "unset-value": "^1.0.0" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -323,6 +377,11 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, "chokidar": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", @@ -373,6 +432,19 @@ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -505,6 +577,11 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -557,6 +634,14 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", @@ -589,6 +674,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -604,6 +694,178 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -716,6 +978,26 @@ } } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -790,6 +1072,27 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -825,6 +1128,21 @@ "unpipe": "~1.0.0" } }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -863,6 +1181,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, "fsevents": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", @@ -880,7 +1203,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -898,11 +1222,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -915,15 +1241,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1026,7 +1355,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1036,6 +1366,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1048,17 +1379,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -1075,6 +1409,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1147,7 +1482,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1157,6 +1493,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -1232,7 +1569,8 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -1262,6 +1600,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -1279,6 +1618,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -1317,14 +1657,21 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "optional": true } } }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -1343,6 +1690,19 @@ "assert-plus": "^1.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -1370,6 +1730,14 @@ "ini": "^1.3.4" } }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "requires": { + "type-fest": "^0.8.1" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -1470,11 +1838,32 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -1485,6 +1874,15 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -1495,6 +1893,73 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "inquirer": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", + "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + } + } + }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", @@ -1650,6 +2115,11 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", @@ -1695,6 +2165,20 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -1710,6 +2194,11 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -1739,6 +2228,20 @@ "package-json": "^4.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -1833,6 +2336,11 @@ "mime-db": "~1.38.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1847,9 +2355,9 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -1865,6 +2373,21 @@ } } }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, "mongodb": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.3.tgz", @@ -1890,6 +2413,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -1914,11 +2442,21 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "nodemon": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.1.tgz", @@ -2029,6 +2567,40 @@ "ee-first": "1.1.1" } }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -2045,6 +2617,14 @@ "semver": "^5.1.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -2095,6 +2675,11 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", @@ -2105,6 +2690,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "proxy-addr": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", @@ -2199,6 +2789,11 @@ "safe-regex": "^1.1.0" } }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, "registry-auth-token": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", @@ -2277,11 +2872,44 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2354,9 +2982,9 @@ } }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -2397,6 +3025,16 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -2533,6 +3171,11 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -2616,6 +3259,58 @@ "has-flag": "^3.0.0" } }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", @@ -2624,11 +3319,29 @@ "execa": "^0.7.0" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -2691,6 +3404,11 @@ } } }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -2704,6 +3422,19 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -2722,35 +3453,14 @@ } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-string": { @@ -2870,6 +3580,11 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2901,6 +3616,24 @@ "string-width": "^2.1.1" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + }, "write-file-atomic": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", diff --git a/package.json b/package.json index e586be3..a91a3d4 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,10 @@ "homepage": "https://github.com/gaskij/rpicampusmap#readme", "dependencies": { "dotenv": "^7.0.0", + "eslint": "^6.8.0", "express": "^4.16.4", "mongodb": "^3.2.3", "nodemon": "^1.19.1", "request": "^2.88.0" } -} \ No newline at end of file +} diff --git a/public/controllers/admin.js b/public/controllers/admin.js index 802e57e..cc8f3d5 100644 --- a/public/controllers/admin.js +++ b/public/controllers/admin.js @@ -1,19 +1,19 @@ app.controller('infoController', function($scope, $http) { - console.log("infoController activated!"); + console.log('infoController activated!'); const location = getParams(); console.log(location); $http.post(`/info?loc=${location.loc}`, {query: location.loc}) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); - $scope.id = location.loc; - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; - $scope.desc = httpResponse.data[0].properties.description; - }); + $scope.id = location.loc; + $scope.name = httpResponse.data[0].properties.name; + $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; + $scope.desc = httpResponse.data[0].properties.description; + }); $scope.comment = function(title, body) { if (!title || !body) return; @@ -28,12 +28,12 @@ app.controller('infoController', function($scope, $http) { console.log(data); $http.post(`/info?loc=${location.loc}`, data) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); - - $scope.cmtTitle = ""; - $scope.cmtBody = ""; - }); - } + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); + + $scope.cmtTitle = ''; + $scope.cmtBody = ''; + }); + }; }); diff --git a/public/controllers/app.js b/public/controllers/app.js index 9c9c8ba..e6adb9f 100644 --- a/public/controllers/app.js +++ b/public/controllers/app.js @@ -6,7 +6,7 @@ let getParams = function() { let queryString = url.split('?'); if (queryString.length == 1) { - console.log("no queries given"); + console.log('no queries given'); return null; } paramString = queryString[1].split('&'); @@ -17,4 +17,4 @@ let getParams = function() { } console.log(params); return params; -} +}; diff --git a/public/controllers/infoController.js b/public/controllers/infoController.js index 2f938fb..71e200d 100644 --- a/public/controllers/infoController.js +++ b/public/controllers/infoController.js @@ -1,19 +1,19 @@ app.controller('infoController', function($scope, $http) { - console.log("infoController activated!"); + console.log('infoController activated!'); const location = getParams(); console.log(location); $http.post(`/info?loc=${location.loc}`, {query: location.loc}) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); - $scope.id = location.loc; - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; - $scope.desc = httpResponse.data[0].properties.description; - }); + $scope.id = location.loc; + $scope.name = httpResponse.data[0].properties.name; + $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; + $scope.desc = httpResponse.data[0].properties.description; + }); $scope.comment = function(title, body) { if (!title || !body) return; @@ -28,12 +28,12 @@ app.controller('infoController', function($scope, $http) { console.log(data); $http.post(`/info?loc=${location.loc}`, data) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); - $scope.cmtTitle = ""; - $scope.cmtBody = ""; - }); - } + $scope.cmtTitle = ''; + $scope.cmtBody = ''; + }); + }; }); diff --git a/public/controllers/machineInfoController.js b/public/controllers/machineInfoController.js index c03fabd..e168d09 100644 --- a/public/controllers/machineInfoController.js +++ b/public/controllers/machineInfoController.js @@ -1,5 +1,5 @@ app.controller('machineInfoController', function($scope, $http) { - console.log("machineInfoController activated!"); + console.log('machineInfoController activated!'); const parameters = getParams(); console.log(parameters); @@ -7,15 +7,15 @@ app.controller('machineInfoController', function($scope, $http) { $scope.isMachine = parameters.machine; $http.post(`/info?loc=${location}`, {query: location, machine: $scope.isMachine}) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); + .then(function(httpResponse, err) { + if (err) throw err; + console.log(httpResponse.data); - $scope.id = location; - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; - $scope.desc = httpResponse.data[0].properties.description; - if ($scope.isMachine) { + $scope.id = location; + $scope.name = httpResponse.data[0].properties.name; + $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; + $scope.desc = httpResponse.data[0].properties.description; + if ($scope.isMachine) { $scope.sunHours = httpResponse.data[0].room.hours.sun; $scope.monHours = httpResponse.data[0].room.hours.mon; $scope.tuesHours = httpResponse.data[0].room.hours.tues; @@ -27,6 +27,6 @@ app.controller('machineInfoController', function($scope, $http) { $scope.machines = httpResponse.data[0].contents.machines; $scope.materials = httpResponse.data[0].contents.available_materials; $scope.equipment = httpResponse.data[0].contents.equipment; - } - }) + } + }); }); diff --git a/public/controllers/mapController.js b/public/controllers/mapController.js index b302fa6..6cae91c 100644 --- a/public/controllers/mapController.js +++ b/public/controllers/mapController.js @@ -1,5 +1,5 @@ app.controller('mapController', function($scope, $http) { - console.log("mapController activated!"); + console.log('mapController activated!'); const parameters = getParams(); console.log(parameters); @@ -7,27 +7,27 @@ app.controller('mapController', function($scope, $http) { $scope.isMachine = parameters.machine; if (parameters != null) { - $http.post(`/index?loc=${location}`, {query: location, machine: $scope.isMachine}) + $http.post(`/index?loc=${location}`, {query: location, machine: $scope.isMachine}) .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); + if (err) throw err; + console.log(httpResponse.data); - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = `Nicknames: ${httpResponse.data[0].properties.nick}`; - $scope.desc = httpResponse.data[0].properties.description; + $scope.name = httpResponse.data[0].properties.name; + $scope.nick = `Nicknames: ${httpResponse.data[0].properties.nick}`; + $scope.desc = httpResponse.data[0].properties.description; - let latitude = httpResponse.data[0].geometry.coordinates[1]; - let longitude = httpResponse.data[0].geometry.coordinates[0]; + let latitude = httpResponse.data[0].geometry.coordinates[1]; + let longitude = httpResponse.data[0].geometry.coordinates[0]; - let newPopupContent = ''; - if (httpResponse.data[0].properties.type == "machine") { - newPopupContent += `` - } - else { + let newPopupContent = ''; + if (httpResponse.data[0].properties.type == 'machine') { + newPopupContent += ``; + } + else { console.log(httpResponse.data[0].properties.type); - newPopupContent += ``; - } - newPopupContent += ` + newPopupContent += ``; + } + newPopupContent += ` -
      \ No newline at end of file +
      + + + \ No newline at end of file From 5785deac3ed7ab87d910e32e835159d4a5f73696 Mon Sep 17 00:00:00 2001 From: Unachieved Date: Tue, 4 Feb 2020 16:54:17 -0500 Subject: [PATCH 51/69] info_&_search_fix --- routes/user.js | 3 ++ views/info.ejs | 104 +--------------------------------------- views/layout2.ejs | 2 +- views/searchResults.ejs | 21 ++------ 4 files changed, 8 insertions(+), 122 deletions(-) diff --git a/routes/user.js b/routes/user.js index 61d1f27..042d08a 100644 --- a/routes/user.js +++ b/routes/user.js @@ -191,4 +191,7 @@ router.post('/main_page', jsonParser, function(req, res) { }); +router.get('/info', (req, res) => res.render('info', {layout: "layout2.ejs", extractStyles: true})); + + module.exports = router; \ No newline at end of file diff --git a/views/info.ejs b/views/info.ejs index 23b7ec1..5d44194 100644 --- a/views/info.ejs +++ b/views/info.ejs @@ -1,73 +1,3 @@ - - - - - - - - - - - Info - {{name}} - - - - - - - - - - - - - - - - - - - - - - - - - -
      @@ -232,36 +162,4 @@ -
      - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/views/layout2.ejs b/views/layout2.ejs index 6d67000..073a1ba 100644 --- a/views/layout2.ejs +++ b/views/layout2.ejs @@ -60,7 +60,7 @@ -
      +
      diff --git a/views/searchResults.ejs b/views/searchResults.ejs index ffdd595..9c696b4 100644 --- a/views/searchResults.ejs +++ b/views/searchResults.ejs @@ -3,34 +3,19 @@
      - -
      -
      +
      - - +
      Search Results - "{{que_res}}"
      -
      From d19dd36e56c0034fe00c46887cec43efd9933459 Mon Sep 17 00:00:00 2001 From: Unachieved Date: Tue, 11 Feb 2020 22:24:36 -0500 Subject: [PATCH 52/69] Location Database and search fix --- app.js | 21 +-- database.js | 19 +++ geolocations.json | 16 -- models/Locations.js | 49 +++++++ routes/user.js | 318 +++++++++++++++++++++------------------- server.js | 1 + views/layout.ejs | 2 +- views/layout2.ejs | 2 +- views/searchResults.ejs | 19 ++- 9 files changed, 265 insertions(+), 182 deletions(-) create mode 100644 database.js create mode 100644 models/Locations.js diff --git a/app.js b/app.js index 90b6a19..ddc0297 100644 --- a/app.js +++ b/app.js @@ -2,11 +2,13 @@ const http = require('http'); const express = require('express'); const bodyParser = require('body-parser'); const expressLayouts = require('express-ejs-layouts'); -const mongodb = require('mongodb'); -const mongoose = require('mongoose'); const passport = require('passport'); const flash = require('connect-flash'); const session = require('express-session'); +const geolocations = require('./geolocations.json'); +const Location = require('./models/Locations'); +const database = require('./database'); +const assert = require('assert'); const app = express(); @@ -14,13 +16,11 @@ const app = express(); // Passport Config require('./config/passport')(passport); -// DB Config -const db = require('./config/keys').MongoURI; - -// Connect to Mongo -mongoose.connect(db, {useUnifiedTopology: true,useNewUrlParser: true}) - .then(() => console.log('MongoDB Connected...')) - .catch(err=> console.log(err)); +//adding locations for first run +let db = database._connect(); +Location.collection.insertMany(geolocations, {ordered: false}) +.then(() => console.log("DONE Loading")) +.catch((err) => console.log(err)); // EJS app.use(expressLayouts); @@ -62,4 +62,5 @@ app.use( express.static( "public" ) ); const PORT = process.env.PORT || 5000; -app.listen(PORT, console.log(`Server started on port ${PORT}`)); \ No newline at end of file +app.listen(PORT, console.log(`Server started on port ${PORT}`)); + diff --git a/database.js b/database.js new file mode 100644 index 0000000..18b50e5 --- /dev/null +++ b/database.js @@ -0,0 +1,19 @@ +const mongoose = require('mongoose'); + +// DB Config +const db = require('./config/keys').MongoURI; + +// Connect to Mongo +class Database { + constructor() { + this._connect() + } + + _connect() { + mongoose.connect(db, {useUnifiedTopology: true,useNewUrlParser: true}) + .then(() => console.log('MongoDB Connected...')) + .catch(err=> console.log(err)) + } +}; + +module.exports = new Database(); \ No newline at end of file diff --git a/geolocations.json b/geolocations.json index beb1f5b..256fa36 100644 --- a/geolocations.json +++ b/geolocations.json @@ -986,22 +986,6 @@ "coordinates": [-73.680893, 42.732037] } }, - { - "type": "Feature", - "_id": "alumni", - "id": "alumni", - "properties": { - "name": "Heffner Alumni House", - "nick": "Heffner Alumni House", - "category": "Operations & Administration", - "description": "alumni events", - "popupContent": "Alumni House (Heffner)" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678216, 42.732883] - } - }, { "type": "Feature", "_id": "boiler11", diff --git a/models/Locations.js b/models/Locations.js new file mode 100644 index 0000000..5c6dec3 --- /dev/null +++ b/models/Locations.js @@ -0,0 +1,49 @@ +const mongoose = require('mongoose'); + + +const LocationSchema = new mongoose.Schema({ + + _id: { + type: String, + require: true + }, + + id: { + type: String, + require: true + }, + properties: { + name: { + type: String, + require: true + }, + nick: { + type: String, + require: true + }, + category: { + type: String, + require: true + }, + description: { + type: String, + require: true + }, + popupContent:{ + type: String, + require: true + }, + }, + + geometry: { + type: String, + coordinates: { + type: Array, + require: true + } + } +}); + +const Location = mongoose.model('Location', LocationSchema); + +module.exports = Location; \ No newline at end of file diff --git a/routes/user.js b/routes/user.js index 042d08a..0423107 100644 --- a/routes/user.js +++ b/routes/user.js @@ -3,195 +3,219 @@ const router = express.Router(); const bcrypt = require('bcryptjs'); const passport = require('passport'); const bodyParser = require('body-parser'); +const mongoose = require('mongoose'); const jsonParser = bodyParser.json(); // UserModel const User = require('../models/User'); +const Location = require('../models/Locations'); // login page -router.get('/login', (req, res) => res.render('login',{page_name: "Login",layout: "layout2.ejs", extractStyles: true})); +router.get('/login', (req, res) => res.render('login', { page_name: "Login", layout: "layout2.ejs", extractStyles: true })); // Login Handle -router.post('/login', (req,res,next) => { - console.log('authenticating'); - passport.authenticate('local', { - successRedirect: '/admin', - failureRedirect: '/user/login', - failureFlash: true - })(req, res, next); +router.post('/login', (req, res, next) => { + console.log('authenticating'); + passport.authenticate('local', { + successRedirect: '/admin', + failureRedirect: '/user/login', + failureFlash: true + })(req, res, next); }); router.get('/logout', (req, res) => { - console.log('logging out'); - req.logOut(); - req.flash('success_msg', 'You are logged out'); - res.redirect('/user/login'); + console.log('logging out'); + req.logOut(); + req.flash('success_msg', 'You are logged out'); + res.redirect('/user/login'); }); // registration page -router.get('/register', (req, res) => res.render('register', {page_name: "Register", layout: "layout2.ejs", extractStyles: true})); +router.get('/register', (req, res) => res.render('register', { page_name: "Register", layout: "layout2.ejs", extractStyles: true })); // Register Handle router.post('/register', (req, res) => { - const { name, email, password, password2} = req.body; - let errors = []; - - //check required fields - if(!name || !email || !password || !password2){ - errors.push({msg: 'Please fill in all fields'}) - } - - //check passwords match - if(password!=password2){ - errors.push({msg: 'Passwords do not match'}) - } - - //check pass length - if(password.length < 6){ - errors.push({msg: 'Password should be at least 6 characters'}) - } - - if(errors.length>0){ - res.render('register', { + const { name, email, password, password2 } = req.body; + let errors = []; + + //check required fields + if (!name || !email || !password || !password2) { + errors.push({ msg: 'Please fill in all fields' }) + } + + //check passwords match + if (password != password2) { + errors.push({ msg: 'Passwords do not match' }) + } + + //check pass length + if (password.length < 6) { + errors.push({ msg: 'Password should be at least 6 characters' }) + } + + if (errors.length > 0) { + res.render('register', { + errors, + name, + email, + password, + password2 + }); + } else { + // Validation passed + User.findOne({ email: email }) + .then(user => { + if (user) { + // User exists + errors.push({ msg: 'Email is already registered' }) + res.render('register', { errors, name, email, password, password2 - }); - } else { - // Validation passed - User.findOne({ email: email}) - .then(user => { - if(user){ - // User exists - errors.push({msg: 'Email is already registered'}) - res.render('register', { - errors, - name, - email, - password, - password2 - }); - } else { - const newUser = new User({ - name, - email, - password - }); - - // HASH password - bcrypt.genSalt(10, (error,salt)=> - bcrypt.hash(newUser.password,salt, (err, hash) =>{ - if(err)throw(err); - - // set password - newUser.password=hash; - newUser.save() - .then(user => { - req.flash('success_msg', 'You are now registered and can login') - res.redirect('/user/login'); - }) - .catch(err => console.log(err)) - - })) - } - }); - } + }); + } else { + const newUser = new User({ + name, + email, + password + }); + + // HASH password + bcrypt.genSalt(10, (error, salt) => + bcrypt.hash(newUser.password, salt, (err, hash) => { + if (err) throw (err); + + // set password + newUser.password = hash; + newUser.save() + .then(user => { + req.flash('success_msg', 'You are now registered and can login') + res.redirect('/user/login'); + }) + .catch(err => console.log(err)) + + })) + } + }); + } }); -router.get('/search', (req, res) => res.render('searchResults', {page_name: "Search", layout: "layout2.ejs", extractStyles: true})); -router.post('/search', jsonParser, function(req, res) { - const query = req.body.query; - console.log("Query:", query); +// Search Handle +// TODO: make the search case insensitive and allow for regex matching instead of exact _id match +router.get('/search', jsonParser, (req, res) => { + const query = req.query; + console.log(query); - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/search'!") - let db1 = db.db("rpicampusmap"); - let db2 = db.db("forgemill"); - let results = []; - // Search the database for locations matching the given regular expression - // Search by name and by nickname for any match of the substring - db1.collection("locations").find({'$or': [ - {'properties.name': {'$regex': query, '$options': 'i'} }, - {'properties.nick': {'$regex': query, '$options': 'i'} } - // add here to look through machines - ]}).toArray() - .then(function(result1) { - console.log("Result1:\n", result1); - results = results.concat(result1); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); + if(req.query["query"]== null || req.query["query"]== ''){ + Location.find() + .then(results => { + /*results.forEach(element => { + console.log(element['properties']['name']); + });*/ + res.render('searchResults', { page_name: "Search", layout: "layout2.ejs", extractStyles: true, results: results}); + }) + .catch(err => { + console.log(err) + }); + } + else{ + Location.find({ + _id: query["query"] + }) + .then(results => { + res.render('searchResults', { page_name: "Search", layout: "layout2.ejs", extractStyles: true, results: results }); + }) + .catch(err => { + console.log(err) + }); + } + - db2.collection("locations").find({'$or': [ - {'properties.name': {'$regex': query, '$options': 'i'} }, - {'properties.nick': {'$regex': query, '$options': 'i'} }, - {'contents.machines': {'$regex': query, '$options': 'i'} } - ]}).toArray() - .then(function(result2) { - console.log("Result2:\n", result2); - results = results.concat(result2); - console.log("Results:\n", results); - res.send(results); - res.render('searchResults', {page_name: "Search", que_res: results.query, layout: "layout2.ejs", extractStyles: true}) +}); + +// main page --- the map +router.get('/main_page', (req, res) => res.render('map', { page_name: "Map", layout: "layout2.ejs", extractStyles: true })); +router.post('/main_page', jsonParser, function (req, res) { + //get the location to highlight + const query = req.body.query; + const machine = req.body.machine; + console.log(req.body); + console.log("Query:", query); + console.log("Machine:", machine); + + MongoClient.connect(uri, options, function (err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/index'!") + + let dbo = db.db("rpicampusmap"); + + // switch database if necessary + if (machine == "true") + dbo = db.db("forgemill"); + + dbo.collection("locations").find({ 'id': query }).toArray() + .then(function (result) { + console.log("Results:\n", result); + res.send(result); }) - .catch(function(err) { + .catch(function (err) { if (err) console.error("ERROR:", err); }); - - db.close(); - } - }); - + db.close(); + } }); -// main page --- the map -router.get('/main_page', (req, res) => res.render('map', {layout: "layout2.ejs", extractStyles: true})); -router.post('/main_page', jsonParser, function(req, res) { - //get the location to highlight - const query = req.body.query; - const machine = req.body.machine; - console.log(req.body); - console.log("Query:", query); - console.log("Machine:", machine); - - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/index'!") - - let dbo = db.db("rpicampusmap"); - - // switch database if necessary - if (machine == "true") - dbo = db.db("forgemill"); - - dbo.collection("locations").find({'id': query}).toArray() - .then(function(result) { +}); + + +router.get('/info', (req, res) => res.render('info', { layout: "layout2.ejs", extractStyles: true })); +router.post('/info', jsonParser, function (req, res) { + const comment = req.body.comment; + const query = req.body.query; + const machine = req.body.machine; + console.log(req.body); + console.log("Query:", query); + console.log("Machine:", machine); + + MongoClient.connect(uri, options, function (err, db) { + if (err) + throw err; + else { + console.log("Database connected in route '/info'!") + + let dbo = db.db("rpicampusmap"); + + // switch database if necessary + + if (machine == "true") { + dbo = db.db("forgemill"); + } + + + dbo.collection("locations").find({ 'id': query }).toArray() + .then(function (result) { console.log("Results:\n", result); res.send(result); }) - .catch(function(err) { + .catch(function (err) { if (err) console.error("ERROR:", err); }); - db.close(); - } - }); - + db.close(); + } }); + if (comment) { + console.log(comment); + } -router.get('/info', (req, res) => res.render('info', {layout: "layout2.ejs", extractStyles: true})); +}); module.exports = router; \ No newline at end of file diff --git a/server.js b/server.js index 88ccf49..97980ec 100644 --- a/server.js +++ b/server.js @@ -145,6 +145,7 @@ app.route('/index') /* ==================================== SEARCH ======================================= */ app.route('/search') .get(function(req, res) { + console.log(req.body); console.log("Get search results!"); res.sendFile(__dirname + '/public/views/searchResults.html'); }) diff --git a/views/layout.ejs b/views/layout.ejs index ced3061..9e14a78 100644 --- a/views/layout.ejs +++ b/views/layout.ejs @@ -8,7 +8,7 @@ - Info - {{page_name}} + <%= page_name%> diff --git a/views/layout2.ejs b/views/layout2.ejs index 073a1ba..40ff1bb 100644 --- a/views/layout2.ejs +++ b/views/layout2.ejs @@ -8,7 +8,7 @@ - Info - {{page_name}} + <%= page_name%> diff --git a/views/searchResults.ejs b/views/searchResults.ejs index 9c696b4..f4e581f 100644 --- a/views/searchResults.ejs +++ b/views/searchResults.ejs @@ -8,28 +8,33 @@
      -
      -
      Search Results - "{{que_res}}"
      +
      Search Results - "<%= results_count %>"
      -
      {%> +
      From 05b63617002e529d0612f2b8d0388ebf559854e0 Mon Sep 17 00:00:00 2001 From: Unachieved Date: Fri, 14 Feb 2020 16:22:22 -0500 Subject: [PATCH 53/69] hot search fix --- routes/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/user.js b/routes/user.js index 0423107..70be33a 100644 --- a/routes/user.js +++ b/routes/user.js @@ -115,7 +115,7 @@ router.get('/search', jsonParser, (req, res) => { /*results.forEach(element => { console.log(element['properties']['name']); });*/ - res.render('searchResults', { page_name: "Search", layout: "layout2.ejs", extractStyles: true, results: results}); + res.render('searchResults', { page_name: "Search", layout: "layout2.ejs", extractStyles: true, results: results, results_count: results.length}); }) .catch(err => { console.log(err) From e5600ffcb2e07ba6b8803d8501878da0e1a637dd Mon Sep 17 00:00:00 2001 From: Unachieved Date: Sat, 15 Feb 2020 22:50:01 -0500 Subject: [PATCH 54/69] remove_html_files --- public/style/searchResults.css | 20 +- public/views/admin.html | 88 -------- public/views/index.html | 109 ---------- public/views/info.html | 311 --------------------------- public/views/login.html | 115 ---------- public/views/machine_sites_info.html | 255 ---------------------- public/views/mapinfo.html | 274 ----------------------- public/views/notfound.html | 107 --------- public/views/offline.html | 103 --------- public/views/register.html | 118 ---------- public/views/searchResults.html | 135 ------------ routes/user.js | 6 +- server.js | 302 -------------------------- views/admin.ejs | 2 +- views/searchResults.ejs | 77 +++---- 15 files changed, 44 insertions(+), 1978 deletions(-) delete mode 100644 public/views/admin.html delete mode 100644 public/views/index.html delete mode 100644 public/views/info.html delete mode 100644 public/views/login.html delete mode 100644 public/views/machine_sites_info.html delete mode 100644 public/views/mapinfo.html delete mode 100644 public/views/notfound.html delete mode 100644 public/views/offline.html delete mode 100644 public/views/register.html delete mode 100644 public/views/searchResults.html delete mode 100644 server.js diff --git a/public/style/searchResults.css b/public/style/searchResults.css index 3522c41..5f17bd6 100644 --- a/public/style/searchResults.css +++ b/public/style/searchResults.css @@ -1,24 +1,6 @@ body { - background-color: #000000; height: 100%; width: 100%; margin: 0; padding: 0; -} - -a { - text-decoration: none; -} - -footer a { - text-decoration: underline; - color: inherit; -} - -.row { - max-width: 100%; -} - -main { - min-height: calc(92vh - 4em); -} +} \ No newline at end of file diff --git a/public/views/admin.html b/public/views/admin.html deleted file mode 100644 index b705111..0000000 --- a/public/views/admin.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - Admin Panel - - - - - - - - - - - - - - - - - - - - - -
      - Hello - -
      - - - - - - - - - - - - diff --git a/public/views/index.html b/public/views/index.html deleted file mode 100644 index d509ca9..0000000 --- a/public/views/index.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - RPI Campus Map - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      -
      -
      - -

      This is where the map goes... lol

      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - diff --git a/public/views/info.html b/public/views/info.html deleted file mode 100644 index 3d4202c..0000000 --- a/public/views/info.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - - - - {{name}} - CampusMap - - - - - - - - - - - - - - - - - - - - - - - - - -
      - -
      -
      -
      -
      -
      -
      -

      {{name}}

      -
      -

      {{desc}}

      -

      {{nick}}

      - - Show On Map -
      -
      - -
      - -
      - -
      - -
      -
      -
      - - -
      - -
      - -
      -

      Room info/permissions: {{info}}

      -

      List of Machines

      -
    1. - {{x}} -
    2. -
      -

      Materials Inventory

      -
    3. - {{x}} -
    4. -
      -

      Available Equipment

      -
    5. - {{x}} -
    6. -
      -
      -
      - -
      -
      -
      - - -
      -
      -

      Comments:

      -
      -

      No comments found. Be the first to leave a comment!

      -
      -
      - - - -
      Post a Comment:
      -
      -
      -
      -
      - -
      -
      - -
      -
      -
      - -
      -
      -
      -
      - -
      - -
      Add an Image:
      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      -
      - - - - -
      - -
      - - -
      - - - - - - - - - - diff --git a/public/views/login.html b/public/views/login.html deleted file mode 100644 index 1b53d3f..0000000 --- a/public/views/login.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - Login - - - - - - - - - - - - - - - - - - - - -
      -
      -

      You must login with an administrator account to view this page.

      - -
      - -
      -
      - - -
      -
      - - -
      - - -
      - -
      - -

      Don't have an account?

      Request admin access. -
      - -
      - - - - - - - - - - - - diff --git a/public/views/machine_sites_info.html b/public/views/machine_sites_info.html deleted file mode 100644 index 423916e..0000000 --- a/public/views/machine_sites_info.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - - - - Campus Map - Search Results - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - -
      -
      -

      {{name}}

      -

      {{nick}}

      -

      {{desc}}

      - -
      - -
      -

      Sunday: {{sunHours}}

      -

      Monday: {{monHours}}

      -

      Tuesday: {{tuesHours}}

      -

      Wednesday: {{wedHours}}

      -

      Thursday: {{thurHours}}

      -

      Friday: {{friHours}}

      -

      Saturday: {{satHours}}

      -
      - -

      Room info/permissions: {{info}}

      -

      List of Machines

      -
    7. - {{x}} -
    8. -
      -

      Materials Inventory

      -
    9. - {{x}} -
    10. -
      -

      Available Equipment

      -
    11. - {{x}} -
    12. -
      - - Show On Map - -
      - -
      - -
      -
      - -
      - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/views/mapinfo.html b/public/views/mapinfo.html deleted file mode 100644 index a7bab7e..0000000 --- a/public/views/mapinfo.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - - - - - - - Info - {{name}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - -
      -
      -
      -
      -
      -

      {{name}}

      -
      -

      {{desc}}

      -

      {{nick}}

      - - Show On Map -
      - -
      - -
      - - -
      -
      -
      -
      - - -
      -
      -

      Comments:

      -
      -

      No comments found. Be the first to leave a comment!

      -
      -
      - - - -
      Post a Comment:
      -
      -
      -
      -
      - -
      -
      - -
      -
      -
      - -
      -
      -
      -
      - -
      - -
      Add an Image:
      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      -
      - - - - -
      - -
      - -
      - - - - - - - - - - - - - - diff --git a/public/views/notfound.html b/public/views/notfound.html deleted file mode 100644 index 2f14482..0000000 --- a/public/views/notfound.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - Page Not Found - - - - - - - - - - - - - - - - - - - - - - - -
      -
      -

      We couldn't find the page you were looking for 😢

      - -

      The URL may have been mistyped or the page may have moved:

      -
        -
      • Please try navigating back to the homepage to find what you are looking for.
      • -
      • Alternatively you can contact us here.
      • -
      -
      -
      - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/views/offline.html b/public/views/offline.html deleted file mode 100644 index 2473a51..0000000 --- a/public/views/offline.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - Page Not Found - - - - - - - - - - - - - - - - - - - - - - -
      -
      -

      Sorry, this app doesn't work offline yet 😢

      - -

      Please try reconnecting to the internet before trying to access this app.

      -
      -
      - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/views/register.html b/public/views/register.html deleted file mode 100644 index 2ed6dd9..0000000 --- a/public/views/register.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - Register - - - - - - - - - - - - - - - - - - - - -
      -
      -

      Sign up to request access to an administrator account.

      - -
      - -
      -
      - - -
      -
      - - -
      -
      - - -
      - - -
      - -
      -
      - -
      - - - - - - - - - - - - diff --git a/public/views/searchResults.html b/public/views/searchResults.html deleted file mode 100644 index fcd81bb..0000000 --- a/public/views/searchResults.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - Search Results - "{{params.query}}" - - - - - - - - - - - - - - - - - - - -
      - - - - - -
      - -
      - - - - - - - - - - diff --git a/routes/user.js b/routes/user.js index 70be33a..27e2dec 100644 --- a/routes/user.js +++ b/routes/user.js @@ -68,7 +68,7 @@ router.post('/register', (req, res) => { if (user) { // User exists errors.push({ msg: 'Email is already registered' }) - res.render('register', { + res.render('register', {page_name: "Register", extractStyles: true },{ errors, name, email, @@ -126,7 +126,7 @@ router.get('/search', jsonParser, (req, res) => { _id: query["query"] }) .then(results => { - res.render('searchResults', { page_name: "Search", layout: "layout2.ejs", extractStyles: true, results: results }); + res.render('searchResults', { page_name: "Search", layout: "layout2.ejs", extractStyles: true, results: results, results_count: results.length}); }) .catch(err => { console.log(err) @@ -174,7 +174,7 @@ router.post('/main_page', jsonParser, function (req, res) { }); -router.get('/info', (req, res) => res.render('info', { layout: "layout2.ejs", extractStyles: true })); +router.get('/info', (req, res) => res.render('info', { page_name: "Info", layout: "layout2.ejs", extractStyles: true })); router.post('/info', jsonParser, function (req, res) { const comment = req.body.comment; const query = req.body.query; diff --git a/server.js b/server.js deleted file mode 100644 index 97980ec..0000000 --- a/server.js +++ /dev/null @@ -1,302 +0,0 @@ -const http = require('http'); -const express = require('express'); -const request = require('request'); -const dotenv = require('dotenv'); -const mongodb = require('mongodb'); -const mongoose = require('mongoose'); -const MongoClient = require('mongodb').MongoClient; -const bodyParser = require('body-parser'); -const jsonParser = bodyParser.json(); -const locations = require('./machine_sites.json'); - -const app = express(); -app.use(express.static(__dirname)) - .use(bodyParser.urlencoded({extended: true})) - .use(bodyParser.json()); - -dotenv.config({path: './.env'}); - -/* =========================== DATABASE CONNECTION INFO ============================== */ -const user = process.env.DB_USER; -const pass = process.env.DB_PASS; -const uri = `mongodb+srv://${user}:${pass}@rpicampusmap-fwvzb.gcp.mongodb.net/test?retryWrites=true`; -const options = {useNewUrlParser: true}; -/* =================================================================================== */ - -/* ================================= SERVER START ==================================== */ -const port = process.env.PORT; - - -MongoClient.connect(uri, options, function(err, db) { - if (err) { - throw err; - } - else { - console.log("Database connected in route '/'!"); - let dbo = db.db("forgemill"); - - // Populate Database with locations if need be (ONLY FOR USERS WITH WRITE ACCESS). - // console.log(locations); - // dbo.collection("locations").insertMany(locations, {ordered: false}) - // .then(function(success) { - // console.log("Successfully added to database"); - // }) - // .catch(function(err) { - // console.error("ERROR:", err); - // }); - - - // Download initial location data from database before starting server - dbo.collection('locations').find().toArray() - .then(function(result) { - // console.log(result);(location - - var locationData = result; - - // Start server after initial database connection - app.listen(port); - console.log('Listening on port ' + port); - db.close(); - }) - .catch(function(err) { - if (err) throw err; - }); - - - } -}); -/* =================================================================================== */ - -/* =================================== HOMEPAGE ====================================== */ -app.get('/', function(req, res) { - /* - MongoClient.connect(uri, options, function(err, db) { - if (err) { - throw err; - } - else { - console.log("Database connected in route '/index'!"); - let dbo = db.db("locations"); - } - - db.close(); - }); - console.log("here") - */ - - res.sendFile(__dirname + '/public/views/index.html'); -}); - -app.route('/index') -.get(function(req, res) { - /* - MongoClient.connect(uri, options, function(err, db) { - if (err) { - throw err; - } - else { - console.log("Database connected in route '/index'!"); - let dbo = db.db("locations"); - } - - db.close(); - }); - console.log("here") - */ - - res.sendFile(__dirname + '/public/views/index.html'); - }) -.post(jsonParser, function(req, res) { - //get the location to highlight - const query = req.body.query; - const machine = req.body.machine; - console.log(req.body); - console.log("Query:", query); - console.log("Machine:", machine); - - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/index'!") - - let dbo = db.db("rpicampusmap"); - - // switch database if necessary - if (machine == "true") - dbo = db.db("forgemill"); - - dbo.collection("locations").find({'id': query}).toArray() - .then(function(result) { - console.log("Results:\n", result); - res.send(result); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); - db.close(); - } - }); - -}); -/* =================================================================================== */ - -/* ==================================== SEARCH ======================================= */ -app.route('/search') -.get(function(req, res) { - console.log(req.body); - console.log("Get search results!"); - res.sendFile(__dirname + '/public/views/searchResults.html'); -}) -.post(jsonParser, function(req, res) { - const query = req.body.query; - console.log("Query:", query); - - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/search'!") - let db1 = db.db("rpicampusmap"); - let db2 = db.db("forgemill"); - let results = []; - - // Search the database for locations matching the given regular expression - // Search by name and by nickname for any match of the substring - db1.collection("locations").find({'$or': [ - {'properties.name': {'$regex': query, '$options': 'i'} }, - {'properties.nick': {'$regex': query, '$options': 'i'} } - // add here to look through machines - ]}).toArray() - .then(function(result1) { - console.log("Result1:\n", result1); - results = results.concat(result1); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); - - db2.collection("locations").find({'$or': [ - {'properties.name': {'$regex': query, '$options': 'i'} }, - {'properties.nick': {'$regex': query, '$options': 'i'} }, - {'contents.machines': {'$regex': query, '$options': 'i'} } - ]}).toArray() - .then(function(result2) { - console.log("Result2:\n", result2); - results = results.concat(result2); - console.log("Results:\n", results); - res.send(results); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); - - db.close(); - } - }); - -}); - -/* ===================================== INFO ======================================== */ -app.route('/info') -.get(function (req, res) { - res.sendFile(__dirname + '/public/views/info.html') -}) -.post(jsonParser, function(req, res) { - const comment = req.body.comment; - const query = req.body.query; - const machine = req.body.machine; - console.log(req.body); - console.log("Query:", query); - console.log("Machine:", machine); - - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/info'!") - - let dbo = db.db("rpicampusmap"); - - // switch database if necessary - - if (machine == "true"){ - dbo = db.db("forgemill"); - } - - - dbo.collection("locations").find({'id': query}).toArray() - .then(function(result) { - console.log("Results:\n", result); - res.send(result); - }) - .catch(function(err) { - if (err) - console.error("ERROR:", err); - }); - db.close(); - } - }); - - if (comment) { - console.log(comment); - } - -}); - -/* ================================================================================== */ - -/* ==================================== ADMIN ======================================= */ -app.route('/admin/request') -.get(function (req, res) { - res.sendFile(__dirname + '/public/views/register.html'); -}) -.post(function (req, res, next) { - const username = req.body.rcsID; - const password = req.body.password; - - console.log("Username:", username); - console.log("Password:", password); - - MongoClient.connect(uri, options, function(err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/admin'!") - } - }); -}); - -app.route('/login') -.get(function (req, res) { - res.sendFile(__dirname + '/public/views/login.html'); -}) -.post(function (req, res) { - res.send("Logged in Successfully"); -}); - -app.route('/admin') -.get(function (req, res) { - // if (req.body.admin) - res.sendFile(__dirname + '/public/views/admin.html'); - // else - // res.sendFile(__dirname + '/public/views/login.html'); -}).post(function (req, res) { - console.log("Post request in /admin"); -}); - -/* ================================================================================== */ - -// Handle 404 - app.use(function(req, res) { - res.status(404) - .sendFile(__dirname + '/public/views/notfound.html', {error: '404: Page not Found'}); - }); - - // Handle 500 - app.use(function(error, req, res, next) { - res.status(500).send('Error 500: Internal Server Error'); - }); diff --git a/views/admin.ejs b/views/admin.ejs index b823d45..2cdcaa8 100644 --- a/views/admin.ejs +++ b/views/admin.ejs @@ -1,7 +1,7 @@ -
      +

      Hello <%= name %>

      \ No newline at end of file diff --git a/views/searchResults.ejs b/views/searchResults.ejs index f4e581f..b83ee9c 100644 --- a/views/searchResults.ejs +++ b/views/searchResults.ejs @@ -1,44 +1,45 @@ + - + - - \ No newline at end of file + + \ No newline at end of file From 7c2bcbbc77584625633c5451ccbc3d2282bf811c Mon Sep 17 00:00:00 2001 From: Unachieved Date: Sun, 16 Feb 2020 02:22:23 -0500 Subject: [PATCH 55/69] Clean_up-Jon --- README.md | 13 +- app.js | 8 +- config/auth.js | 1 + {public/style => css}/admin.css | 0 {public/style => css}/homepage.css | 0 {public/style => css}/layout.css | 0 {public/style => css}/layout2.css | 0 {public/style => css}/locationInfo.css | 0 {public/style => css}/login.css | 0 {public/style => css}/register.css | 0 {public/style => css}/searchResults.css | 0 {public/style => css}/style.css | 0 {public/style => css}/welcome.css | 0 {public/images => images}/campusmap_logo.png | Bin {public/images => images}/favicon.ico | Bin {public/images => images}/logo.png | Bin {public/images => images}/pin-128x128.png | Bin {public/images => images}/pin-144x144.png | Bin {public/images => images}/pin-152x152.png | Bin {public/images => images}/pin-192x192.png | Bin {public/images => images}/pin-256x256.png | Bin {public/images => images}/pin-512x512.png | Bin {public/images => images}/pin.png | Bin {public/images => images}/rensselaer_logo.png | Bin {public/images => images}/rpi_image.jpg | Bin {public/images => images}/seal.png | Bin public/mapApp.js | 20 - public/mapController.js | 47 - routes/geolocations.js | 1308 ----------------- routes/infoController.js | 39 - routes/machine_sites.js | 201 --- routes/map.js | 197 --- routes/mapApp.js | 20 - routes/mapController.js | 47 - {public => scripts}/controllers/admin.js | 0 .../controllers/infoController.js | 0 .../controllers/machineInfoController.js | 0 {public => scripts}/controllers/mapApp.js | 0 .../controllers/mapController.js | 0 .../controllers/searchController.js | 0 database.js => scripts/database.js | 2 +- {public => scripts/routes}/geolocations.js | 0 {public => scripts/routes}/imagePreview.js | 0 {routes => scripts/routes}/index.js | 3 +- {public => scripts/routes}/infoPreview.php | 0 {public => scripts/routes}/machine_sites.js | 0 {routes => scripts/routes}/main_page.js | 0 {public => scripts/routes}/map.js | 0 .../views => scripts/routes}/sw-register.js | 0 {routes => scripts/routes}/user.js | 40 +- scripts/temp.txt | 0 views/admin.ejs | 6 +- views/layout2.ejs | 2 +- views/login.ejs | 2 +- views/map.ejs | 12 +- views/notfound.ejs | 4 +- views/offline.ejs | 6 +- views/register.ejs | 2 +- views/searchResults.ejs | 5 +- views/welcome.ejs | 2 +- 60 files changed, 44 insertions(+), 1943 deletions(-) rename {public/style => css}/admin.css (100%) rename {public/style => css}/homepage.css (100%) rename {public/style => css}/layout.css (100%) rename {public/style => css}/layout2.css (100%) rename {public/style => css}/locationInfo.css (100%) rename {public/style => css}/login.css (100%) rename {public/style => css}/register.css (100%) rename {public/style => css}/searchResults.css (100%) rename {public/style => css}/style.css (100%) rename {public/style => css}/welcome.css (100%) rename {public/images => images}/campusmap_logo.png (100%) rename {public/images => images}/favicon.ico (100%) rename {public/images => images}/logo.png (100%) rename {public/images => images}/pin-128x128.png (100%) rename {public/images => images}/pin-144x144.png (100%) rename {public/images => images}/pin-152x152.png (100%) rename {public/images => images}/pin-192x192.png (100%) rename {public/images => images}/pin-256x256.png (100%) rename {public/images => images}/pin-512x512.png (100%) rename {public/images => images}/pin.png (100%) rename {public/images => images}/rensselaer_logo.png (100%) rename {public/images => images}/rpi_image.jpg (100%) rename {public/images => images}/seal.png (100%) delete mode 100644 public/mapApp.js delete mode 100644 public/mapController.js delete mode 100644 routes/geolocations.js delete mode 100644 routes/infoController.js delete mode 100644 routes/machine_sites.js delete mode 100644 routes/map.js delete mode 100644 routes/mapApp.js delete mode 100644 routes/mapController.js rename {public => scripts}/controllers/admin.js (100%) rename {public => scripts}/controllers/infoController.js (100%) rename {public => scripts}/controllers/machineInfoController.js (100%) rename {public => scripts}/controllers/mapApp.js (100%) rename {public => scripts}/controllers/mapController.js (100%) rename {public => scripts}/controllers/searchController.js (100%) rename database.js => scripts/database.js (88%) rename {public => scripts/routes}/geolocations.js (100%) rename {public => scripts/routes}/imagePreview.js (100%) rename {routes => scripts/routes}/index.js (82%) rename {public => scripts/routes}/infoPreview.php (100%) rename {public => scripts/routes}/machine_sites.js (100%) rename {routes => scripts/routes}/main_page.js (100%) rename {public => scripts/routes}/map.js (100%) rename {public/views => scripts/routes}/sw-register.js (100%) rename {routes => scripts/routes}/user.js (82%) create mode 100644 scripts/temp.txt diff --git a/README.md b/README.md index 9bc2cf7..d615b9d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,16 @@ We are currently in the middle of a large refactor, but heavy construction will ### Current Contributors: * Justin Gaskins -* Gabriel Wild +* Jon-Pierre Antoine +* Darrian Gardea +* Aidan Duane +* Cody Messina +* Kristina Adams + +### Project Managers: +* Spring 2020: Jon-Pierre Antoine +* Fall 2019: Justin Gaskins +* Spring 2019: ? ### Founders: * Justin Gaskins @@ -17,6 +26,8 @@ We are currently in the middle of a large refactor, but heavy construction will * Sebastien Boulas ### Version History: +* 2/16/2020 - v0.4.0 Login and registration implemented. Messages are flashed on error state i.e. invalid email, +user not found, login to see admin page etc. New welcome page also added (page before map access). Code has been rebased making it more modular. All html converted to ejs and views used (modularity). * 5/27/2019 - v0.3.0 All basic map functionality is now restored! You can show a location on the map from the info page, search for locations, or go to the information page from the location on the map. * 3/26/2019 - v0.2.0 Began refactor and translation from XAMPP to MEAN Stack! * 1/25/2019 - v0.1.0 Initial stages of functionality are complete! More locations and authorization will be added for the release of v1.0. diff --git a/app.js b/app.js index ddc0297..db0d83b 100644 --- a/app.js +++ b/app.js @@ -7,7 +7,7 @@ const flash = require('connect-flash'); const session = require('express-session'); const geolocations = require('./geolocations.json'); const Location = require('./models/Locations'); -const database = require('./database'); +const database = require('./scripts/database'); const assert = require('assert'); const app = express(); @@ -55,9 +55,9 @@ app.use((req, res, next) => { }); // Routers -app.use('/', require('./routes/index')); -app.use('/user', require('./routes/user')); -app.use( express.static( "public" ) ); +app.use('/', require('./scripts/routes/index')); +app.use('/user', require('./scripts/routes/user')); +app.use(express.static(__dirname)); const PORT = process.env.PORT || 5000; diff --git a/config/auth.js b/config/auth.js index cb150c1..efa4af4 100644 --- a/config/auth.js +++ b/config/auth.js @@ -3,6 +3,7 @@ module.exports = { ensureAuthenticated: function(req, res, next) { if(req.isAuthenticated()){ + console.log("checking auth"); return next(); } req.flash('error_msg', 'Please log in to view this resource'); diff --git a/public/style/admin.css b/css/admin.css similarity index 100% rename from public/style/admin.css rename to css/admin.css diff --git a/public/style/homepage.css b/css/homepage.css similarity index 100% rename from public/style/homepage.css rename to css/homepage.css diff --git a/public/style/layout.css b/css/layout.css similarity index 100% rename from public/style/layout.css rename to css/layout.css diff --git a/public/style/layout2.css b/css/layout2.css similarity index 100% rename from public/style/layout2.css rename to css/layout2.css diff --git a/public/style/locationInfo.css b/css/locationInfo.css similarity index 100% rename from public/style/locationInfo.css rename to css/locationInfo.css diff --git a/public/style/login.css b/css/login.css similarity index 100% rename from public/style/login.css rename to css/login.css diff --git a/public/style/register.css b/css/register.css similarity index 100% rename from public/style/register.css rename to css/register.css diff --git a/public/style/searchResults.css b/css/searchResults.css similarity index 100% rename from public/style/searchResults.css rename to css/searchResults.css diff --git a/public/style/style.css b/css/style.css similarity index 100% rename from public/style/style.css rename to css/style.css diff --git a/public/style/welcome.css b/css/welcome.css similarity index 100% rename from public/style/welcome.css rename to css/welcome.css diff --git a/public/images/campusmap_logo.png b/images/campusmap_logo.png similarity index 100% rename from public/images/campusmap_logo.png rename to images/campusmap_logo.png diff --git a/public/images/favicon.ico b/images/favicon.ico similarity index 100% rename from public/images/favicon.ico rename to images/favicon.ico diff --git a/public/images/logo.png b/images/logo.png similarity index 100% rename from public/images/logo.png rename to images/logo.png diff --git a/public/images/pin-128x128.png b/images/pin-128x128.png similarity index 100% rename from public/images/pin-128x128.png rename to images/pin-128x128.png diff --git a/public/images/pin-144x144.png b/images/pin-144x144.png similarity index 100% rename from public/images/pin-144x144.png rename to images/pin-144x144.png diff --git a/public/images/pin-152x152.png b/images/pin-152x152.png similarity index 100% rename from public/images/pin-152x152.png rename to images/pin-152x152.png diff --git a/public/images/pin-192x192.png b/images/pin-192x192.png similarity index 100% rename from public/images/pin-192x192.png rename to images/pin-192x192.png diff --git a/public/images/pin-256x256.png b/images/pin-256x256.png similarity index 100% rename from public/images/pin-256x256.png rename to images/pin-256x256.png diff --git a/public/images/pin-512x512.png b/images/pin-512x512.png similarity index 100% rename from public/images/pin-512x512.png rename to images/pin-512x512.png diff --git a/public/images/pin.png b/images/pin.png similarity index 100% rename from public/images/pin.png rename to images/pin.png diff --git a/public/images/rensselaer_logo.png b/images/rensselaer_logo.png similarity index 100% rename from public/images/rensselaer_logo.png rename to images/rensselaer_logo.png diff --git a/public/images/rpi_image.jpg b/images/rpi_image.jpg similarity index 100% rename from public/images/rpi_image.jpg rename to images/rpi_image.jpg diff --git a/public/images/seal.png b/images/seal.png similarity index 100% rename from public/images/seal.png rename to images/seal.png diff --git a/public/mapApp.js b/public/mapApp.js deleted file mode 100644 index 9c9c8ba..0000000 --- a/public/mapApp.js +++ /dev/null @@ -1,20 +0,0 @@ -const app = angular.module('CampusMap', []); - -let getParams = function() { - let params = {}; - let url = window.location + ''; - let queryString = url.split('?'); - - if (queryString.length == 1) { - console.log("no queries given"); - return null; - } - paramString = queryString[1].split('&'); - let param; - for (let i = 0; i < paramString.length; i++) { - param = paramString[i].split('='); - params[param[0]] = param[1]; - } - console.log(params); - return params; -} diff --git a/public/mapController.js b/public/mapController.js deleted file mode 100644 index b302fa6..0000000 --- a/public/mapController.js +++ /dev/null @@ -1,47 +0,0 @@ -app.controller('mapController', function($scope, $http) { - console.log("mapController activated!"); - - const parameters = getParams(); - console.log(parameters); - const location = parameters.loc; - $scope.isMachine = parameters.machine; - - if (parameters != null) { - $http.post(`/index?loc=${location}`, {query: location, machine: $scope.isMachine}) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); - - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = `Nicknames: ${httpResponse.data[0].properties.nick}`; - $scope.desc = httpResponse.data[0].properties.description; - - let latitude = httpResponse.data[0].geometry.coordinates[1]; - let longitude = httpResponse.data[0].geometry.coordinates[0]; - - let newPopupContent = ''; - if (httpResponse.data[0].properties.type == "machine") { - newPopupContent += `` - } - else { - console.log(httpResponse.data[0].properties.type); - newPopupContent += ``; - } - newPopupContent += ` - \ - \ - `; - - mymap.setView([latitude, longitude], 19); - let marker = L.marker([latitude, longitude]); - marker.addTo(mymap).bindPopup(newPopupContent).openPopup(); - // mymap.on('click', marker.remove()); - - }); - } - -}); diff --git a/routes/geolocations.js b/routes/geolocations.js deleted file mode 100644 index 713689f..0000000 --- a/routes/geolocations.js +++ /dev/null @@ -1,1308 +0,0 @@ -/* -Each point on the map is a "Feature" type object. These Features -specifically are "Points" that show on the map. -There are many methods that can be used on points, described here: -https://leafletjs.com/reference-1.3.4.html#point - -**IMPORTANT** -**Coordinates for Point objects are used backwards (long, lat) -for some reason according to the API** -*/ - -var locations = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "_id": "amos", - "id": "amos", - "properties": { - "name": "Amos Eaton Hall", - "nick": "JEC", - "category": "Academic & Research", - "description": "Math/CS Department", - "popupContent": "Amos Eaton" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.682596, 42.730189] - } - }, - { - "type": "Feature", - "_id": "carn", - "id": "carn", - "properties": { - "name": "Carnegie Building", - "nick": "CARNEG", - "category": "Academic & Research", - "description": "CogSci Department", - "popupContent": "Carnegie Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.68321, 42.730448] - } - }, - { - "type": "Feature", - "_id": "cbis", - "id": "cbis", - "properties": { - "name": "Center for Biotechnology and Interdisciplinary Studies", - "nick": "CBIS", - "category": "Academic & Research", - "description": "Biotech Building", - "popupContent": "Center for Biotechnology and Interdisciplinary Studies" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678419, 42.728252] - } - }, - { - "type": "Feature", - "_id": "cogs", - "id": "cogs", - "properties": { - "name": "Cogswell Laboratory", - "nick": "Cogswell", - "category": "Academic & Research", - "description": "Science Laboratory", - "popupContent": "Cogswell Laboratory" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681343, 42.728189] - } - }, - { - "type": "Feature", - "_id": "dcc", - "id": "dcc", - "properties": { - "name": "Darrin Communications Center", - "nick": "DCC, DARRIN", - "category": "Academic & Research", - "amenity": "CCPD, Starbucks, DCC Cafe", - "description": "One of the main lecture hall buildings on campus.", - "popupContent": "Darrin Communications Center" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.679059, 42.729226] - } - }, - { - "type": "Feature", - "_id": "empire", - "id": "empire", - "properties": { - "name": "Empire State Hall", - "nick": "Empire", - "category": "Academic & Research", - "description": "Building housing Cogswell Lab and Engineering department", - "popupContent": "Empire State Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.68217, 42.728373] - } - }, - { - "type": "Feature", - "_id": "empac", - "id": "empac", - "properties": { - "name": "Experimental Media and Performing Arts Center at Rensselaer", - "nick": "EMPAC", - "category": "Academic & Research", - "description": "Performing Arts", - "popupContent": "Experimental Media & Performing Arts Center" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.683828, 42.728883] - } - }, - { - "type": "Feature", - "_id": "lib", - "id": "lib", - "properties": { - "name": "Folsom Library", - "nick": "FOLSOM, LIB", - "category": "Academic & Research", - "amenity": "Observatory, Library Cafe", - "description": "Engineering Department", - "popupContent": "Folsom Library" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.682654, 42.729408] - } - }, - { - "type": "Feature", - "_id": "greene", - "id": "greene", - "properties": { - "name": "Greene Building", - "nick": "Greene", - "category": "Academic & Research", - "description": "Houses the Department of Architecture", - "popupContent": "Greene Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681216, 42.730023] - } - }, - { - "type": "Feature", - "_id": "jec", - "id": "jec", - "properties": { - "name": "Jonsson Engineering Center", - "nick": "JEC", - "category": "Academic & Research", - "description": "Engineering Department", - "popupContent": "Jonsson Engineering Center" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.6804, 42.72957] - } - }, - { - "type": "Feature", - "_id": "jrowl", - "id": "jrowl", - "properties": { - "name": "Jonsson Rowland Science Center", - "nick": "J-ROWL, JROWL", - "category": "Academic & Research", - "description": "Science Building", - "popupContent": "Jonsson-Rowland Science Center" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.680432, 42.728776] - } - }, - { - "type": "Feature", - "_id": "lally", - "id": "lally", - "properties": { - "name": "Lally Hall", - "nick": "LALLY", - "category": "Academic & Research", - "description": "IT Department", - "popupContent": "Lally Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681929, 42.73007] - } - }, - { - "type": "Feature", - "_id": "linac", - "id": "linac", - "properties": { - "name": "LINAC Facility (Gaerttner Laboratory)", - "nick": "LINAC", - "category": "Academic & Research", - "description": "What even is this bro lol", - "popupContent": "LINAC Facility" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.662296, 42.732647] - } - }, - { - "type": "Feature", - "_id": "cii", - "id": "cii", - "properties": { - "name": "Low Center for Industrial Innovation", - "nick": "LOW, CII", - "nicknames": ["low", "cii"], - "category": "Academic & Research", - "description": "Right side of the DCC", - "popupContent": "Low Center for Industrial Innovation" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.67921, 42.729732] - } - }, - { - "type": "Feature", - "_id": "mrc", - "id": "mrc", - "properties": { - "name": "Materials Research Center", - "nick": "MRC", - "category": "Academic & Research", - "description": "Right side of the DCC", - "popupContent": "Low Center for Industrial Innovation" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.682706, 42.72849] - } - }, - { - "type": "Feature", - "_id": "pitt", - "id": "pitt", - "properties": { - "name": "Pittsburgh Building", - "nick": "PITT", - "category": "Academic & Research", - "description": "Business Building", - "popupContent": "Pittsburgh Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.683313, 42.731174] - } - }, - { - "type": "Feature", - "_id": "rick", - "id": "rick", - "properties": { - "name": "Ricketts Building", - "nick": "Ricketts, RIC", - "category": "Academic & Research", - "description": "Who knows what's in here", - "popupContent": "Ricketts Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.679757, 42.730906] - } - }, - { - "type": "Feature", - "_id": "sage", - "id": "sage", - "properties": { - "name": "Russell Sage Laboratory", - "nick": "SAGE, RIC", - "category": "Academic & Research", - "amenity": "Sage Beanery", - "description": "Second biggest lecture hall on campus, not to be confused with Sage Dining Hall.", - "popupContent": "Russell Sage Laboratory" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681671, 42.730898] - } - }, - { - "type": "Feature", - "_id": "walk", - "id": "walk", - "properties": { - "name": "Walker Laboratory", - "nick": "WALKER", - "category": "Academic & Research", - "description": "Biochem laboratory building", - "popupContent": "Walker Laboratory" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.682562, 42.730863] - } - }, - { - "type": "Feature", - "_id": "west", - "id": "west", - "properties": { - "name": "West Hall", - "nick": "WEST", - "category": "Academic & Research", - "description": "Halfway down the hill, dumb far and haunted", - "popupContent": "West Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.683146, 42.731702] - } - }, - { - "type": "Feature", - "_id": "winslow", - "id": "winslow", - "properties": { - "name": "Winslow Building", - "nick": "Winslow", - "category": "Academic & Research", - "description": "Who knows what's in here", - "popupContent": "Winslow Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.684296, 42.730929] - } - }, - { - "type": "Feature", - "_id": "87", - "id": "87", - "properties": { - "name": "87 Gymnasium", - "nick": "87", - "category": "Student Life", - "description": "Open gyms for clubs or recreation", - "popupContent": "87 Gymnasium" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.67879, 42.73078] - } - }, - { - "type": "Feature", - "_id": "acad", - "id": "acad", - "properties": { - "name": "Academy Hall", - "nick": "ACADMY", - "category": "Student Life", - "amenity": "Student Health Center, Registrar, Bursar, Financial Aid, Student Success Office", - "description": "Various offices and the Academy Hall Auditorium", - "popupContent": "Academy Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678715, 42.727454] - } - }, - { - "type": "Feature", - "_id": "asrc", - "id": "asrc", - "properties": { - "name": "Alumni Sports & Recreation Center", - "nick": "ASRC", - "category": "Student Life", - "description": "???", - "popupContent": "Alumni Sports & Recreation Center" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.676878, 42.728467] - } - }, - { - "type": "Feature", - "_id": "anderson", - "id": "anderson", - "properties": { - "name": "Anderson Field", - "nick": "Rugby Field", - "category": "Student Life", - "description": "Used for rugby practice", - "popupContent": "Anderson Field" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.666956, 42.734426] - } - }, - { - "type": "Feature", - "_id": "chapel", - "id": "chapel", - "properties": { - "name": "Chapel + Cultural Center", - "nick": "Chapel", - "category": "Student Life", - "description": "On campus chapel", - "popupContent": "Chapel + Cultural Center" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.672276, 42.731818] - } - }, - { - "type": "Feature", - "_id": "commons", - "id": "commons", - "properties": { - "name": "Commons Dining Hall", - "nick": "Commons", - "category": "Student Life", - "description": "Largest dining hall on campus", - "popupContent": "Commons Dining Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.674332, 42.728289] - } - }, - { - "type": "Feature", - "_id": "ecav", - "id": "ecav", - "properties": { - "name": "East Campus Athletic Village Arena", - "nick": "ECAV", - "category": "Student Life", - "description": "Official basketball, volleyball courts", - "popupContent": "East Campus Athletic Village Arena (ECAV)" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.66743, 42.732301] - } - }, - { - "type": "Feature", - "_id": "ecavstad", - "id": "ecavstad", - "properties": { - "name": "East Campus Athletic Village Stadium", - "nick": "ECAV Stadium", - "category": "Student Life", - "description": "Official football field", - "popupContent": "East Campus Athletic Village Stadium" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.666954, 42.733093] - } - }, - { - "type": "Feature", - "_id": "houston", - "id": "houston", - "properties": { - "name": "Houston Field House", - "nick": "field house", - "category": "Student Life", - "description": "hockey events", - "popupContent": "Houston Field House" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.669483, 42.732059] - } - }, - { - "type": "Feature", - "_id": "mueller", - "id": "mueller", - "properties": { - "name": "Mueller Center", - "nick": "Mueller", - "category": "Student Life", - "description": "Multi-story weight and workout gym", - "popupContent": "Mueller Center" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.676902, 42.728829] - } - }, - { - "type": "Feature", - "_id": "play", - "id": "play", - "properties": { - "name": "Rensselaer Playhouse", - "nick": "Playhouse", - "category": "Student Life", - "description": "Drama club, plays are held here", - "popupContent": "Rensselaer Playhouse" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678227, 42.729227] - } - }, - { - "type": "Feature", - "_id": "radio", - "id": "radio", - "properties": { - "name": "Radio Club W2SZ", - "nick": "Radio", - "category": "Student Life", - "description": "RPI Student run radio station", - "popupContent": "Radio Club W2SZ" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.663192, 42.734229] - } - }, - { - "type": "Feature", - "_id": "union", - "id": "union", - "properties": { - "name": "Rensselaer Student Union", - "nick": "Union", - "category": "Student Life", - "amenity": "Rathskellar Dining (Cusato's Pizza, Collar City, Halal Shack, Thunder Mountain Curry), McNeil Room, Panera Bread, Union Games Room, Clubhouse Pub", - "description": "Oldest student run union blah blah blah", - "popupContent": "Rensselaer Student Union" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.676647, 42.729995] - } - }, - { - "type": "Feature", - "_id": "pool", - "id": "pool", - "properties": { - "name": "Robison Swimming Pool", - "nick": "Pool", - "category": "Student Life", - "description": "Multi-lane pool and open swim", - "popupContent": "Robison Swimming Pool" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.677313, 42.728007] - } - }, - { - "type": "Feature", - "_id": "sagedin", - "id": "sagedin", - "properties": { - "name": "Russell Sage Dining Hall", - "nick": "RSDH, Sage", - "category": "Student Life", - "amenity": "Sage-To-Go, Russell Sage Banquet Hall", - "description": "Dining hall on cmapus, not to be confused with Russell Sage Laboratory", - "popupContent": "Russell Sage Dining Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678264, 42.729778] - } - }, - { - "type": "Feature", - "_id": "barton", - "id": "barton", - "properties": { - "name": "Barton Hall", - "nick": "Barton", - "category": "Student Housing", - "description": "Most recently renoved residence hall on Freshman Hill", - "popupContent": "Barton Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.674091, 42.729136] - } - }, - { - "type": "Feature", - "_id": "blitman", - "id": "blitman", - "properties": { - "name": "Blitman Commons", - "nick": "blitman", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Blitman Commons" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.685893, 42.731215] - } - }, - { - "type": "Feature", - "_id": "bray", - "id": "bray", - "properties": { - "name": "Bray Hall", - "nick": "Bray, Freshman Five, Freshman Hill", - "category": "Student Housing", - "description": "One of five identical housing buildings in the 'Freshman Five'", - "popupContent": "Bray Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.673686, 42.728713] - } - }, - { - "type": "Feature", - "_id": "bryck", - "id": "bryck", - "properties": { - "name": "Bryckwyck", - "nick": "Bryck", - "category": "Student Housing", - "description": "Iss brick", - "popupContent": "Bryckwyck" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.663865, 42.734785] - } - }, - { - "type": "Feature", - "_id": "barh", - "id": "barh", - "properties": { - "name": "Burdett Avenue Residence Hall", - "nick": "BARH, BAR-H", - "category": "Student Housing", - "description": "Residence Hall on ECAV with its own dining hall.", - "popupContent": "Burdett Avenue Residence Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.671231, 42.731026] - } - }, - { - "type": "Feature", - "_id": "colonie", - "id": "colonie", - "properties": { - "name": "Colonie Apartments", - "nick": "Colonie", - "category": "Student Housing", - "description": "Deep Residence Hall", - "popupContent": "Colonie Apartments" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.669785, 42.737063] - } - }, - { - "type": "Feature", - "_id": "hall", - "id": "hall", - "properties": { - "name": "Hall Hall", - "nick": "Hall Hall", - "category": "Student Housing", - "description": "Freshman Five Residence Hall", - "popupContent": "Hall Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.675048, 42.728552] - } - }, - { - "type": "Feature", - "_id": "nason", - "id": "nason", - "properties": { - "name": "Nason Hall", - "nick": "Nason", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Nason Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.673598, 42.727664] - } - }, - { - "type": "Feature", - "_id": "north", - "id": "north", - "properties": { - "name": "North Hall", - "nick": "North", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "North Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.679844, 42.731357] - } - }, - { - "type": "Feature", - "_id": "nugent", - "id": "nugent", - "properties": { - "name": "Nugent Hall", - "nick": "Nugent", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Nugent Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.675031, 42.727411] - } - }, - { - "type": "Feature", - "_id": "poly", - "id": "poly", - "properties": { - "name": "Polytechnic Residence Commons", - "nick": "Poly", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Polytechnic Residence Commons" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.679528, 42.722276] - } - }, - { - "type": "Feature", - "_id": "quad", - "id": "quad", - "properties": { - "name": "Quadrangle Complex", - "nick": "Quad", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Quadrangle Complex" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.677616, 42.730189] - } - }, - { - "type": "Feature", - "_id": "rahpsa", - "id": "rahpsa", - "properties": { - "name": "Rensselaer Apartment Housing Project A", - "nick": "RAHPS A, RAHP", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Rensselaer Apartment Housing Project A" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.669557, 42.730833] - } - }, - { - "type": "Feature", - "_id": "rahpsb", - "id": "rahpsb", - "properties": { - "name": "Rensselaer Apartment Housing Project B", - "nick": "RAHPS B, RAHP", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Rensselaer Apartment Housing Project" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.665257, 42.734795] - } - }, - { - "type": "Feature", - "_id": "rousseau", - "id": "rousseau", - "properties": { - "name": "Rousseau Apartments", - "nick": "Rousseau, Stack, Stacwyck", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Rousseau Apartments (Stacwyck)" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.664306, 42.734362] - } - }, - { - "type": "Feature", - "_id": "sharp", - "id": "sharp", - "properties": { - "name": "Sharp Hall", - "nick": "Sharp", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Sharp Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.674582, 42.727008] - } - }, - { - "type": "Feature", - "_id": "stack", - "id": "stack", - "properties": { - "name": "Stacwyck Apartments", - "nick": "Staccc, Stack", - "category": "Student Housing", - "description": "The Thiccest Residence Hall", - "popupContent": "Blitman Commons" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.664715, 42.733772] - } - }, - { - "type": "Feature", - "_id": "warren", - "id": "warren", - "properties": { - "name": "Warren Hall", - "nick": "Warren", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Warren Hall" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.67525, 42.727911] - } - }, - { - "type": "Feature", - "_id": "williams", - "id": "williams", - "properties": { - "name": "Williams Apartments", - "nick": "Williams, Stack", - "category": "Student Housing", - "description": "Residence Hall", - "popupContent": "Williams Apartments" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.664544, 42.733971] - } - }, - { - "type": "Feature", - "_id": "exops", - "id": "exops", - "properties": { - "name": "2021 15th Street", - "nick": "Government & Community Relations, Media Relations", - "category": "Operations & Administration", - "description": "External Relations offices", - "popupContent": "2021 15th Street" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.676977, 42.732908] - } - }, - { - "type": "Feature", - "_id": "parking", - "id": "parking", - "properties": { - "name": "2144 Burdett Avenue", - "nick": "Parking Building", - "category": "Operations & Administration", - "description": "Go here for parking pass stuffs", - "popupContent": "2144 Burdett Avenue" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.671402, 42.732192] - } - }, - { - "type": "Feature", - "_id": "419th", - "id": "419th", - "properties": { - "name": "41 Ninth Street", - "nick": "41 Ninth Street", - "category": "Operations & Administration", - "description": "what even is this", - "popupContent": "41 Ninth Street" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.682864, 42.732476] - } - }, - { - "type": "Feature", - "_id": "admissions", - "id": "admissions", - "properties": { - "name": "Admissions Building", - "nick": "Admissions", - "category": "Operations & Administration", - "description": "Admissions office is located here", - "popupContent": "Admissions Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.675528, 42.730648] - } - }, - { - "type": "Feature", - "_id": "alumni", - "id": "alumni", - "properties": { - "name": "Heffner Alumni House", - "nick": "Heffner Alumni House", - "category": "Operations & Administration", - "description": "alumni events", - "popupContent": "Alumni House (Heffner)" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678216, 42.732883] - } - }, - { - "type": "Feature", - "_id": "blaw", - "id": "blaw", - "properties": { - "name": "Blaw Knox 1 & 2", - "nick": "Blaw", - "category": "Operations & Administration", - "description": "Rusty building", - "popupContent": "Blaw Knox 1 & 2" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.680893, 42.732037] - } - }, - { - "type": "Feature", - "_id": "alumni", - "id": "alumni", - "properties": { - "name": "Heffner Alumni House", - "nick": "Heffner Alumni House", - "category": "Operations & Administration", - "description": "alumni events", - "popupContent": "Alumni House (Heffner)" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678216, 42.732883] - } - }, - { - "type": "Feature", - "_id": "boiler11", - "id": "boiler11", - "properties": { - "name": "Boiler House, 11th Street", - "nick": "Boiler House", - "category": "Operations & Administration", - "description": "Non-Student Mail service", - "popupContent": "Boiler House, 11th Street" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.680229, 42.73268] - } - }, - { - "type": "Feature", - "_id": "boilersage", - "id": "boilersage", - "properties": { - "name": "Boiler House, Sage Avenue", - "nick": "Boiler House", - "category": "Operations & Administration", - "description": "Non-Student Mail service", - "popupContent": "Boiler House, Sage Avenue" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681762, 42.73117] - } - }, - { - "type": "Feature", - "_id": "grad", - "id": "grad", - "properties": { - "name": "Graduate Education", - "nick": "Graduate Education", - "category": "Operations & Administration", - "description": "Graduate Education office building", - "popupContent": "Graduate Education" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.675926, 42.732659] - } - }, - { - "type": "Feature", - "_id": "grounds", - "id": "grounds", - "properties": { - "name": "Greenhouses and Grounds Barn", - "nick": "Greenhouses and Grounds Barn", - "category": "Operations & Administration", - "description": "Site for plants for Grounds crew", - "popupContent": "Greenhouses and Grounds Barn" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.66791, 42.728718] - } - }, - { - "type": "Feature", - "_id": "hbuild", - "id": "hbuild", - "properties": { - "name": "H Building", - "nick": "H Building", - "category": "Operations & Administration", - "description": "What is in here?", - "popupContent": "H Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.679231, 42.732592] - } - }, - { - "type": "Feature", - "_id": "jbuild", - "id": "jbuild", - "properties": { - "name": "J Building", - "nick": "J Building", - "category": "Operations & Administration", - "description": "Storage??", - "popupContent": "J Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.679803, 42.733148] - } - }, - { - "type": "Feature", - "_id": "patroon", - "id": "patroon", - "properties": { - "name": "Patroon Manor", - "nick": "Patroon Manor", - "category": "Operations & Administration", - "description": "Private property?", - "popupContent": "Patroon Manor" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.663714, 42.736883] - } - }, - { - "type": "Feature", - "_id": "pubsafe", - "id": "pubsafe", - "properties": { - "name": "Public Safety", - "nick": "pubsafe", - "category": "Operations & Administration", - "description": "pubsafe Building", - "popupContent": "Public Safety" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.677031, 42.729261] - } - }, - { - "type": "Feature", - "_id": "service", - "id": "service", - "properties": { - "name": "Service Building", - "nick": "Service", - "category": "Operations & Administration", - "description": "Various servicing services", - "popupContent": "Service Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681052, 42.732793] - } - }, - { - "type": "Feature", - "_id": "troy", - "id": "troy", - "properties": { - "name": "Troy Building", - "nick": "TROY", - "category": "Operations & Administration", - "description": "Location of President Jackson's office", - "popupContent": "Troy Building" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.680525, 42.731029] - } - }, - { - "type": "Feature", - "_id": "vcc", - "id": "vcc", - "properties": { - "name": "Voorhees Computing Center", - "nick": "VCC", - "category": "Operations & Administration", - "description": "An old converted chapel, it is now the central building for all issues computer related", - "popupContent": "Voorhees Computing Center (VCC)" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681755, 42.729231] - } - }, - { - "type": "Feature", - "_id": "garage", - "id": "garage", - "properties": { - "name": "College Ave Parking Garage", - "nick": "Parking Garage", - "category": "Operations & Administration", - "description": "Multilevel parking garage, located off College Ave, close to EMPAC", - "popupContent": "College Ave Parking Garage" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.681549, 42.727745] - } - }, - { - "type": "Feature", - "_id": "sigep", - "id": "sigep", - "properties": { - "name": "Sigma Phi Epsilon (ΣΦΕ)", - "nick": "SigEp, SPE", - "category": "Fraternity/Sorrority", - "description": "10/10 would recommend", - "popupContent": "Sigma Phi Epsilon (ΣΦΕ)" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.677091, 42.732331] - } - } - ] -}; - -/* -Locations: -ACADEMIC & RESEARCH -Amos Eaton Hall -Carnegie Building -Center for Biotechnology and Interdisciplinary Studies (CBIS) -Cogswell Laboratory -Darrin Communications Center -Empire State Hall -Experimental Media & Performing Arts Center (EMPAC) -Folsom Library -Greene Building -Jonsson Engineering Center (JEC) -Jonsson-Rowland Science Center -Lally Hall -LINAC Facility (Gaerttner Laboratory) -Low Center for Industrial Innovation (CII) -Materials Research Center (MRC) -Pittsburgh Building -Ricketts Building -Russell Sage Laboratory -Walker Laboratory -West Hall -Winslow Building - -STUDENT LIFE -87 Gymnasium -Academy Hall -Alumni Sports & Recreation Center -Chapel + Cultural Center -Commons Dining Hall -East Campus Athletic Village Arena (ECAV) -East Campus Athletic Village Stadium -Houston Field House -Mueller Center -Playhouse -Radio Club W2SZ -Rensselaer Union -Robison Swimming Pool -Russell Sage Dining Hall - -STUDENT HOUSING -Barton Hall -Blitman Commons -Bray Hall -Bryckwyck -Burdett Avenue Residence Hall -Colonie Apartments -Hall Hall -Nason Hall -North Hall -Nugent Hall -Polytechnic Residence Commons -Quadrangle Complex -Rensselaer Apartment Housing Project A -Rensselaer Apartment Housing Project B -Rousseau Apartments -Sharp Hall -Stacwyck Apartments -Warren Hall -Williams Apartments - -OPERATIONS & ADMINISTRATION -2021 15th Street -2144 Burdett Avenue -41 Ninth Street -Admissions -Alumni House (Heffner) -Blaw-Knox 1 & 2 -Boiler House, 11th Street -Boiler House, Sage Avenue -Graduate Education -Greenhouses and Grounds Barn -H Building -J Building -Patroon Manor -Public Safety -Service Building -Troy Building -Voorhees Computing Center (VCC) - -PARKING -Parking Garage -*/ diff --git a/routes/infoController.js b/routes/infoController.js deleted file mode 100644 index 4775195..0000000 --- a/routes/infoController.js +++ /dev/null @@ -1,39 +0,0 @@ -mapApp.controller('infoController', function($scope, $http) { - console.log("infoController activated!"); - - const location = getParams(); - console.log(location); - - $http.post(`/info?loc=${location.loc}`, {query: location.loc}) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); - - $scope.id = location.loc; - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; - $scope.desc = httpResponse.data[0].properties.description; - }); - - $scope.comment = function(title, body) { - if (!title || !body) return; - - let data = { - comment: { - title: title, - body: body - } - }; - - console.log(data); - - $http.post(`/info?loc=${location.loc}`, data) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); - - $scope.cmtTitle = ""; - $scope.cmtBody = ""; - }); - } -}); diff --git a/routes/machine_sites.js b/routes/machine_sites.js deleted file mode 100644 index 40ece21..0000000 --- a/routes/machine_sites.js +++ /dev/null @@ -1,201 +0,0 @@ -var locations_shops = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "id": "jec_shop", - "properties": { - "name": "JEC Student Machines Shop", - "nick": "Processes Shop", - "thumbnail":"https://www.rpiviews.com/images/rpi/card00188_fr.jpg", - "description": "Machine Shop located in JEC", - "popupContent": "JEC Student Machines Shop", - "type": "machine" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.680042, 42.729716] - }, - "room": { - "hours": { - "mon":"9 a.m.-noon and 2-8 p.m.", - "tues":"9 a.m.—noon and 1-7 p.m. ", - "weds": "10 a.m.—1 p.m. and 2-8 p.m.", - "thurs":"9 a.m.—noon and 2-8 p.m.", - "fri":"8-11 a.m. and noon-3 p.m.", - "sat":"11 a.m. -3 p.m.,", - "sun":"2-6 p.m." - }, - "info": "All students who intend to use the machines in this room\n\ - must pass the SOE Safety Test Rensselaer Manufacturing and Prototyping\n\ - Laboratories-Safety Orientation listed on RPI HR Skillport Site. \n\ - They must show proof of taking and passing the class to shop supervisors.\n\ - Afterwards, all students are welcome to use the machines in the JEC Student Machines Shop.\n\ - No prior knowledge of machining is required. However, it is recommended\n\ - that students take Engineering Processes (ENGR 1300).", - "location": "Jonsson Engineering Center (JEC) 1010" - }, - "contents": { - "machines": ["Haas TL 1 CNC Lathe", "Acer 3-Axis CNC Milling Machine", - "Laguna Swift 4’x4’ CNC Router", "Thunder Mars90 100w laser Cutter", - "Snap-on Sandblaster", "General Machining and Fabrication Equipment", - "Metal and Plastic Forming and Shearing Equipment", - "Steel and Plastic Welding Equipment" ], - "available_materials": "", - "equipment": "" - } - }, - { - "type": "Feature", - "id": "ied_shop", - "properties": { - "name": "Design Lab/IED Shop", - "nick": "IED Shop", - "thumbnail": "", - "description": "Machine Shop located in JEC", - "popupContent": "Design Lab/IED Shop", - "type": "machine" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.68053,42.729704] - }, - "room": { - "hours": { - "mon":"9 am - 4 pm and 5-9 pm", - "tues":"9 am - 4 pm and 5-9 pm", - "weds":"9 am - 4 pm and 5-9 pm", - "thurs":"9 am - 4 pm and 5-9 pm", - "fri":"9 am - 4 pm and 5-7 pm", - "sat":"", - "sun":"" - }, - "info": "All students who intend to use the machines in this room\n\ - must pass the SOE Safety Test Rensselaer Manufacturing and Prototyping\n\ - Laboratories-Safety Orientation listed on RPI HR Skillport Site. \n\ - They must show proof of taking and passing the class to shop supervisors.\n\ - Afterwards, usage of machines is determined on case-by-case basis.\n\ - Students are always welcome to see the shop supervisor to discuss their projects.", - "location": "Jonsson Engineering Center (JEC) Room 2332" - }, - "contents": { - "machines": ["Haas CNC Control Simulators", "Haas Mini Mill", "Haas SL 10", - "Haas Super VF 2", "Haas Tool Room Mill", "Mitutoyo Crysta-Plus M574 CMM", - "Paint Booth", "General Machining and Fabrication Equipment", - "Electronic Scopes and Meters"], - "available_materials": "", - "equipment": "" - } - }, - { - "type": "Feature", - "id": "forge_shop", - "properties": { - "name": "Maker Space: The Forge", - "nick": "The Forge", - "thumbnail": "http://manufacturing.eng.rpi.edu/sites/default/files/facilities/Forge.jpg", - "description": "Maker Space located in", - "popupContent": "Design Lab/IED Shop", - "type": "machine" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.678974, 42.729574] - }, - "room": { - "hours": { - "mon":"", - "tues":"", - "weds": "", - "thurs":"", - "fri":"", - "sat":"", - "sun":"" - }, - "info": "The Forge charges $10 per semester for students to gain access to\n\ - all of the machines. Afterwards, students are charged $0.05/gram of filament\n\ - for the 3D Printer and $0.50 per hour of light time for the laser cutter.", - "location": "George M. Low Center for Industrial Innovation (CII) Room 2037" - }, - "contents": { - "machines": ["3D Scanners","Form 1+ 3D Printer","gCreate 3D Printer", - "Laser Cutter","Makerbot Mini","Makerbot Z18’s","Prusa i3’s", - "Sewing Machine","Taz 5","Taz Mini","Taz MOAR-Struder","Taz Quadfusion", - "Vinyl Cutter"], - "available_materials": ["PLA", "ABS", "PETG"], - "equipment": "" - } - }, - { - "type": "Feature", - "id": "mill_shop", - "properties": { - "name": "Manufacturing Innovation Learning Laboratory", - "nick": "The MILL", - "thumbnail":"", - "description": "Manufacturing/maching shop located in the CII.", - "popupContent": "Manufacturing Innovation Learning Laboratory", - "type": "machine" - }, - "geometry": { - "type": "Point", - "coordinates": [-73.679208, 42.72975] - }, - "room": { - "hours": { - "mon":"", - "tues":"", - "weds": "", - "thurs":"", - "fri":"", - "sat":"", - "sun":"" - }, - "info": "All students who intend to use the machines in this room\n\ - must pass the SOE Safety Test Rensselaer Manufacturing and Prototyping\n\ - Laboratories-Safety Orientation listed on RPI HR Skillport Site. \n\ - They must show proof of taking and passing the class to shop supervisors.\n\ - Afterwards, usage of machines is determined on case-by-case basis.\n\ - Students are always welcome to see the shop supervisor to discuss their projects.", - "location": "George M. Low Center for Industrial Innovation (CII) Room 1027" - }, - "contents": { - "machines": ["Haas VF 1 – CNC Milling Machine", - "Haas OM-2 CNC Milling Machine", - "Moore Nanotechnology Systems 350 UPL Lathe", - "Hurricane Laser Cutter Category 4 Charley 80W", - "Adept Cobra 800 SCARA Robot", - "SONY Conveyor System", - "Staubli RX 90 Robot", - "Fanuc LR Mate, with Vision, Robot Educational Training System", - "Stratasys Dimension FDM Machine", - "Stratasys UPrint FDM Machine", - "Z-Corporation Z310 3D Printer", - "B-9 Creator Stereolithography Printer", - "Phenix Direct Metal Selective Laser Sintering 3D Printer", - "Brown and Sharpe Gage 2000 CMM", - "Faro Platinum Inspection Arm", - "Arburg Allrounder 270c Injection Molder", - "Arburg Allrounder 221k Injection Molder", - "Battenfeld Injection Molder", - "Formech 660 Vacuum Former", - "Flow Mach2 Abrasive Water-Jet Cutter", - "Sonitek S840 Ultrasonic Welder", - "Sonitek TS500 Thermal Press", - "Branson Ultrasonic Welder 2000 D", - "Branson Ultrasonic Welder 2000 DT", - "General Machining Equipment"], - "available_materials": [], - "equipment": "" - } - } - ] -}; - -/* -Locations: -JEC Student Machines Shop -Design Lab/IED Shop -Maker Space: The Forge -Manufacturing Innovation Learning Laboratory -*/ diff --git a/routes/map.js b/routes/map.js deleted file mode 100644 index 2e73a9a..0000000 --- a/routes/map.js +++ /dev/null @@ -1,197 +0,0 @@ -/* -* This is the main file responsible for handling the map. -* -* In all locations below, "L" refers to the Leaflet API. - -Each point on the map is a "Feature" type object. These Features -specifically are "Points" that show on the map. -There are many methods that can be used on points, described here: -https://leafletjs.com/reference-1.3.4.html#point - -**IMPORTANT** -**Coordinates for Point objects are used backwards (long, lat) -for some reason according to the API** -*/ - - -/* -Display the map on the page at id 'map' - -setView() focuses the map around the given point. -In this case, it does so on creation of the map (pageload) -Usage: setView([latitude, longitude], zoomlevel) -*/ - -let mymap = L.map('mapContainer', { - center: [42.729453, -73.6802], - zoom: 16, - layers: [] -}) - -/* -Tile Layer is the display style (satellite, street, etc.) -Attribution refers to the creeator of the layer (accreditation) -*/ -L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { - maxZoom: 18, - attribution: 'Map data © OpenStreetMap contributors, ' + - 'CC-BY-SA, ' + - 'Imagery © Mapbox', - id: 'mapbox.streets' -}).addTo(mymap); - - -// Highlight campus on the map using points as an outline, connect-the-dots style -const campus = [ - [42.728116, -73.684807], - [42.73027, -73.684294], - [42.730538, -73.686504], - [42.733585, -73.685709], - [42.733408, -73.684616], - [42.73396, -73.682277], - [42.732967, -73.676569], - [42.738941, -73.674831], - [42.737521, -73.665197], - [42.737805, -73.662837], - [42.733979, -73.66342], - [42.730811, -73.667131], - [42.732214, -73.671357], - [42.726067, -73.673395], - [42.728116, -73.684765] -]; -L.polygon(campus, {color: 'gray', opacity: 0.1}).addTo(mymap); - -// Default popup object that would show on the map if a nonregistered point is clicked -const popup = L.popup(); - -/** - * Perform the following operations every time the map layer is clicked - * @param e an event, in this case a click - */ -const onMapClick = function(e) { - popup - .setLatLng(e.latlng) - .setContent("You clicked the map at " + e.latlng.toString()) - .openOn(mymap); -} - -mymap.on('click', onMapClick); - -/** - * Fetch the coordinates of a location in an array [longitude, latitude] - * @param id The id of the given location - */ -const getCoords = function(id) { - for (let i=0; i < locations['features'].length; i++) { - if (locations['features'][i]['id'] == id) { - point = locations['features'][i]['geometry']['coordinates']; - return point; - } - } - return 0; -} - -/** - * Binds properties to each Feature in a Feature Collection - * @param feature the feature object that will be operated on - * @param layer the layer the feature will be added to - */ -const onEachFeature = function(feature, layer) { - // does this feature have a property named popupContent? - if (feature.properties && feature.properties.popupContent) { - layer.bindPopup(`
      ${feature.properties.popupContent}
      `); - - const building = feature.id; - const point = getCoords(building); - console.log(feature.properties); - let newPopupContent = ''; - if (feature.properties.type == "machine") { - newPopupContent += `` - } - else { - newPopupContent += ``; - } - newPopupContent += ` - \ - \ - `; - layer.bindPopup(newPopupContent); - } -} - -//Array of circleMarkers -let locations_arr = []; -let locations_shops_arr = []; - -/** - * Style and add the campus points to the map -*/ - -L.geoJSON(locations, { - style: function (feature) { - return feature.properties && feature.properties.style; - }, - // For each feature added to the map, it will perform the onEachFeature() function - onEachFeature: onEachFeature, - - // Adds a circleMarker at the point specified by the coords of the feature - pointToLayer: function (feature, latlng) { - const campus_circle_settings = { - radius: 8, - fillColor: "#ff7800", - color: "#000", - weight: 1, - opacity: 1, - fillOpacity: 0.8 - } - locations_arr.push(L.circleMarker(latlng,campus_circle_settings)); - return locations_arr[locations_arr.length-1]; - }, -}); - -/** - * Style and add the machine site points to the map -*/ -L.geoJSON(locations_shops, { - style: function (feature) { - return feature.properties && feature.properties.style; - }, - // For each feature added to the map, it will perform the onEachFeature() function - onEachFeature: onEachFeature, - - // Adds a circleMarker at the point specified by the coords of the feature - pointToLayer: function (feature, latlng) { - const machine_circle_settings = { - // circleMarker shows at the Point's location - radius: 8, - fillColor: "#0000ff", - color: "#000", - weight: 1, - opacity: 1, - fillOpacity: 0.8 - } - locations_shops_arr.push(L.circleMarker(latlng,machine_circle_settings)); - return locations_shops_arr[locations_shops_arr.length-1]; - }, -}); - - -/* Creating layer groups to hold arrays of locations -* These layer groups will be added to the map, and will be represented by -* the map keys. The maps keys filter which dots are shown on the map. -*/ -let campus_locations_layer = L.layerGroup(locations_arr); -let machine_locations_layer = L.layerGroup(locations_shops_arr); - -let overlayMaps = { - "Campus Locations": campus_locations_layer, - "Machine Shop Locations": machine_locations_layer - // add more layer groups here -}; - -// adding the layer groups in overlayMaps to the map (but it doesn't render yet) -L.control.layers(null, overlayMaps).addTo(mymap); diff --git a/routes/mapApp.js b/routes/mapApp.js deleted file mode 100644 index 431122a..0000000 --- a/routes/mapApp.js +++ /dev/null @@ -1,20 +0,0 @@ -const mapApp = angular.module('CampusMap', []); - -let getParams = function() { - let params = {}; - let url = window.location + ''; - let queryString = url.split('?'); - - if (queryString.length == 1) { - console.log("no queries given"); - return null; - } - paramString = queryString[1].split('&'); - let param; - for (let i = 0; i < paramString.length; i++) { - param = paramString[i].split('='); - params[param[0]] = param[1]; - } - console.log(params); - return params; -} diff --git a/routes/mapController.js b/routes/mapController.js deleted file mode 100644 index ebaea9b..0000000 --- a/routes/mapController.js +++ /dev/null @@ -1,47 +0,0 @@ -mapApp.controller('mapController', function($scope, $http) { - console.log("mapController activated!"); - - const parameters = getParams(); - console.log(parameters); - const location = parameters.loc; - $scope.isMachine = parameters.machine; - - if (parameters != null) { - $http.post(`/index?loc=${location}`, {query: location, machine: $scope.isMachine}) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); - - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = `Nicknames: ${httpResponse.data[0].properties.nick}`; - $scope.desc = httpResponse.data[0].properties.description; - - let latitude = httpResponse.data[0].geometry.coordinates[1]; - let longitude = httpResponse.data[0].geometry.coordinates[0]; - - let newPopupContent = ''; - if (httpResponse.data[0].properties.type == "machine") { - newPopupContent += `` - } - else { - console.log(httpResponse.data[0].properties.type); - newPopupContent += ``; - } - newPopupContent += ` - \ - \ - `; - - mymap.setView([latitude, longitude], 19); - let marker = L.marker([latitude, longitude]); - marker.addTo(mymap).bindPopup(newPopupContent).openPopup(); - // mymap.on('click', marker.remove()); - - }); - } - -}); diff --git a/public/controllers/admin.js b/scripts/controllers/admin.js similarity index 100% rename from public/controllers/admin.js rename to scripts/controllers/admin.js diff --git a/public/controllers/infoController.js b/scripts/controllers/infoController.js similarity index 100% rename from public/controllers/infoController.js rename to scripts/controllers/infoController.js diff --git a/public/controllers/machineInfoController.js b/scripts/controllers/machineInfoController.js similarity index 100% rename from public/controllers/machineInfoController.js rename to scripts/controllers/machineInfoController.js diff --git a/public/controllers/mapApp.js b/scripts/controllers/mapApp.js similarity index 100% rename from public/controllers/mapApp.js rename to scripts/controllers/mapApp.js diff --git a/public/controllers/mapController.js b/scripts/controllers/mapController.js similarity index 100% rename from public/controllers/mapController.js rename to scripts/controllers/mapController.js diff --git a/public/controllers/searchController.js b/scripts/controllers/searchController.js similarity index 100% rename from public/controllers/searchController.js rename to scripts/controllers/searchController.js diff --git a/database.js b/scripts/database.js similarity index 88% rename from database.js rename to scripts/database.js index 18b50e5..28a7cbd 100644 --- a/database.js +++ b/scripts/database.js @@ -1,7 +1,7 @@ const mongoose = require('mongoose'); // DB Config -const db = require('./config/keys').MongoURI; +const db = require('../config/keys').MongoURI; // Connect to Mongo class Database { diff --git a/public/geolocations.js b/scripts/routes/geolocations.js similarity index 100% rename from public/geolocations.js rename to scripts/routes/geolocations.js diff --git a/public/imagePreview.js b/scripts/routes/imagePreview.js similarity index 100% rename from public/imagePreview.js rename to scripts/routes/imagePreview.js diff --git a/routes/index.js b/scripts/routes/index.js similarity index 82% rename from routes/index.js rename to scripts/routes/index.js index 0db4489..383e6da 100644 --- a/routes/index.js +++ b/scripts/routes/index.js @@ -1,12 +1,13 @@ const express = require('express'); const router = express.Router(); var path = require("path"); -const {ensureAuthenticated} = require('../config/auth'); +const {ensureAuthenticated} = require('../../config/auth'); router.get('/', (req, res) => res.render('welcome', {page_name: "Welcome", layout: "layout.ejs", extractStyles: true})); router.get('/admin', ensureAuthenticated, (req, res) => res.render('admin', { + page_name: "Admin", name: req.user.name, layout: "layout2.ejs", extractStyles: true diff --git a/public/infoPreview.php b/scripts/routes/infoPreview.php similarity index 100% rename from public/infoPreview.php rename to scripts/routes/infoPreview.php diff --git a/public/machine_sites.js b/scripts/routes/machine_sites.js similarity index 100% rename from public/machine_sites.js rename to scripts/routes/machine_sites.js diff --git a/routes/main_page.js b/scripts/routes/main_page.js similarity index 100% rename from routes/main_page.js rename to scripts/routes/main_page.js diff --git a/public/map.js b/scripts/routes/map.js similarity index 100% rename from public/map.js rename to scripts/routes/map.js diff --git a/public/views/sw-register.js b/scripts/routes/sw-register.js similarity index 100% rename from public/views/sw-register.js rename to scripts/routes/sw-register.js diff --git a/routes/user.js b/scripts/routes/user.js similarity index 82% rename from routes/user.js rename to scripts/routes/user.js index 27e2dec..b917338 100644 --- a/routes/user.js +++ b/scripts/routes/user.js @@ -7,15 +7,15 @@ const mongoose = require('mongoose'); const jsonParser = bodyParser.json(); // UserModel -const User = require('../models/User'); -const Location = require('../models/Locations'); +const User = require('../../models/User'); +const Location = require('../../models/Locations'); // login page router.get('/login', (req, res) => res.render('login', { page_name: "Login", layout: "layout2.ejs", extractStyles: true })); // Login Handle router.post('/login', (req, res, next) => { - console.log('authenticating'); + console.log('authenticating\n'); passport.authenticate('local', { successRedirect: '/admin', failureRedirect: '/user/login', @@ -138,40 +138,6 @@ router.get('/search', jsonParser, (req, res) => { // main page --- the map router.get('/main_page', (req, res) => res.render('map', { page_name: "Map", layout: "layout2.ejs", extractStyles: true })); -router.post('/main_page', jsonParser, function (req, res) { - //get the location to highlight - const query = req.body.query; - const machine = req.body.machine; - console.log(req.body); - console.log("Query:", query); - console.log("Machine:", machine); - - MongoClient.connect(uri, options, function (err, db) { - if (err) - throw err; - else { - console.log("Database connected in route '/index'!") - - let dbo = db.db("rpicampusmap"); - - // switch database if necessary - if (machine == "true") - dbo = db.db("forgemill"); - - dbo.collection("locations").find({ 'id': query }).toArray() - .then(function (result) { - console.log("Results:\n", result); - res.send(result); - }) - .catch(function (err) { - if (err) - console.error("ERROR:", err); - }); - db.close(); - } - }); - -}); router.get('/info', (req, res) => res.render('info', { page_name: "Info", layout: "layout2.ejs", extractStyles: true })); diff --git a/scripts/temp.txt b/scripts/temp.txt new file mode 100644 index 0000000..e69de29 diff --git a/views/admin.ejs b/views/admin.ejs index 2cdcaa8..06007a3 100644 --- a/views/admin.ejs +++ b/views/admin.ejs @@ -1,7 +1,9 @@ - +

      Hello <%= name %>

      - +
      + +
      \ No newline at end of file diff --git a/views/layout2.ejs b/views/layout2.ejs index 40ff1bb..973d69b 100644 --- a/views/layout2.ejs +++ b/views/layout2.ejs @@ -27,7 +27,7 @@ - + <%- style %> <%- defineContent('map_scripts') %> diff --git a/views/login.ejs b/views/login.ejs index 9fc8376..a1dd67c 100644 --- a/views/login.ejs +++ b/views/login.ejs @@ -1,4 +1,4 @@ - +
      diff --git a/views/map.ejs b/views/map.ejs index 2230307..2c903d8 100644 --- a/views/map.ejs +++ b/views/map.ejs @@ -1,7 +1,7 @@ - +
      @@ -33,8 +33,8 @@ <%- contentFor('bottom_map_scripts') %> - - - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/views/notfound.ejs b/views/notfound.ejs index 2f14482..8b23042 100644 --- a/views/notfound.ejs +++ b/views/notfound.ejs @@ -15,8 +15,8 @@ - - + + diff --git a/views/offline.ejs b/views/offline.ejs index 2473a51..888c2b9 100644 --- a/views/offline.ejs +++ b/views/offline.ejs @@ -10,13 +10,13 @@ Page Not Found - + - - + + diff --git a/views/register.ejs b/views/register.ejs index c80d552..543be66 100644 --- a/views/register.ejs +++ b/views/register.ejs @@ -1,4 +1,4 @@ - +
      diff --git a/views/searchResults.ejs b/views/searchResults.ejs index b83ee9c..7d53729 100644 --- a/views/searchResults.ejs +++ b/views/searchResults.ejs @@ -1,4 +1,4 @@ - +
      @@ -7,11 +7,10 @@
      -
      - +
      diff --git a/views/welcome.ejs b/views/welcome.ejs index 702d6d7..0d7cc80 100644 --- a/views/welcome.ejs +++ b/views/welcome.ejs @@ -1,5 +1,5 @@ - +
      From 26764d5453ce4daa0dc0dd31d31b3a80e43e9a84 Mon Sep 17 00:00:00 2001 From: Unachieved Date: Fri, 21 Feb 2020 16:22:47 -0500 Subject: [PATCH 56/69] mini_commit --- scripts/routes/map.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/routes/map.js b/scripts/routes/map.js index 2e73a9a..f3a0863 100644 --- a/scripts/routes/map.js +++ b/scripts/routes/map.js @@ -15,7 +15,7 @@ for some reason according to the API** /* -Display the map on the page at id 'map' +Display the map on the page at id 'mapContainer' setView() focuses the map around the given point. In this case, it does so on creation of the map (pageload) @@ -28,10 +28,10 @@ let mymap = L.map('mapContainer', { layers: [] }) -/* -Tile Layer is the display style (satellite, street, etc.) -Attribution refers to the creeator of the layer (accreditation) -*/ + +////////////////////////////////// MAP STYLE //////////////////////////////// +/* Tile Layer is the display style (satellite, street, etc.) +Attribution refers to the creeator of the layer (accreditation)*/ L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors, ' + @@ -41,6 +41,9 @@ L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=p }).addTo(mymap); +////////////////////////////////// CAMPUS HIGHLIGHT //////////////////////////////// +// TODO?: Change this to do a query to the database for the cordinates then add them to the list +// so that we don't have to hard code the points here // Highlight campus on the map using points as an outline, connect-the-dots style const campus = [ [42.728116, -73.684807], @@ -61,6 +64,8 @@ const campus = [ ]; L.polygon(campus, {color: 'gray', opacity: 0.1}).addTo(mymap); + +////////////////////////////////// MAP POPUPS & ONCLICKS //////////////////////////////// // Default popup object that would show on the map if a nonregistered point is clicked const popup = L.popup(); @@ -130,7 +135,6 @@ let locations_shops_arr = []; /** * Style and add the campus points to the map */ - L.geoJSON(locations, { style: function (feature) { return feature.properties && feature.properties.style; From 95f854ae6be175372ac4ac495819fb6f9ff3b34e Mon Sep 17 00:00:00 2001 From: Justin Gaskins <38302369+gaskij@users.noreply.github.com> Date: Sat, 22 Feb 2020 17:07:57 -0500 Subject: [PATCH 57/69] Create pull_request_template.md --- .github/pull_request_template.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..ed0b4f6 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ +## Description +(Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.) + +Fixes #(issue name) + +## Solution +(What did you do to fix this issue?) + +## Known Issues +(Are there any knew issues caused or exposed by your changes, or things you would like clarified before merging?) + +## Testing Procedures +(What should reviewers do to validate your changes? What steps should be taken and what is the expected outcome?) + +## Checklist for author +- [ ] My code follows the style guidelines of this project +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation (if any) +- [ ] My changes generate no new warnings From b95b8b14bdf1bb7608d642821c32440292be5cd3 Mon Sep 17 00:00:00 2001 From: Unachieved Date: Sat, 22 Feb 2020 20:48:02 -0500 Subject: [PATCH 58/69] Last Conversion fix --- package-lock.json | 25 ++++++++++++++++++++++ package.json | 5 +++++ scripts/controllers/admin.js | 39 ---------------------------------- scripts/routes/map.js | 2 +- scripts/routes/user.js | 41 ------------------------------------ views/layout.ejs | 2 +- 6 files changed, 32 insertions(+), 82 deletions(-) delete mode 100644 scripts/controllers/admin.js diff --git a/package-lock.json b/package-lock.json index 6ceb8d2..4d076a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,31 @@ "uri-js": "^4.2.2" } }, + "angular": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/angular/-/angular-1.7.9.tgz", + "integrity": "sha512-5se7ZpcOtu0MBFlzGv5dsM1quQDoDeUTwZrWjGtTNA7O88cD8TEk5IEKCTDa3uECV9XnvKREVUr7du1ACiWGFQ==" + }, + "angular-animate": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.7.9.tgz", + "integrity": "sha512-fV+AISy/HTzurQH2ngsJg+lLIvfu0ahc1h4AYKauaXVw97rZc2k4iUA1bMstiEyClsdayQX568kjQc1NK+oYhw==" + }, + "angular-mocks": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.7.9.tgz", + "integrity": "sha512-LQRqqiV3sZ7NTHBnNmLT0bXtE5e81t97+hkJ56oU0k3dqKv1s6F+nBWRlOVzqHWPGFOiPS8ZJVdrS8DFzHyNIA==" + }, + "angular-resource": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/angular-resource/-/angular-resource-1.7.9.tgz", + "integrity": "sha512-rXXhCE2qT31Pn4Sl+2XL+ntv4zxnA2OzY+clCl8/pOp/s/gIzxpQlEtXipo3QK8Qur3glbIkeF/bJw+gjVAdUw==" + }, + "angular-route": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.7.9.tgz", + "integrity": "sha512-vRoj5hzdQtWbODhWJqDzD1iNOEfCKshO6GFBuPVV7RHlPjzIc4R2dHCc7Qiv/8F3LDxJDohc6vSnTDMLHuaqeA==" + }, "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", diff --git a/package.json b/package.json index 2a73151..b83a1af 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,11 @@ }, "homepage": "https://github.com/gaskij/rpicampusmap#readme", "dependencies": { + "angular": "^1.7.9", + "angular-animate": "^1.7.9", + "angular-mocks": "^1.7.9", + "angular-resource": "^1.7.9", + "angular-route": "^1.7.9", "bcryptjs": "^2.4.3", "connect-flash": "^0.1.1", "dotenv": "^7.0.0", diff --git a/scripts/controllers/admin.js b/scripts/controllers/admin.js deleted file mode 100644 index 802e57e..0000000 --- a/scripts/controllers/admin.js +++ /dev/null @@ -1,39 +0,0 @@ -app.controller('infoController', function($scope, $http) { - console.log("infoController activated!"); - - const location = getParams(); - console.log(location); - - $http.post(`/info?loc=${location.loc}`, {query: location.loc}) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); - - $scope.id = location.loc; - $scope.name = httpResponse.data[0].properties.name; - $scope.nick = 'Nicknames: ' + httpResponse.data[0].properties.nick; - $scope.desc = httpResponse.data[0].properties.description; - }); - - $scope.comment = function(title, body) { - if (!title || !body) return; - - let data = { - comment: { - title: title, - body: body - } - }; - - console.log(data); - - $http.post(`/info?loc=${location.loc}`, data) - .then(function(httpResponse, err) { - if (err) throw err; - console.log(httpResponse.data); - - $scope.cmtTitle = ""; - $scope.cmtBody = ""; - }); - } -}); diff --git a/scripts/routes/map.js b/scripts/routes/map.js index f3a0863..6f10c53 100644 --- a/scripts/routes/map.js +++ b/scripts/routes/map.js @@ -114,7 +114,7 @@ const onEachFeature = function(feature, layer) { newPopupContent += `` } else { - newPopupContent += ``; + newPopupContent += ``; } newPopupContent += `
      -
      -
      -
      - - Rensselaer Polytechnic Institute - -
      - -
      - An RCOS Project -- - GitHub -- -
      Admin Panel + @@ -101,7 +91,6 @@ - \ No newline at end of file diff --git a/views/map.ejs b/views/map.ejs index 2c903d8..e63df0d 100644 --- a/views/map.ejs +++ b/views/map.ejs @@ -4,24 +4,18 @@ -
      -
      -
      - -

      This is where the map goes... lol

      -
      -
      +
      + +

      This is where the map goes... lol

      - - - - + + <%- contentFor('map_scripts') %> From 09ab49343ec7f33fe2743fd9601ecb6da52b4af9 Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Sun, 23 Feb 2020 03:10:37 -0500 Subject: [PATCH 61/69] Change default port to 3000 --- app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app.js b/app.js index db0d83b..0b050ce 100644 --- a/app.js +++ b/app.js @@ -60,7 +60,6 @@ app.use('/user', require('./scripts/routes/user')); app.use(express.static(__dirname)); -const PORT = process.env.PORT || 5000; +const PORT = process.env.PORT || 3000; app.listen(PORT, console.log(`Server started on port ${PORT}`)); - From d335c09b934e08869db582099bc7b59dba407ebf Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Sun, 23 Feb 2020 03:42:32 -0500 Subject: [PATCH 62/69] Fix bootstrap not working on pages other than the map --- views/layout2.ejs | 10 ++++++---- views/map.ejs | 5 ++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/views/layout2.ejs b/views/layout2.ejs index 80c03a3..2ead29a 100644 --- a/views/layout2.ejs +++ b/views/layout2.ejs @@ -26,10 +26,8 @@ integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> - - + + <%- style %> <%- defineContent('map_scripts') %> @@ -85,12 +83,16 @@ <%- defineContent('bottom_map_scripts') %> + + \ No newline at end of file diff --git a/views/map.ejs b/views/map.ejs index e63df0d..0dbc8c6 100644 --- a/views/map.ejs +++ b/views/map.ejs @@ -19,11 +19,10 @@ <%- contentFor('map_scripts') %> - - + crossorigin=""> + <%- contentFor('bottom_map_scripts') %> From 87c61e61687d3668120b6fee1bc45a622014a9c6 Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Sun, 23 Feb 2020 04:04:31 -0500 Subject: [PATCH 63/69] Wrap page templates in custom html elements for context --- css/homepage.css | 4 + views/admin.ejs | 5 +- views/info.ejs | 276 ++++++++++++++++++++-------------------- views/layout.ejs | 15 +-- views/layout2.ejs | 3 +- views/login.ejs | 13 +- views/map.ejs | 11 +- views/register.ejs | 10 +- views/searchResults.ejs | 8 +- 9 files changed, 167 insertions(+), 178 deletions(-) diff --git a/css/homepage.css b/css/homepage.css index 3f79c83..ab8339c 100644 --- a/css/homepage.css +++ b/css/homepage.css @@ -29,6 +29,10 @@ footer a { margin: auto; } +map-page { + height: 100%; +} + #mapContainer { height: 100%; } diff --git a/views/admin.ejs b/views/admin.ejs index 06007a3..718af27 100644 --- a/views/admin.ejs +++ b/views/admin.ejs @@ -1,9 +1,8 @@ - -
      +

      Hello <%= name %>

      -
      \ No newline at end of file + \ No newline at end of file diff --git a/views/info.ejs b/views/info.ejs index 5d44194..8640dc5 100644 --- a/views/info.ejs +++ b/views/info.ejs @@ -1,165 +1,161 @@ - -
      + +
      +
      +
      +
      +
      +

      {{name}}

      +
      +

      {{desc}}

      +

      {{nick}}

      -
      -
      -
      -
      -
      -

      {{name}}

      -
      -

      {{desc}}

      -

      {{nick}}

      - - Show On Map -
      + Show On Map +
      -
      -
      +
      +
      +
      - -
      -
      -

      Comments:

      -
      -

      No comments found. Be the first to leave a comment!

      -
      -
      - +
      +
      +

      Comments:

      +
      +

      No comments found. Be the first to leave a comment!

      +
      +
      + + //check for no comments + if($result->num_rows == 0){ + //This is what is displayed when no searchResults are found + echo "

      No Comments Yet!

      "; + } + else{ + //Output the comments + while($r = $result->fetch_assoc()){ + //output the title + echo "

      "; + echo $r['title']; + //output the comment text + echo "

      "; + echo $r['comment']; + //output the timestamp + echo "

      "; + echo date("g:ia n/j/y", strtotime($r['time'])); + echo "

      "; + } + } + } + ?> --> - -
      Post a Comment:
      -
      -
      -
      -
      - -
      -
      - -
      -
      -
      - -
      -
      -
      -
      - -
      - -
      Add an Image:
      + +
      Post a Comment:
      +
      - +
      - +
      -
      +
      +
      - - - -
      +
      -
      +
      + +
      Add an Image:
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + + -
      \ No newline at end of file + +
      +
      + diff --git a/views/layout.ejs b/views/layout.ejs index 66f7248..dcb815f 100644 --- a/views/layout.ejs +++ b/views/layout.ejs @@ -14,7 +14,6 @@ - @@ -24,15 +23,12 @@ - - + + + <%- style %> - - @@ -43,13 +39,16 @@
      + - + \ No newline at end of file diff --git a/views/layout2.ejs b/views/layout2.ejs index 2ead29a..395a07f 100644 --- a/views/layout2.ejs +++ b/views/layout2.ejs @@ -64,7 +64,6 @@ -
      <%- body %>
      @@ -95,4 +94,4 @@ - \ No newline at end of file + diff --git a/views/login.ejs b/views/login.ejs index a1dd67c..96562cc 100644 --- a/views/login.ejs +++ b/views/login.ejs @@ -1,9 +1,8 @@ - -
      -
      -

      You must login with an administrator account to view this page.

      + +
      +

      You must login with an administrator account to view this page.


      <% include ./partials/messages %>
      @@ -20,11 +19,9 @@
      -
      -

      Don't have an account?

      Request admin access. +

      Don't have an account?

      Request admin access.
      - -
      \ No newline at end of file + diff --git a/views/map.ejs b/views/map.ejs index 0dbc8c6..53998c2 100644 --- a/views/map.ejs +++ b/views/map.ejs @@ -3,11 +3,12 @@ crossorigin="" /> - -
      - -

      This is where the map goes... lol

      -
      + +
      + +

      This is where the map goes... lol

      +
      +
      --> - -
      - - \ No newline at end of file + diff --git a/views/searchResults.ejs b/views/searchResults.ejs index 7d53729..326ca5e 100644 --- a/views/searchResults.ejs +++ b/views/searchResults.ejs @@ -1,7 +1,6 @@ - -
      +

      @@ -38,7 +37,6 @@ <% }); %>
      -
      + - - \ No newline at end of file + \ No newline at end of file From 28a3d32767459fc43ee9cdffbed0202f71a81da2 Mon Sep 17 00:00:00 2001 From: Justin Gaskins Date: Sun, 23 Feb 2020 04:38:21 -0500 Subject: [PATCH 64/69] Use mapApp.js on root ejs template to have across all pages --- views/layout2.ejs | 3 +++ views/map.ejs | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/views/layout2.ejs b/views/layout2.ejs index 395a07f..dadd5c1 100644 --- a/views/layout2.ejs +++ b/views/layout2.ejs @@ -27,6 +27,9 @@ + + + <%- style %> diff --git a/views/map.ejs b/views/map.ejs index 53998c2..083bae4 100644 --- a/views/map.ejs +++ b/views/map.ejs @@ -30,5 +30,4 @@ - \ No newline at end of file From 03b9b05d8b0215c1bb79e9d19cb272ac999fefc1 Mon Sep 17 00:00:00 2001 From: Unachieved Date: Mon, 24 Feb 2020 23:14:42 -0500 Subject: [PATCH 65/69] slight pathing fix --- manifest.json | 12 ++++++------ views/notfound.ejs | 10 +++++----- views/offline.ejs | 8 ++++---- views/searchResults.ejs | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifest.json b/manifest.json index 1bb98b5..fabd20f 100644 --- a/manifest.json +++ b/manifest.json @@ -15,32 +15,32 @@ "generated" : "true", "icons" : [ { - "src": "/public/images/pin-128x128.png", + "src": "/images/pin-128x128.png", "sizes": "128x128", "type": "image/png" }, { - "src": "/public/images/pin-144x144.png", + "src": "/images/pin-144x144.png", "sizes": "144x144", "type": "image/png" }, { - "src": "/public/images/pin-152x152.png", + "src": "/images/pin-152x152.png", "sizes": "152x152", "type": "image/png" }, { - "src": "/public/images/pin-192x192.png", + "src": "/images/pin-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/public/images/pin-256x256.png", + "src": "/images/pin-256x256.png", "sizes": "256x256", "type": "image/png" }, { - "src": "/public/images/pin-512x512.png", + "src": "/images/pin-512x512.png", "sizes": "512x512", "type": "image/png" } diff --git a/views/notfound.ejs b/views/notfound.ejs index 8b23042..8745551 100644 --- a/views/notfound.ejs +++ b/views/notfound.ejs @@ -10,7 +10,7 @@ Page Not Found - + - + @@ -34,7 +34,7 @@