├── .eslintrc.js ├── .gitignore ├── .travis.yml ├── Procfile ├── README.md ├── app.js ├── config.js ├── custom_types ├── category.json ├── index.json ├── layout.json └── product.json ├── package-lock.json ├── package.json ├── prismic-configuration.js ├── public ├── images │ ├── cart-icon-active.png │ ├── cart-icon.png │ └── punch.png ├── javascript │ └── functions.js └── stylesheets │ ├── common.css │ ├── reset.css │ ├── snipcart-style.css │ └── style.css ├── utils └── async-handler.js └── views ├── error_handlers ├── 404.pug └── error.pug ├── layout.pug ├── listing.pug ├── partials ├── add-to-cart-button.pug ├── footer.pug └── header.pug └── product.pug /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "node": true 4 | }, 5 | "extends": "eslint:recommended", 6 | "rules": { 7 | "no-console": 0, 8 | "indent": [ 9 | "warn", 10 | 2 11 | ], 12 | "no-unused-vars": ["error", { "vars": "all", "args": "none" }], 13 | "linebreak-style": [ 14 | "error", 15 | "unix" 16 | ], 17 | "quotes": [ 18 | "warn", 19 | "single" 20 | ], 21 | "semi": [ 22 | "error", 23 | "always" 24 | ] 25 | }, 26 | "parserOptions": { 27 | "sourceType": "module" 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | pids 11 | logs 12 | results 13 | 14 | npm-debug.log 15 | node_modules 16 | 17 | .idea 18 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | node_js: 4 | - '4' 5 | - '5' 6 | - '6' 7 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node app.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Sample eCommerce Website with API-based CMS 2 | 3 | This is a sample Node.js eCommerce website with content managed with prismic.io (API-based CMS). 4 | 5 | #### Getting started 6 | 7 | Read [this guide](https://intercom.help/prismicio/examples/nodejs-samples/sample-ecommerce-site-with-snipcart-in-nodejs) for instructions to create your repository and use this sample eCommerce site. 8 | 9 | #### Deploy your Node.js website 10 | 11 | An easy way to deploy your Node.js website is to use [Heroku](http://www.heroku.com). Just follow these few simple steps once you have successfully [signed up](https://id.heroku.com/signup/www-header) and [installed the Heroku toolbelt](https://toolbelt.heroku.com/): 12 | 13 | Create a new Heroku application 14 | 15 | ``` 16 | $ heroku create 17 | ``` 18 | 19 | Initialize a new Git repository: 20 | 21 | ``` 22 | $ git init 23 | $ heroku git:remote -a your-heroku-app-name 24 | ``` 25 | 26 | Commit your code to the Git repository and deploy it to Heroku: 27 | 28 | ``` 29 | $ git add . 30 | $ git commit -am "make it better" 31 | $ git push heroku master 32 | ``` 33 | 34 | Ensure you have at least one node running: 35 | 36 | ``` 37 | $ heroku ps:scale web=1 38 | ``` 39 | 40 | You can now browse your application online: 41 | 42 | ``` 43 | $ heroku open 44 | ``` 45 | 46 | ### Licence 47 | 48 | This software is licensed under the Apache 2 license, quoted below. 49 | 50 | Copyright 2017 Prismic.io (http://www.prismic.io). 51 | 52 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. 53 | 54 | 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. -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | const Prismic = require('@prismicio/client'); 7 | const PrismicDOM = require('prismic-dom'); 8 | const app = require('./config'); 9 | const PrismicConfig = require('./prismic-configuration'); 10 | const asyncHandler = require ("./utils/async-handler"); 11 | const PORT = app.get('port'); 12 | 13 | function render404(req, res) { 14 | res.status(404); 15 | res.render("./error_handlers/404"); 16 | } 17 | 18 | app.listen(PORT, () => { 19 | process.stdout.write(`Point your browser to: http://localhost:${PORT}\n`); 20 | }); 21 | 22 | // Middleware to inject prismic context 23 | app.use((req, res, next) => { 24 | res.locals.ctx = { 25 | endpoint: PrismicConfig.apiEndpoint, 26 | snipcartKey: PrismicConfig.snipcartKey, 27 | linkResolver: PrismicConfig.linkResolver 28 | }; 29 | // add PrismicDOM in locals to access them in templates. 30 | res.locals.PrismicDOM = PrismicDOM; 31 | Prismic.getApi(PrismicConfig.apiEndpoint,{ accessToken: PrismicConfig.accessToken, req: req }) 32 | .then((api) => { 33 | req.prismic = { api }; 34 | next(); 35 | }).catch(function(err) { 36 | if (err.status == 404) { 37 | res.status(404).send('There was a problem connecting to your API, please check your configuration file for errors.'); 38 | } else { 39 | res.status(500).send('Error 500: ' + err.message); 40 | } 41 | }); 42 | }); 43 | 44 | 45 | // Query the site layout with every route 46 | app.route('*').get((req, res, next) => { 47 | req.prismic.api.getSingle('layout').then(function(layoutContent){ 48 | 49 | // Give an error if no layout custom type is found 50 | if (!layoutContent) { 51 | res.status(500).send('No Layout document was found.'); 52 | } 53 | 54 | // Define the layout content 55 | res.locals.layoutContent = layoutContent; 56 | next(); 57 | }); 58 | }); 59 | 60 | 61 | /* 62 | * -------------- Routes -------------- 63 | */ 64 | 65 | /* 66 | * Preconfigured prismic preview 67 | */ 68 | 69 | // Prismic preview route 70 | app.get('/preview', asyncHandler(async (req, res, next) => { 71 | const { token, documentId } = req.query; 72 | if(token){ 73 | try{ 74 | const redirectUrl = (await req.prismic.api.getPreviewResolver(token, documentId).resolve(PrismicConfig.linkResolver, '/')); 75 | res.redirect(302, redirectUrl); 76 | }catch(e){ 77 | res.status(500).send(`Error 500 in preview`); 78 | } 79 | }else{ 80 | res.send(400, 'Missing token from querystring'); 81 | } 82 | next(); 83 | })) 84 | 85 | /* 86 | * Route for the product pages 87 | */ 88 | app.route('/product/:uid').get(function(req, res) { 89 | 90 | // Get the page url needed for snipcart 91 | var pageUrl = req.protocol + '://' + req.get('host') + req.originalUrl; 92 | 93 | // Define the UID from the url 94 | var uid = req.params.uid; 95 | 96 | // Query the product by its UID 97 | req.prismic.api.getByUID('product', uid).then(function(productContent) { 98 | 99 | // Render the 404 page if this uid is found 100 | if (!productContent) { 101 | render404(req, res); 102 | } 103 | 104 | // Collect all the related product IDs for this product 105 | var relatedProducts = productContent.data.relatedProducts; 106 | var relatedIDs = relatedProducts.map((relatedProduct) => { 107 | var link = relatedProduct.link; 108 | return link ? link.id : null; 109 | }).filter((id) => id !== null && id !== undefined); 110 | 111 | //Query the related products by their IDs 112 | req.prismic.api.getByIDs(relatedIDs).then(function(relatedProducts) { 113 | 114 | // Render the product page 115 | res.render('product', { 116 | productContent: productContent, 117 | relatedProducts: relatedProducts, 118 | pageUrl: pageUrl 119 | }); 120 | }); 121 | }); 122 | }); 123 | 124 | 125 | // Route for categories 126 | app.route('/category/:uid').get(function(req, res) { 127 | 128 | // Define the UID from the url 129 | var uid = req.params.uid; 130 | 131 | // Query the category by its UID 132 | req.prismic.api.getByUID('category', uid).then(function(category) { 133 | 134 | // Render the 404 page if this uid is found 135 | if (!category) { 136 | render404(req, res); 137 | } 138 | 139 | // Define the category ID 140 | var categoryID = category.id; 141 | 142 | // Query all the products linked to the given category ID 143 | req.prismic.api.query([ 144 | Prismic.Predicates.at('document.type', 'product'), 145 | Prismic.Predicates.at('my.product.categories.link', categoryID) 146 | ], { orderings : '[my.product.date desc]'} 147 | ).then(function(products) { 148 | 149 | // Render the listing page 150 | res.render('listing', {products: products.results}); 151 | }); 152 | }); 153 | }); 154 | 155 | 156 | // Route for the homepage 157 | app.route('/').get(function(req, res) { 158 | 159 | // Query all the products and order by their dates 160 | req.prismic.api.query( 161 | Prismic.Predicates.at('document.type', 'product'), 162 | { orderings : '[my.product.date desc]'} 163 | ).then(function(products) { 164 | 165 | // Render the listing page 166 | res.render('listing', {products: products.results}); 167 | }); 168 | }); 169 | 170 | 171 | // Route that catches any other url and renders the 404 page 172 | app.route('/:url').get(function(req, res) { 173 | render404(req, res); 174 | }); 175 | 176 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | var express = require('express'), 6 | favicon = require('serve-favicon'), 7 | logger = require('morgan'), 8 | bodyParser = require('body-parser'), 9 | methodOverride = require('method-override'), 10 | errorHandler = require('errorhandler'), 11 | path = require('path'); 12 | 13 | module.exports = function() { 14 | var app = express(); 15 | 16 | // all environments 17 | app.set('port', process.env.PORT || 3000); 18 | app.set('views', path.join(__dirname, 'views')); 19 | app.set('view engine', 'pug'); 20 | app.use(favicon('public/images/punch.png')); 21 | app.use(logger('dev')); 22 | app.use(bodyParser.urlencoded({ extended: true })); 23 | app.use(bodyParser.json()); 24 | app.use(methodOverride()); 25 | app.use(express.static(path.join(__dirname, 'public'))); 26 | 27 | app.use(errorHandler()); 28 | 29 | return app; 30 | }(); 31 | -------------------------------------------------------------------------------- /custom_types/category.json: -------------------------------------------------------------------------------- 1 | { 2 | "Main" : { 3 | "uid" : { 4 | "type" : "UID", 5 | "fieldset" : "Unique ID", 6 | "config" : { 7 | "placeholder" : "Unique ID..." 8 | } 9 | }, 10 | "title" : { 11 | "type" : "StructuredText", 12 | "fieldset" : "Category Title", 13 | "config" : { 14 | "placeholder" : "Category Title...", 15 | "single" : "heading1" 16 | } 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /custom_types/index.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "id": "category", 3 | "name": "Category", 4 | "repeatable": true, 5 | "value": "category.json" 6 | }, { 7 | "id": "layout", 8 | "name": "Layout", 9 | "repeatable": false, 10 | "value": "layout.json" 11 | }, { 12 | "id": "product", 13 | "name": "Product", 14 | "repeatable": true, 15 | "value": "product.json" 16 | }] -------------------------------------------------------------------------------- /custom_types/layout.json: -------------------------------------------------------------------------------- 1 | { 2 | "Main" : { 3 | "title" : { 4 | "type" : "StructuredText", 5 | "config" : { 6 | "placeholder" : "Document title...", 7 | "single" : "heading1" 8 | } 9 | }, 10 | "logo" : { 11 | "type" : "Image", 12 | "fieldset" : "Site Logo" 13 | }, 14 | "mainNav" : { 15 | "type" : "Group", 16 | "fieldset" : "Main Navigation", 17 | "config" : { 18 | "fields" : { 19 | "label" : { 20 | "type" : "Text", 21 | "config" : { 22 | "placeholder" : "Link label" 23 | } 24 | }, 25 | "link" : { 26 | "type" : "Link", 27 | "config" : { 28 | "select" : "document", 29 | "customtypes" : [ "category" ], 30 | "placeholder" : "Link to a category" 31 | } 32 | } 33 | } 34 | } 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /custom_types/product.json: -------------------------------------------------------------------------------- 1 | { 2 | "Main" : { 3 | "uid" : { 4 | "type" : "UID", 5 | "fieldset" : "Unique Identifier", 6 | "config" : { 7 | "placeholder" : "UID" 8 | } 9 | }, 10 | "date" : { 11 | "type" : "Date", 12 | "fieldset" : "Date Added" 13 | }, 14 | "title" : { 15 | "type" : "StructuredText", 16 | "fieldset" : "Product Title", 17 | "config" : { 18 | "single" : "heading1", 19 | "placeholder" : "Title..." 20 | } 21 | }, 22 | "categories" : { 23 | "type" : "Group", 24 | "fieldset" : "Categories", 25 | "config" : { 26 | "fields" : { 27 | "link" : { 28 | "type" : "Link", 29 | "config" : { 30 | "select" : "document", 31 | "customtypes" : [ "category" ], 32 | "placeholder" : "Link to a category" 33 | } 34 | } 35 | } 36 | } 37 | } 38 | }, 39 | "Product Info" : { 40 | "image" : { 41 | "type" : "Image", 42 | "fieldset" : "Product Image", 43 | "config" : { 44 | "constraint" : { 45 | "width" : 640 46 | }, 47 | "thumbnails" : [ { 48 | "name" : "Listing", 49 | "width" : 300, 50 | "height" : 300 51 | }, { 52 | "name" : "Snipcart", 53 | "width" : 50, 54 | "height" : 50 55 | } ] 56 | } 57 | }, 58 | "price" : { 59 | "type" : "Number", 60 | "fieldset" : "Price", 61 | "config" : { 62 | "label" : "USD", 63 | "min" : 1, 64 | "placeholder" : "Insert Price..." 65 | } 66 | }, 67 | "description" : { 68 | "type" : "StructuredText", 69 | "fieldset" : "Product Description", 70 | "config" : { 71 | "multi" : "paragraph,em,strong,hyperlink", 72 | "placeholder" : "Description..." 73 | } 74 | } 75 | }, 76 | "Related Products" : { 77 | "relatedProducts" : { 78 | "type" : "Group", 79 | "fieldset" : "Link to related products", 80 | "config" : { 81 | "fields" : { 82 | "link" : { 83 | "type" : "Link", 84 | "config" : { 85 | "select" : "document", 86 | "customtypes" : [ "product" ], 87 | "placeholder" : "Link to a product" 88 | } 89 | } 90 | } 91 | } 92 | } 93 | }, 94 | "Snipcart Data" : { 95 | "snipcartDescription" : { 96 | "type" : "Text", 97 | "fieldset" : "Snipcart Data", 98 | "config" : { 99 | "label" : "Brief Description", 100 | "placeholder" : "Brief Description..." 101 | } 102 | }, 103 | "snipcartWeight" : { 104 | "type" : "Number", 105 | "config" : { 106 | "label" : "Weight (g)", 107 | "min" : 1 108 | } 109 | }, 110 | "snipcartMaxQuantity" : { 111 | "type" : "Number", 112 | "config" : { 113 | "label" : "Max Quantity", 114 | "min" : 1 115 | } 116 | } 117 | } 118 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "javascript-nodejs-starter", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@prismicio/client": { 8 | "version": "4.0.0", 9 | "resolved": "https://registry.npmjs.org/@prismicio/client/-/client-4.0.0.tgz", 10 | "integrity": "sha512-3rGie+Banm61hOQcKF75+TI8oquVDT2PyX05ho2eRKdiMu0i4raHVJCuIAGBs/CDCuVXes2h/rnfRs+eKfq7XQ==", 11 | "requires": { 12 | "cross-fetch": "^3.0.6" 13 | }, 14 | "dependencies": { 15 | "cross-fetch": { 16 | "version": "3.0.6", 17 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz", 18 | "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", 19 | "requires": { 20 | "node-fetch": "2.6.1" 21 | } 22 | }, 23 | "node-fetch": { 24 | "version": "2.6.1", 25 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 26 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 27 | } 28 | } 29 | }, 30 | "@prismicio/helpers": { 31 | "version": "1.0.5", 32 | "resolved": "https://registry.npmjs.org/@prismicio/helpers/-/helpers-1.0.5.tgz", 33 | "integrity": "sha512-TPpuAFHNxlCTrEihHnRKcq6zc0oZV0sfz5/iHoSpl5vorwPbwZWiF88JGeflNdefW4A69b5A3x3mfptKPdpoxg==" 34 | }, 35 | "@prismicio/richtext": { 36 | "version": "1.1.0", 37 | "resolved": "https://registry.npmjs.org/@prismicio/richtext/-/richtext-1.1.0.tgz", 38 | "integrity": "sha512-925JuFiZiIkwu9jmlR9O/U8xCSZk/Y6BQDXKpavoVsKo+n90ml1hGdtWkglIupX+ITQO1ZINyDgUgiY1oG9dsA==" 39 | }, 40 | "@types/babel-types": { 41 | "version": "7.0.8", 42 | "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.8.tgz", 43 | "integrity": "sha512-jvu8g4LR7+p6ao30RhTREnEhHxmP4/R9D9/rOR/Kq14FztORty9SKgtOZUNZNMB9CXLxZ54EWu4dArUE8WdTsw==" 44 | }, 45 | "@types/babylon": { 46 | "version": "6.16.5", 47 | "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", 48 | "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", 49 | "requires": { 50 | "@types/babel-types": "*" 51 | } 52 | }, 53 | "accepts": { 54 | "version": "1.3.7", 55 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 56 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 57 | "requires": { 58 | "mime-types": "~2.1.24", 59 | "negotiator": "0.6.2" 60 | } 61 | }, 62 | "acorn": { 63 | "version": "3.3.0", 64 | "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 65 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" 66 | }, 67 | "acorn-globals": { 68 | "version": "3.1.0", 69 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", 70 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", 71 | "requires": { 72 | "acorn": "^4.0.4" 73 | }, 74 | "dependencies": { 75 | "acorn": { 76 | "version": "4.0.13", 77 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 78 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" 79 | } 80 | } 81 | }, 82 | "acorn-jsx": { 83 | "version": "3.0.1", 84 | "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 85 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 86 | "dev": true, 87 | "requires": { 88 | "acorn": "^3.0.4" 89 | } 90 | }, 91 | "ajv": { 92 | "version": "5.5.2", 93 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 94 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 95 | "dev": true, 96 | "requires": { 97 | "co": "^4.6.0", 98 | "fast-deep-equal": "^1.0.0", 99 | "fast-json-stable-stringify": "^2.0.0", 100 | "json-schema-traverse": "^0.3.0" 101 | } 102 | }, 103 | "ajv-keywords": { 104 | "version": "2.1.1", 105 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", 106 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", 107 | "dev": true 108 | }, 109 | "align-text": { 110 | "version": "0.1.4", 111 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 112 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 113 | "requires": { 114 | "kind-of": "^3.0.2", 115 | "longest": "^1.0.1", 116 | "repeat-string": "^1.5.2" 117 | } 118 | }, 119 | "ansi-escapes": { 120 | "version": "3.1.0", 121 | "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 122 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", 123 | "dev": true 124 | }, 125 | "ansi-regex": { 126 | "version": "2.1.1", 127 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 128 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 129 | "dev": true 130 | }, 131 | "ansi-styles": { 132 | "version": "2.2.1", 133 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 134 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 135 | "dev": true 136 | }, 137 | "argparse": { 138 | "version": "1.0.10", 139 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 140 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 141 | "dev": true, 142 | "requires": { 143 | "sprintf-js": "~1.0.2" 144 | } 145 | }, 146 | "array-flatten": { 147 | "version": "1.1.1", 148 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 149 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 150 | }, 151 | "asap": { 152 | "version": "2.0.6", 153 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 154 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" 155 | }, 156 | "babel-code-frame": { 157 | "version": "6.26.0", 158 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 159 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 160 | "dev": true, 161 | "requires": { 162 | "chalk": "^1.1.3", 163 | "esutils": "^2.0.2", 164 | "js-tokens": "^3.0.2" 165 | }, 166 | "dependencies": { 167 | "chalk": { 168 | "version": "1.1.3", 169 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 170 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 171 | "dev": true, 172 | "requires": { 173 | "ansi-styles": "^2.2.1", 174 | "escape-string-regexp": "^1.0.2", 175 | "has-ansi": "^2.0.0", 176 | "strip-ansi": "^3.0.0", 177 | "supports-color": "^2.0.0" 178 | } 179 | }, 180 | "strip-ansi": { 181 | "version": "3.0.1", 182 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 183 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 184 | "dev": true, 185 | "requires": { 186 | "ansi-regex": "^2.0.0" 187 | } 188 | } 189 | } 190 | }, 191 | "babel-runtime": { 192 | "version": "6.26.0", 193 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 194 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 195 | "requires": { 196 | "core-js": "^2.4.0", 197 | "regenerator-runtime": "^0.11.0" 198 | } 199 | }, 200 | "babel-types": { 201 | "version": "6.26.0", 202 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", 203 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", 204 | "requires": { 205 | "babel-runtime": "^6.26.0", 206 | "esutils": "^2.0.2", 207 | "lodash": "^4.17.4", 208 | "to-fast-properties": "^1.0.3" 209 | } 210 | }, 211 | "babylon": { 212 | "version": "6.18.0", 213 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", 214 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" 215 | }, 216 | "balanced-match": { 217 | "version": "1.0.0", 218 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 219 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 220 | "dev": true 221 | }, 222 | "basic-auth": { 223 | "version": "2.0.1", 224 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 225 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 226 | "requires": { 227 | "safe-buffer": "5.1.2" 228 | } 229 | }, 230 | "body-parser": { 231 | "version": "1.18.3", 232 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 233 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 234 | "requires": { 235 | "bytes": "3.0.0", 236 | "content-type": "~1.0.4", 237 | "debug": "2.6.9", 238 | "depd": "~1.1.2", 239 | "http-errors": "~1.6.3", 240 | "iconv-lite": "0.4.23", 241 | "on-finished": "~2.3.0", 242 | "qs": "6.5.2", 243 | "raw-body": "2.3.3", 244 | "type-is": "~1.6.16" 245 | }, 246 | "dependencies": { 247 | "debug": { 248 | "version": "2.6.9", 249 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 250 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 251 | "requires": { 252 | "ms": "2.0.0" 253 | } 254 | } 255 | } 256 | }, 257 | "brace-expansion": { 258 | "version": "1.1.11", 259 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 260 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 261 | "dev": true, 262 | "requires": { 263 | "balanced-match": "^1.0.0", 264 | "concat-map": "0.0.1" 265 | } 266 | }, 267 | "buffer-from": { 268 | "version": "1.1.1", 269 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 270 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 271 | "dev": true 272 | }, 273 | "bytes": { 274 | "version": "3.0.0", 275 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 276 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 277 | }, 278 | "caller-path": { 279 | "version": "0.1.0", 280 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 281 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 282 | "dev": true, 283 | "requires": { 284 | "callsites": "^0.2.0" 285 | } 286 | }, 287 | "callsites": { 288 | "version": "0.2.0", 289 | "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 290 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 291 | "dev": true 292 | }, 293 | "camelcase": { 294 | "version": "1.2.1", 295 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 296 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 297 | }, 298 | "center-align": { 299 | "version": "0.1.3", 300 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 301 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 302 | "requires": { 303 | "align-text": "^0.1.3", 304 | "lazy-cache": "^1.0.3" 305 | } 306 | }, 307 | "chalk": { 308 | "version": "2.4.1", 309 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 310 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 311 | "dev": true, 312 | "requires": { 313 | "ansi-styles": "^3.2.1", 314 | "escape-string-regexp": "^1.0.5", 315 | "supports-color": "^5.3.0" 316 | }, 317 | "dependencies": { 318 | "ansi-styles": { 319 | "version": "3.2.1", 320 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 321 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 322 | "dev": true, 323 | "requires": { 324 | "color-convert": "^1.9.0" 325 | } 326 | }, 327 | "supports-color": { 328 | "version": "5.5.0", 329 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 330 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 331 | "dev": true, 332 | "requires": { 333 | "has-flag": "^3.0.0" 334 | } 335 | } 336 | } 337 | }, 338 | "character-parser": { 339 | "version": "2.2.0", 340 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", 341 | "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", 342 | "requires": { 343 | "is-regex": "^1.0.3" 344 | } 345 | }, 346 | "chardet": { 347 | "version": "0.4.2", 348 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 349 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 350 | "dev": true 351 | }, 352 | "circular-json": { 353 | "version": "0.3.3", 354 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 355 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 356 | "dev": true 357 | }, 358 | "clean-css": { 359 | "version": "4.2.3", 360 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", 361 | "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", 362 | "requires": { 363 | "source-map": "~0.6.0" 364 | } 365 | }, 366 | "cli-cursor": { 367 | "version": "2.1.0", 368 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 369 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 370 | "dev": true, 371 | "requires": { 372 | "restore-cursor": "^2.0.0" 373 | } 374 | }, 375 | "cli-width": { 376 | "version": "2.2.0", 377 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 378 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 379 | "dev": true 380 | }, 381 | "cliui": { 382 | "version": "2.1.0", 383 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 384 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 385 | "requires": { 386 | "center-align": "^0.1.1", 387 | "right-align": "^0.1.1", 388 | "wordwrap": "0.0.2" 389 | } 390 | }, 391 | "co": { 392 | "version": "4.6.0", 393 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 394 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 395 | "dev": true 396 | }, 397 | "color-convert": { 398 | "version": "1.9.3", 399 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 400 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 401 | "dev": true, 402 | "requires": { 403 | "color-name": "1.1.3" 404 | } 405 | }, 406 | "color-name": { 407 | "version": "1.1.3", 408 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 409 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 410 | "dev": true 411 | }, 412 | "concat-map": { 413 | "version": "0.0.1", 414 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 415 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 416 | "dev": true 417 | }, 418 | "concat-stream": { 419 | "version": "1.6.2", 420 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 421 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 422 | "dev": true, 423 | "requires": { 424 | "buffer-from": "^1.0.0", 425 | "inherits": "^2.0.3", 426 | "readable-stream": "^2.2.2", 427 | "typedarray": "^0.0.6" 428 | } 429 | }, 430 | "constantinople": { 431 | "version": "3.1.2", 432 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", 433 | "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", 434 | "requires": { 435 | "@types/babel-types": "^7.0.0", 436 | "@types/babylon": "^6.16.2", 437 | "babel-types": "^6.26.0", 438 | "babylon": "^6.18.0" 439 | } 440 | }, 441 | "content-disposition": { 442 | "version": "0.5.2", 443 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 444 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 445 | }, 446 | "content-type": { 447 | "version": "1.0.4", 448 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 449 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 450 | }, 451 | "cookie": { 452 | "version": "0.3.1", 453 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 454 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 455 | }, 456 | "cookie-signature": { 457 | "version": "1.0.6", 458 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 459 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 460 | }, 461 | "core-js": { 462 | "version": "2.6.11", 463 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", 464 | "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" 465 | }, 466 | "core-util-is": { 467 | "version": "1.0.2", 468 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 469 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 470 | "dev": true 471 | }, 472 | "cross-spawn": { 473 | "version": "5.1.0", 474 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 475 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 476 | "dev": true, 477 | "requires": { 478 | "lru-cache": "^4.0.1", 479 | "shebang-command": "^1.2.0", 480 | "which": "^1.2.9" 481 | } 482 | }, 483 | "debug": { 484 | "version": "3.1.0", 485 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 486 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 487 | "requires": { 488 | "ms": "2.0.0" 489 | } 490 | }, 491 | "decamelize": { 492 | "version": "1.2.0", 493 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 494 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 495 | }, 496 | "deep-is": { 497 | "version": "0.1.3", 498 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 499 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 500 | "dev": true 501 | }, 502 | "depd": { 503 | "version": "1.1.2", 504 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 505 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 506 | }, 507 | "destroy": { 508 | "version": "1.0.4", 509 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 510 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 511 | }, 512 | "doctrine": { 513 | "version": "2.1.0", 514 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 515 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 516 | "dev": true, 517 | "requires": { 518 | "esutils": "^2.0.2" 519 | } 520 | }, 521 | "doctypes": { 522 | "version": "1.1.0", 523 | "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", 524 | "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" 525 | }, 526 | "ee-first": { 527 | "version": "1.1.1", 528 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 529 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 530 | }, 531 | "encodeurl": { 532 | "version": "1.0.2", 533 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 534 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 535 | }, 536 | "errorhandler": { 537 | "version": "1.5.1", 538 | "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", 539 | "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", 540 | "requires": { 541 | "accepts": "~1.3.7", 542 | "escape-html": "~1.0.3" 543 | } 544 | }, 545 | "escape-html": { 546 | "version": "1.0.3", 547 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 548 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 549 | }, 550 | "escape-string-regexp": { 551 | "version": "1.0.5", 552 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 553 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 554 | "dev": true 555 | }, 556 | "eslint": { 557 | "version": "4.19.1", 558 | "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", 559 | "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", 560 | "dev": true, 561 | "requires": { 562 | "ajv": "^5.3.0", 563 | "babel-code-frame": "^6.22.0", 564 | "chalk": "^2.1.0", 565 | "concat-stream": "^1.6.0", 566 | "cross-spawn": "^5.1.0", 567 | "debug": "^3.1.0", 568 | "doctrine": "^2.1.0", 569 | "eslint-scope": "^3.7.1", 570 | "eslint-visitor-keys": "^1.0.0", 571 | "espree": "^3.5.4", 572 | "esquery": "^1.0.0", 573 | "esutils": "^2.0.2", 574 | "file-entry-cache": "^2.0.0", 575 | "functional-red-black-tree": "^1.0.1", 576 | "glob": "^7.1.2", 577 | "globals": "^11.0.1", 578 | "ignore": "^3.3.3", 579 | "imurmurhash": "^0.1.4", 580 | "inquirer": "^3.0.6", 581 | "is-resolvable": "^1.0.0", 582 | "js-yaml": "^3.9.1", 583 | "json-stable-stringify-without-jsonify": "^1.0.1", 584 | "levn": "^0.3.0", 585 | "lodash": "^4.17.4", 586 | "minimatch": "^3.0.2", 587 | "mkdirp": "^0.5.1", 588 | "natural-compare": "^1.4.0", 589 | "optionator": "^0.8.2", 590 | "path-is-inside": "^1.0.2", 591 | "pluralize": "^7.0.0", 592 | "progress": "^2.0.0", 593 | "regexpp": "^1.0.1", 594 | "require-uncached": "^1.0.3", 595 | "semver": "^5.3.0", 596 | "strip-ansi": "^4.0.0", 597 | "strip-json-comments": "~2.0.1", 598 | "table": "4.0.2", 599 | "text-table": "~0.2.0" 600 | } 601 | }, 602 | "eslint-scope": { 603 | "version": "3.7.3", 604 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", 605 | "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", 606 | "dev": true, 607 | "requires": { 608 | "esrecurse": "^4.1.0", 609 | "estraverse": "^4.1.1" 610 | } 611 | }, 612 | "eslint-visitor-keys": { 613 | "version": "1.0.0", 614 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 615 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", 616 | "dev": true 617 | }, 618 | "espree": { 619 | "version": "3.5.4", 620 | "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", 621 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", 622 | "dev": true, 623 | "requires": { 624 | "acorn": "^5.5.0", 625 | "acorn-jsx": "^3.0.0" 626 | }, 627 | "dependencies": { 628 | "acorn": { 629 | "version": "5.7.3", 630 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 631 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", 632 | "dev": true 633 | } 634 | } 635 | }, 636 | "esprima": { 637 | "version": "4.0.1", 638 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 639 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 640 | "dev": true 641 | }, 642 | "esquery": { 643 | "version": "1.0.1", 644 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 645 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 646 | "dev": true, 647 | "requires": { 648 | "estraverse": "^4.0.0" 649 | } 650 | }, 651 | "esrecurse": { 652 | "version": "4.2.1", 653 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 654 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 655 | "dev": true, 656 | "requires": { 657 | "estraverse": "^4.1.0" 658 | } 659 | }, 660 | "estraverse": { 661 | "version": "4.2.0", 662 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 663 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 664 | "dev": true 665 | }, 666 | "esutils": { 667 | "version": "2.0.2", 668 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 669 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 670 | }, 671 | "etag": { 672 | "version": "1.8.1", 673 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 674 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 675 | }, 676 | "express": { 677 | "version": "4.16.4", 678 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 679 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 680 | "requires": { 681 | "accepts": "~1.3.5", 682 | "array-flatten": "1.1.1", 683 | "body-parser": "1.18.3", 684 | "content-disposition": "0.5.2", 685 | "content-type": "~1.0.4", 686 | "cookie": "0.3.1", 687 | "cookie-signature": "1.0.6", 688 | "debug": "2.6.9", 689 | "depd": "~1.1.2", 690 | "encodeurl": "~1.0.2", 691 | "escape-html": "~1.0.3", 692 | "etag": "~1.8.1", 693 | "finalhandler": "1.1.1", 694 | "fresh": "0.5.2", 695 | "merge-descriptors": "1.0.1", 696 | "methods": "~1.1.2", 697 | "on-finished": "~2.3.0", 698 | "parseurl": "~1.3.2", 699 | "path-to-regexp": "0.1.7", 700 | "proxy-addr": "~2.0.4", 701 | "qs": "6.5.2", 702 | "range-parser": "~1.2.0", 703 | "safe-buffer": "5.1.2", 704 | "send": "0.16.2", 705 | "serve-static": "1.13.2", 706 | "setprototypeof": "1.1.0", 707 | "statuses": "~1.4.0", 708 | "type-is": "~1.6.16", 709 | "utils-merge": "1.0.1", 710 | "vary": "~1.1.2" 711 | }, 712 | "dependencies": { 713 | "debug": { 714 | "version": "2.6.9", 715 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 716 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 717 | "requires": { 718 | "ms": "2.0.0" 719 | } 720 | }, 721 | "statuses": { 722 | "version": "1.4.0", 723 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 724 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 725 | } 726 | } 727 | }, 728 | "external-editor": { 729 | "version": "2.2.0", 730 | "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 731 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 732 | "dev": true, 733 | "requires": { 734 | "chardet": "^0.4.0", 735 | "iconv-lite": "^0.4.17", 736 | "tmp": "^0.0.33" 737 | } 738 | }, 739 | "fast-deep-equal": { 740 | "version": "1.1.0", 741 | "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 742 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 743 | "dev": true 744 | }, 745 | "fast-json-stable-stringify": { 746 | "version": "2.0.0", 747 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 748 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 749 | "dev": true 750 | }, 751 | "fast-levenshtein": { 752 | "version": "2.0.6", 753 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 754 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 755 | "dev": true 756 | }, 757 | "figures": { 758 | "version": "2.0.0", 759 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 760 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 761 | "dev": true, 762 | "requires": { 763 | "escape-string-regexp": "^1.0.5" 764 | } 765 | }, 766 | "file-entry-cache": { 767 | "version": "2.0.0", 768 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 769 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 770 | "dev": true, 771 | "requires": { 772 | "flat-cache": "^1.2.1", 773 | "object-assign": "^4.0.1" 774 | } 775 | }, 776 | "finalhandler": { 777 | "version": "1.1.1", 778 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 779 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 780 | "requires": { 781 | "debug": "2.6.9", 782 | "encodeurl": "~1.0.2", 783 | "escape-html": "~1.0.3", 784 | "on-finished": "~2.3.0", 785 | "parseurl": "~1.3.2", 786 | "statuses": "~1.4.0", 787 | "unpipe": "~1.0.0" 788 | }, 789 | "dependencies": { 790 | "debug": { 791 | "version": "2.6.9", 792 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 793 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 794 | "requires": { 795 | "ms": "2.0.0" 796 | } 797 | }, 798 | "statuses": { 799 | "version": "1.4.0", 800 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 801 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 802 | } 803 | } 804 | }, 805 | "flat-cache": { 806 | "version": "1.3.4", 807 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", 808 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", 809 | "dev": true, 810 | "requires": { 811 | "circular-json": "^0.3.1", 812 | "graceful-fs": "^4.1.2", 813 | "rimraf": "~2.6.2", 814 | "write": "^0.2.1" 815 | } 816 | }, 817 | "forwarded": { 818 | "version": "0.1.2", 819 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 820 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 821 | }, 822 | "fresh": { 823 | "version": "0.5.2", 824 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 825 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 826 | }, 827 | "fs.realpath": { 828 | "version": "1.0.0", 829 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 830 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 831 | "dev": true 832 | }, 833 | "functional-red-black-tree": { 834 | "version": "1.0.1", 835 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 836 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 837 | "dev": true 838 | }, 839 | "glob": { 840 | "version": "7.1.3", 841 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 842 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 843 | "dev": true, 844 | "requires": { 845 | "fs.realpath": "^1.0.0", 846 | "inflight": "^1.0.4", 847 | "inherits": "2", 848 | "minimatch": "^3.0.4", 849 | "once": "^1.3.0", 850 | "path-is-absolute": "^1.0.0" 851 | } 852 | }, 853 | "globals": { 854 | "version": "11.9.0", 855 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", 856 | "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", 857 | "dev": true 858 | }, 859 | "graceful-fs": { 860 | "version": "4.1.15", 861 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 862 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 863 | "dev": true 864 | }, 865 | "has-ansi": { 866 | "version": "2.0.0", 867 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 868 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 869 | "dev": true, 870 | "requires": { 871 | "ansi-regex": "^2.0.0" 872 | } 873 | }, 874 | "has-flag": { 875 | "version": "3.0.0", 876 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 877 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 878 | "dev": true 879 | }, 880 | "has-symbols": { 881 | "version": "1.0.1", 882 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 883 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 884 | }, 885 | "http-errors": { 886 | "version": "1.6.3", 887 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 888 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 889 | "requires": { 890 | "depd": "~1.1.2", 891 | "inherits": "2.0.3", 892 | "setprototypeof": "1.1.0", 893 | "statuses": ">= 1.4.0 < 2" 894 | } 895 | }, 896 | "iconv-lite": { 897 | "version": "0.4.23", 898 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 899 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 900 | "requires": { 901 | "safer-buffer": ">= 2.1.2 < 3" 902 | } 903 | }, 904 | "ignore": { 905 | "version": "3.3.10", 906 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 907 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", 908 | "dev": true 909 | }, 910 | "imurmurhash": { 911 | "version": "0.1.4", 912 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 913 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 914 | "dev": true 915 | }, 916 | "inflight": { 917 | "version": "1.0.6", 918 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 919 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 920 | "dev": true, 921 | "requires": { 922 | "once": "^1.3.0", 923 | "wrappy": "1" 924 | } 925 | }, 926 | "inherits": { 927 | "version": "2.0.3", 928 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 929 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 930 | }, 931 | "inquirer": { 932 | "version": "3.3.0", 933 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 934 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 935 | "dev": true, 936 | "requires": { 937 | "ansi-escapes": "^3.0.0", 938 | "chalk": "^2.0.0", 939 | "cli-cursor": "^2.1.0", 940 | "cli-width": "^2.0.0", 941 | "external-editor": "^2.0.4", 942 | "figures": "^2.0.0", 943 | "lodash": "^4.3.0", 944 | "mute-stream": "0.0.7", 945 | "run-async": "^2.2.0", 946 | "rx-lite": "^4.0.8", 947 | "rx-lite-aggregates": "^4.0.8", 948 | "string-width": "^2.1.0", 949 | "strip-ansi": "^4.0.0", 950 | "through": "^2.3.6" 951 | } 952 | }, 953 | "ipaddr.js": { 954 | "version": "1.9.1", 955 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 956 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 957 | }, 958 | "is-buffer": { 959 | "version": "1.1.6", 960 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 961 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 962 | }, 963 | "is-expression": { 964 | "version": "3.0.0", 965 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", 966 | "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", 967 | "requires": { 968 | "acorn": "~4.0.2", 969 | "object-assign": "^4.0.1" 970 | }, 971 | "dependencies": { 972 | "acorn": { 973 | "version": "4.0.13", 974 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 975 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" 976 | } 977 | } 978 | }, 979 | "is-fullwidth-code-point": { 980 | "version": "2.0.0", 981 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 982 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 983 | "dev": true 984 | }, 985 | "is-promise": { 986 | "version": "2.1.0", 987 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 988 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 989 | }, 990 | "is-regex": { 991 | "version": "1.1.0", 992 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", 993 | "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", 994 | "requires": { 995 | "has-symbols": "^1.0.1" 996 | } 997 | }, 998 | "is-resolvable": { 999 | "version": "1.1.0", 1000 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1001 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1002 | "dev": true 1003 | }, 1004 | "isarray": { 1005 | "version": "1.0.0", 1006 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1007 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1008 | "dev": true 1009 | }, 1010 | "isexe": { 1011 | "version": "2.0.0", 1012 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1013 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1014 | "dev": true 1015 | }, 1016 | "js-stringify": { 1017 | "version": "1.0.2", 1018 | "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", 1019 | "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" 1020 | }, 1021 | "js-tokens": { 1022 | "version": "3.0.2", 1023 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1024 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1025 | "dev": true 1026 | }, 1027 | "js-yaml": { 1028 | "version": "3.12.0", 1029 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 1030 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 1031 | "dev": true, 1032 | "requires": { 1033 | "argparse": "^1.0.7", 1034 | "esprima": "^4.0.0" 1035 | } 1036 | }, 1037 | "json-schema-traverse": { 1038 | "version": "0.3.1", 1039 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1040 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 1041 | "dev": true 1042 | }, 1043 | "json-stable-stringify-without-jsonify": { 1044 | "version": "1.0.1", 1045 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1046 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1047 | "dev": true 1048 | }, 1049 | "jstransformer": { 1050 | "version": "1.0.0", 1051 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", 1052 | "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", 1053 | "requires": { 1054 | "is-promise": "^2.0.0", 1055 | "promise": "^7.0.1" 1056 | } 1057 | }, 1058 | "kind-of": { 1059 | "version": "3.2.2", 1060 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1061 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1062 | "requires": { 1063 | "is-buffer": "^1.1.5" 1064 | } 1065 | }, 1066 | "lazy-cache": { 1067 | "version": "1.0.4", 1068 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1069 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 1070 | }, 1071 | "levn": { 1072 | "version": "0.3.0", 1073 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1074 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1075 | "dev": true, 1076 | "requires": { 1077 | "prelude-ls": "~1.1.2", 1078 | "type-check": "~0.3.2" 1079 | } 1080 | }, 1081 | "lodash": { 1082 | "version": "4.17.11", 1083 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 1084 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 1085 | }, 1086 | "longest": { 1087 | "version": "1.0.1", 1088 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1089 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 1090 | }, 1091 | "lru-cache": { 1092 | "version": "4.1.5", 1093 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1094 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1095 | "dev": true, 1096 | "requires": { 1097 | "pseudomap": "^1.0.2", 1098 | "yallist": "^2.1.2" 1099 | } 1100 | }, 1101 | "media-typer": { 1102 | "version": "0.3.0", 1103 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1104 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1105 | }, 1106 | "merge-descriptors": { 1107 | "version": "1.0.1", 1108 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1109 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1110 | }, 1111 | "method-override": { 1112 | "version": "2.3.10", 1113 | "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", 1114 | "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", 1115 | "requires": { 1116 | "debug": "2.6.9", 1117 | "methods": "~1.1.2", 1118 | "parseurl": "~1.3.2", 1119 | "vary": "~1.1.2" 1120 | }, 1121 | "dependencies": { 1122 | "debug": { 1123 | "version": "2.6.9", 1124 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1125 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1126 | "requires": { 1127 | "ms": "2.0.0" 1128 | } 1129 | } 1130 | } 1131 | }, 1132 | "methods": { 1133 | "version": "1.1.2", 1134 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1135 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1136 | }, 1137 | "mime": { 1138 | "version": "1.4.1", 1139 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1140 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 1141 | }, 1142 | "mime-db": { 1143 | "version": "1.44.0", 1144 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1145 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1146 | }, 1147 | "mime-types": { 1148 | "version": "2.1.27", 1149 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1150 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1151 | "requires": { 1152 | "mime-db": "1.44.0" 1153 | } 1154 | }, 1155 | "mimic-fn": { 1156 | "version": "1.2.0", 1157 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1158 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1159 | "dev": true 1160 | }, 1161 | "minimatch": { 1162 | "version": "3.0.4", 1163 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1164 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1165 | "dev": true, 1166 | "requires": { 1167 | "brace-expansion": "^1.1.7" 1168 | } 1169 | }, 1170 | "minimist": { 1171 | "version": "0.0.8", 1172 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1173 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1174 | "dev": true 1175 | }, 1176 | "mkdirp": { 1177 | "version": "0.5.1", 1178 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1179 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1180 | "dev": true, 1181 | "requires": { 1182 | "minimist": "0.0.8" 1183 | } 1184 | }, 1185 | "morgan": { 1186 | "version": "1.9.1", 1187 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 1188 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 1189 | "requires": { 1190 | "basic-auth": "~2.0.0", 1191 | "debug": "2.6.9", 1192 | "depd": "~1.1.2", 1193 | "on-finished": "~2.3.0", 1194 | "on-headers": "~1.0.1" 1195 | }, 1196 | "dependencies": { 1197 | "debug": { 1198 | "version": "2.6.9", 1199 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1200 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1201 | "requires": { 1202 | "ms": "2.0.0" 1203 | } 1204 | } 1205 | } 1206 | }, 1207 | "ms": { 1208 | "version": "2.0.0", 1209 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1210 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1211 | }, 1212 | "mute-stream": { 1213 | "version": "0.0.7", 1214 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1215 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1216 | "dev": true 1217 | }, 1218 | "natural-compare": { 1219 | "version": "1.4.0", 1220 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1221 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1222 | "dev": true 1223 | }, 1224 | "negotiator": { 1225 | "version": "0.6.2", 1226 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 1227 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1228 | }, 1229 | "object-assign": { 1230 | "version": "4.1.1", 1231 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1232 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1233 | }, 1234 | "on-finished": { 1235 | "version": "2.3.0", 1236 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1237 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1238 | "requires": { 1239 | "ee-first": "1.1.1" 1240 | } 1241 | }, 1242 | "on-headers": { 1243 | "version": "1.0.2", 1244 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1245 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 1246 | }, 1247 | "once": { 1248 | "version": "1.4.0", 1249 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1250 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1251 | "dev": true, 1252 | "requires": { 1253 | "wrappy": "1" 1254 | } 1255 | }, 1256 | "onetime": { 1257 | "version": "2.0.1", 1258 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1259 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1260 | "dev": true, 1261 | "requires": { 1262 | "mimic-fn": "^1.0.0" 1263 | } 1264 | }, 1265 | "optionator": { 1266 | "version": "0.8.2", 1267 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1268 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1269 | "dev": true, 1270 | "requires": { 1271 | "deep-is": "~0.1.3", 1272 | "fast-levenshtein": "~2.0.4", 1273 | "levn": "~0.3.0", 1274 | "prelude-ls": "~1.1.2", 1275 | "type-check": "~0.3.2", 1276 | "wordwrap": "~1.0.0" 1277 | }, 1278 | "dependencies": { 1279 | "wordwrap": { 1280 | "version": "1.0.0", 1281 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1282 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1283 | "dev": true 1284 | } 1285 | } 1286 | }, 1287 | "os-tmpdir": { 1288 | "version": "1.0.2", 1289 | "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1290 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1291 | "dev": true 1292 | }, 1293 | "parseurl": { 1294 | "version": "1.3.3", 1295 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1296 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1297 | }, 1298 | "path-is-absolute": { 1299 | "version": "1.0.1", 1300 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1301 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1302 | "dev": true 1303 | }, 1304 | "path-is-inside": { 1305 | "version": "1.0.2", 1306 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1307 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1308 | "dev": true 1309 | }, 1310 | "path-parse": { 1311 | "version": "1.0.6", 1312 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1313 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1314 | }, 1315 | "path-to-regexp": { 1316 | "version": "0.1.7", 1317 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1318 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1319 | }, 1320 | "pluralize": { 1321 | "version": "7.0.0", 1322 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1323 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1324 | "dev": true 1325 | }, 1326 | "prelude-ls": { 1327 | "version": "1.1.2", 1328 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1329 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1330 | "dev": true 1331 | }, 1332 | "prismic-dom": { 1333 | "version": "2.2.4", 1334 | "resolved": "https://registry.npmjs.org/prismic-dom/-/prismic-dom-2.2.4.tgz", 1335 | "integrity": "sha512-NLOfOSp7XVpdhWBd92RSiOZ75QISsSTQPTQN1AqcILtg1/zumqpwYKvz41tl+FeWJYfKPTHanvukhWkanfTngA==", 1336 | "requires": { 1337 | "@prismicio/helpers": "^1.0.4", 1338 | "@prismicio/richtext": "^1.1.0", 1339 | "escape-html": "1.0.3" 1340 | } 1341 | }, 1342 | "process-nextick-args": { 1343 | "version": "2.0.0", 1344 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1345 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1346 | "dev": true 1347 | }, 1348 | "progress": { 1349 | "version": "2.0.3", 1350 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1351 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1352 | "dev": true 1353 | }, 1354 | "promise": { 1355 | "version": "7.3.1", 1356 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 1357 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 1358 | "requires": { 1359 | "asap": "~2.0.3" 1360 | } 1361 | }, 1362 | "proxy-addr": { 1363 | "version": "2.0.6", 1364 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 1365 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 1366 | "requires": { 1367 | "forwarded": "~0.1.2", 1368 | "ipaddr.js": "1.9.1" 1369 | } 1370 | }, 1371 | "pseudomap": { 1372 | "version": "1.0.2", 1373 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1374 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1375 | "dev": true 1376 | }, 1377 | "pug": { 1378 | "version": "2.0.4", 1379 | "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", 1380 | "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", 1381 | "requires": { 1382 | "pug-code-gen": "^2.0.2", 1383 | "pug-filters": "^3.1.1", 1384 | "pug-lexer": "^4.1.0", 1385 | "pug-linker": "^3.0.6", 1386 | "pug-load": "^2.0.12", 1387 | "pug-parser": "^5.0.1", 1388 | "pug-runtime": "^2.0.5", 1389 | "pug-strip-comments": "^1.0.4" 1390 | } 1391 | }, 1392 | "pug-attrs": { 1393 | "version": "2.0.4", 1394 | "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", 1395 | "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", 1396 | "requires": { 1397 | "constantinople": "^3.0.1", 1398 | "js-stringify": "^1.0.1", 1399 | "pug-runtime": "^2.0.5" 1400 | } 1401 | }, 1402 | "pug-code-gen": { 1403 | "version": "2.0.2", 1404 | "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.2.tgz", 1405 | "integrity": "sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==", 1406 | "requires": { 1407 | "constantinople": "^3.1.2", 1408 | "doctypes": "^1.1.0", 1409 | "js-stringify": "^1.0.1", 1410 | "pug-attrs": "^2.0.4", 1411 | "pug-error": "^1.3.3", 1412 | "pug-runtime": "^2.0.5", 1413 | "void-elements": "^2.0.1", 1414 | "with": "^5.0.0" 1415 | } 1416 | }, 1417 | "pug-error": { 1418 | "version": "1.3.3", 1419 | "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", 1420 | "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" 1421 | }, 1422 | "pug-filters": { 1423 | "version": "3.1.1", 1424 | "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", 1425 | "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", 1426 | "requires": { 1427 | "clean-css": "^4.1.11", 1428 | "constantinople": "^3.0.1", 1429 | "jstransformer": "1.0.0", 1430 | "pug-error": "^1.3.3", 1431 | "pug-walk": "^1.1.8", 1432 | "resolve": "^1.1.6", 1433 | "uglify-js": "^2.6.1" 1434 | } 1435 | }, 1436 | "pug-lexer": { 1437 | "version": "4.1.0", 1438 | "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", 1439 | "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", 1440 | "requires": { 1441 | "character-parser": "^2.1.1", 1442 | "is-expression": "^3.0.0", 1443 | "pug-error": "^1.3.3" 1444 | } 1445 | }, 1446 | "pug-linker": { 1447 | "version": "3.0.6", 1448 | "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", 1449 | "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", 1450 | "requires": { 1451 | "pug-error": "^1.3.3", 1452 | "pug-walk": "^1.1.8" 1453 | } 1454 | }, 1455 | "pug-load": { 1456 | "version": "2.0.12", 1457 | "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", 1458 | "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", 1459 | "requires": { 1460 | "object-assign": "^4.1.0", 1461 | "pug-walk": "^1.1.8" 1462 | } 1463 | }, 1464 | "pug-parser": { 1465 | "version": "5.0.1", 1466 | "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", 1467 | "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", 1468 | "requires": { 1469 | "pug-error": "^1.3.3", 1470 | "token-stream": "0.0.1" 1471 | } 1472 | }, 1473 | "pug-runtime": { 1474 | "version": "2.0.5", 1475 | "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", 1476 | "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" 1477 | }, 1478 | "pug-strip-comments": { 1479 | "version": "1.0.4", 1480 | "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", 1481 | "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", 1482 | "requires": { 1483 | "pug-error": "^1.3.3" 1484 | } 1485 | }, 1486 | "pug-walk": { 1487 | "version": "1.1.8", 1488 | "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", 1489 | "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" 1490 | }, 1491 | "qs": { 1492 | "version": "6.5.2", 1493 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1494 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1495 | }, 1496 | "range-parser": { 1497 | "version": "1.2.1", 1498 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1499 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1500 | }, 1501 | "raw-body": { 1502 | "version": "2.3.3", 1503 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 1504 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 1505 | "requires": { 1506 | "bytes": "3.0.0", 1507 | "http-errors": "1.6.3", 1508 | "iconv-lite": "0.4.23", 1509 | "unpipe": "1.0.0" 1510 | } 1511 | }, 1512 | "readable-stream": { 1513 | "version": "2.3.6", 1514 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1515 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1516 | "dev": true, 1517 | "requires": { 1518 | "core-util-is": "~1.0.0", 1519 | "inherits": "~2.0.3", 1520 | "isarray": "~1.0.0", 1521 | "process-nextick-args": "~2.0.0", 1522 | "safe-buffer": "~5.1.1", 1523 | "string_decoder": "~1.1.1", 1524 | "util-deprecate": "~1.0.1" 1525 | } 1526 | }, 1527 | "regenerator-runtime": { 1528 | "version": "0.11.1", 1529 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 1530 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 1531 | }, 1532 | "regexpp": { 1533 | "version": "1.1.0", 1534 | "resolved": "http://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", 1535 | "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", 1536 | "dev": true 1537 | }, 1538 | "repeat-string": { 1539 | "version": "1.6.1", 1540 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1541 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 1542 | }, 1543 | "require-uncached": { 1544 | "version": "1.0.3", 1545 | "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1546 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1547 | "dev": true, 1548 | "requires": { 1549 | "caller-path": "^0.1.0", 1550 | "resolve-from": "^1.0.0" 1551 | } 1552 | }, 1553 | "resolve": { 1554 | "version": "1.17.0", 1555 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1556 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1557 | "requires": { 1558 | "path-parse": "^1.0.6" 1559 | } 1560 | }, 1561 | "resolve-from": { 1562 | "version": "1.0.1", 1563 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1564 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1565 | "dev": true 1566 | }, 1567 | "restore-cursor": { 1568 | "version": "2.0.0", 1569 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1570 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1571 | "dev": true, 1572 | "requires": { 1573 | "onetime": "^2.0.0", 1574 | "signal-exit": "^3.0.2" 1575 | } 1576 | }, 1577 | "right-align": { 1578 | "version": "0.1.3", 1579 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1580 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1581 | "requires": { 1582 | "align-text": "^0.1.1" 1583 | } 1584 | }, 1585 | "rimraf": { 1586 | "version": "2.6.2", 1587 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1588 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1589 | "dev": true, 1590 | "requires": { 1591 | "glob": "^7.0.5" 1592 | } 1593 | }, 1594 | "run-async": { 1595 | "version": "2.3.0", 1596 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1597 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1598 | "dev": true, 1599 | "requires": { 1600 | "is-promise": "^2.1.0" 1601 | } 1602 | }, 1603 | "rx-lite": { 1604 | "version": "4.0.8", 1605 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 1606 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", 1607 | "dev": true 1608 | }, 1609 | "rx-lite-aggregates": { 1610 | "version": "4.0.8", 1611 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 1612 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1613 | "dev": true, 1614 | "requires": { 1615 | "rx-lite": "*" 1616 | } 1617 | }, 1618 | "safe-buffer": { 1619 | "version": "5.1.2", 1620 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1621 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1622 | }, 1623 | "safer-buffer": { 1624 | "version": "2.1.2", 1625 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1626 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1627 | }, 1628 | "semver": { 1629 | "version": "5.6.0", 1630 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1631 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", 1632 | "dev": true 1633 | }, 1634 | "send": { 1635 | "version": "0.16.2", 1636 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1637 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1638 | "requires": { 1639 | "debug": "2.6.9", 1640 | "depd": "~1.1.2", 1641 | "destroy": "~1.0.4", 1642 | "encodeurl": "~1.0.2", 1643 | "escape-html": "~1.0.3", 1644 | "etag": "~1.8.1", 1645 | "fresh": "0.5.2", 1646 | "http-errors": "~1.6.2", 1647 | "mime": "1.4.1", 1648 | "ms": "2.0.0", 1649 | "on-finished": "~2.3.0", 1650 | "range-parser": "~1.2.0", 1651 | "statuses": "~1.4.0" 1652 | }, 1653 | "dependencies": { 1654 | "debug": { 1655 | "version": "2.6.9", 1656 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1657 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1658 | "requires": { 1659 | "ms": "2.0.0" 1660 | } 1661 | }, 1662 | "statuses": { 1663 | "version": "1.4.0", 1664 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1665 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1666 | } 1667 | } 1668 | }, 1669 | "serve-favicon": { 1670 | "version": "2.4.5", 1671 | "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.4.5.tgz", 1672 | "integrity": "sha512-s7F8h2NrslMkG50KxvlGdj+ApSwaLex0vexuJ9iFf3GLTIp1ph/l1qZvRe9T9TJEYZgmq72ZwJ2VYiAEtChknw==", 1673 | "requires": { 1674 | "etag": "~1.8.1", 1675 | "fresh": "0.5.2", 1676 | "ms": "2.0.0", 1677 | "parseurl": "~1.3.2", 1678 | "safe-buffer": "5.1.1" 1679 | }, 1680 | "dependencies": { 1681 | "safe-buffer": { 1682 | "version": "5.1.1", 1683 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1684 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 1685 | } 1686 | } 1687 | }, 1688 | "serve-static": { 1689 | "version": "1.13.2", 1690 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1691 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1692 | "requires": { 1693 | "encodeurl": "~1.0.2", 1694 | "escape-html": "~1.0.3", 1695 | "parseurl": "~1.3.2", 1696 | "send": "0.16.2" 1697 | } 1698 | }, 1699 | "setprototypeof": { 1700 | "version": "1.1.0", 1701 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1702 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1703 | }, 1704 | "shebang-command": { 1705 | "version": "1.2.0", 1706 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1707 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1708 | "dev": true, 1709 | "requires": { 1710 | "shebang-regex": "^1.0.0" 1711 | } 1712 | }, 1713 | "shebang-regex": { 1714 | "version": "1.0.0", 1715 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1716 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1717 | "dev": true 1718 | }, 1719 | "signal-exit": { 1720 | "version": "3.0.2", 1721 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1722 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1723 | "dev": true 1724 | }, 1725 | "slice-ansi": { 1726 | "version": "1.0.0", 1727 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 1728 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 1729 | "dev": true, 1730 | "requires": { 1731 | "is-fullwidth-code-point": "^2.0.0" 1732 | } 1733 | }, 1734 | "source-map": { 1735 | "version": "0.6.1", 1736 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1737 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1738 | }, 1739 | "sprintf-js": { 1740 | "version": "1.0.3", 1741 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1742 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1743 | "dev": true 1744 | }, 1745 | "statuses": { 1746 | "version": "1.5.0", 1747 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1748 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1749 | }, 1750 | "string-width": { 1751 | "version": "2.1.1", 1752 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1753 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1754 | "dev": true, 1755 | "requires": { 1756 | "is-fullwidth-code-point": "^2.0.0", 1757 | "strip-ansi": "^4.0.0" 1758 | } 1759 | }, 1760 | "string_decoder": { 1761 | "version": "1.1.1", 1762 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1763 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1764 | "dev": true, 1765 | "requires": { 1766 | "safe-buffer": "~5.1.0" 1767 | } 1768 | }, 1769 | "strip-ansi": { 1770 | "version": "4.0.0", 1771 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1772 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1773 | "dev": true, 1774 | "requires": { 1775 | "ansi-regex": "^3.0.0" 1776 | }, 1777 | "dependencies": { 1778 | "ansi-regex": { 1779 | "version": "3.0.0", 1780 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1781 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1782 | "dev": true 1783 | } 1784 | } 1785 | }, 1786 | "strip-json-comments": { 1787 | "version": "2.0.1", 1788 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1789 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1790 | "dev": true 1791 | }, 1792 | "supports-color": { 1793 | "version": "2.0.0", 1794 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1795 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1796 | "dev": true 1797 | }, 1798 | "table": { 1799 | "version": "4.0.2", 1800 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", 1801 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", 1802 | "dev": true, 1803 | "requires": { 1804 | "ajv": "^5.2.3", 1805 | "ajv-keywords": "^2.1.0", 1806 | "chalk": "^2.1.0", 1807 | "lodash": "^4.17.4", 1808 | "slice-ansi": "1.0.0", 1809 | "string-width": "^2.1.1" 1810 | } 1811 | }, 1812 | "text-table": { 1813 | "version": "0.2.0", 1814 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1815 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1816 | "dev": true 1817 | }, 1818 | "through": { 1819 | "version": "2.3.8", 1820 | "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 1821 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1822 | "dev": true 1823 | }, 1824 | "tmp": { 1825 | "version": "0.0.33", 1826 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1827 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1828 | "dev": true, 1829 | "requires": { 1830 | "os-tmpdir": "~1.0.2" 1831 | } 1832 | }, 1833 | "to-fast-properties": { 1834 | "version": "1.0.3", 1835 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 1836 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" 1837 | }, 1838 | "token-stream": { 1839 | "version": "0.0.1", 1840 | "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", 1841 | "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=" 1842 | }, 1843 | "type-check": { 1844 | "version": "0.3.2", 1845 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1846 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1847 | "dev": true, 1848 | "requires": { 1849 | "prelude-ls": "~1.1.2" 1850 | } 1851 | }, 1852 | "type-is": { 1853 | "version": "1.6.18", 1854 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1855 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1856 | "requires": { 1857 | "media-typer": "0.3.0", 1858 | "mime-types": "~2.1.24" 1859 | } 1860 | }, 1861 | "typedarray": { 1862 | "version": "0.0.6", 1863 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1864 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1865 | "dev": true 1866 | }, 1867 | "uglify-js": { 1868 | "version": "2.8.29", 1869 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 1870 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 1871 | "requires": { 1872 | "source-map": "~0.5.1", 1873 | "uglify-to-browserify": "~1.0.0", 1874 | "yargs": "~3.10.0" 1875 | }, 1876 | "dependencies": { 1877 | "source-map": { 1878 | "version": "0.5.7", 1879 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1880 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1881 | } 1882 | } 1883 | }, 1884 | "uglify-to-browserify": { 1885 | "version": "1.0.2", 1886 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1887 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1888 | "optional": true 1889 | }, 1890 | "unpipe": { 1891 | "version": "1.0.0", 1892 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1893 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1894 | }, 1895 | "util-deprecate": { 1896 | "version": "1.0.2", 1897 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1898 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1899 | "dev": true 1900 | }, 1901 | "utils-merge": { 1902 | "version": "1.0.1", 1903 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1904 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1905 | }, 1906 | "vary": { 1907 | "version": "1.1.2", 1908 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1909 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1910 | }, 1911 | "void-elements": { 1912 | "version": "2.0.1", 1913 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 1914 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" 1915 | }, 1916 | "which": { 1917 | "version": "1.3.1", 1918 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1919 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1920 | "dev": true, 1921 | "requires": { 1922 | "isexe": "^2.0.0" 1923 | } 1924 | }, 1925 | "window-size": { 1926 | "version": "0.1.0", 1927 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1928 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 1929 | }, 1930 | "with": { 1931 | "version": "5.1.1", 1932 | "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", 1933 | "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", 1934 | "requires": { 1935 | "acorn": "^3.1.0", 1936 | "acorn-globals": "^3.0.0" 1937 | } 1938 | }, 1939 | "wordwrap": { 1940 | "version": "0.0.2", 1941 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 1942 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 1943 | }, 1944 | "wrappy": { 1945 | "version": "1.0.2", 1946 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1947 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1948 | "dev": true 1949 | }, 1950 | "write": { 1951 | "version": "0.2.1", 1952 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 1953 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 1954 | "dev": true, 1955 | "requires": { 1956 | "mkdirp": "^0.5.1" 1957 | } 1958 | }, 1959 | "yallist": { 1960 | "version": "2.1.2", 1961 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1962 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1963 | "dev": true 1964 | }, 1965 | "yargs": { 1966 | "version": "3.10.0", 1967 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 1968 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1969 | "requires": { 1970 | "camelcase": "^1.0.2", 1971 | "cliui": "^2.1.0", 1972 | "decamelize": "^1.0.0", 1973 | "window-size": "0.1.0" 1974 | } 1975 | } 1976 | } 1977 | } 1978 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "javascript-nodejs-starter", 3 | "version": "2.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js", 7 | "lint": "eslint app.js config.js prismic-configuration.js", 8 | "test": "npm run lint" 9 | }, 10 | "dependencies": { 11 | "@prismicio/client": "^4.0.0", 12 | "body-parser": "~1.18.2", 13 | "debug": "~3.1.0", 14 | "errorhandler": "~1.5.0", 15 | "express": "~4.16.1", 16 | "method-override": "~2.3.10", 17 | "morgan": "~1.9.0", 18 | "prismic-dom": "^2.2.4", 19 | "pug": "^2.0.0-alpha6", 20 | "serve-favicon": "~2.4.5" 21 | }, 22 | "repository": { 23 | "type": "git", 24 | "url": "http://github.com/prismicio/javascript-nodejs-starter.git" 25 | }, 26 | "devDependencies": { 27 | "eslint": "^4.8.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /prismic-configuration.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | apiEndpoint: 'https://your-repo-name.prismic.io/api/v2', 4 | 5 | // -- Access token if the Master is not open 6 | // accessToken: 'xxxxxx', 7 | 8 | // OAuth 9 | // clientId: 'xxxxxx', 10 | // clientSecret: 'xxxxxx', 11 | 12 | snipcartKey: 'your-snipcart-api-key', 13 | 14 | // -- Links resolution rules 15 | // This function will be used to generate links to Prismic.io documents 16 | // As your project grows, you should update this function according to your routes 17 | linkResolver: function (doc) { 18 | if (doc.type == 'category') { 19 | return '/category/' + doc.uid; 20 | } 21 | if (doc.type == 'product') { 22 | return '/product/' + doc.uid; 23 | } 24 | return '/'; 25 | } 26 | }; -------------------------------------------------------------------------------- /public/images/cart-icon-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prismicio/nodejs-example-snipcart/2a7cb5e6dff1119440b911d61cf48117b3bf5d5b/public/images/cart-icon-active.png -------------------------------------------------------------------------------- /public/images/cart-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prismicio/nodejs-example-snipcart/2a7cb5e6dff1119440b911d61cf48117b3bf5d5b/public/images/cart-icon.png -------------------------------------------------------------------------------- /public/images/punch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/prismicio/nodejs-example-snipcart/2a7cb5e6dff1119440b911d61cf48117b3bf5d5b/public/images/punch.png -------------------------------------------------------------------------------- /public/javascript/functions.js: -------------------------------------------------------------------------------- 1 | // On document load 2 | $( document ).ready(function() { 3 | 4 | // Function to remove the cart count and reset the cart color 5 | function defaultCart() { 6 | $('.shopping-cart').css('background-image', 'url("../images/cart-icon.png")'); 7 | $('.cart-count').hide(); 8 | } 9 | 10 | // Function to show the cart count and change the color of the cart to green 11 | function highlightedCart() { 12 | $('.cart-count').show(); 13 | $('.shopping-cart').css('background-image', 'url("../images/cart-icon-active.png")'); 14 | } 15 | 16 | // Display custom text in the snipcart shopping cart 17 | Snipcart.execute('bind', 'cart.opened', function() { 18 | Snipcart.execute('unbind', 'cart.opened'); 19 | 20 | var html = $("#cart-content-text").html(); 21 | $(html).insertBefore($("#snipcart-footer")); 22 | }); 23 | 24 | // If there is nothing in the cart on page load, don't display a number 25 | Snipcart.subscribe('cart.ready', function (data) { 26 | var cartCount = data.order ? data.order.items.length : 0; 27 | if (cartCount > 0) { 28 | $('.cart-count').show(); 29 | $('.shopping-cart').css('background-image', 'url("../images/cart-icon-active.png")'); 30 | } else { 31 | $('.shopping-cart').css('background-image', 'url("../images/cart-icon.png")'); 32 | } 33 | }); 34 | 35 | // If an item is added to the cart, set to highlighted cart 36 | Snipcart.subscribe('item.added', function (ev, item, items) { 37 | highlightedCart(); 38 | $("html, body").animate({ scrollTop: 0 }, "slow"); 39 | $('.added-to-cart').stop(true, false).slideDown('slow').delay(2000).slideUp('slow'); 40 | return false; 41 | }); 42 | 43 | // If all items are removed, set to default cart 44 | Snipcart.subscribe('item.removed', function (ev, item, items) { 45 | var cartCount = Snipcart.api.items.count(); 46 | if (cartCount == 0) { 47 | defaultCart() 48 | } 49 | }); 50 | 51 | // If an order is completed, set to default cart 52 | Snipcart.subscribe('order.completed', function (data) { 53 | defaultCart() 54 | }); 55 | }); -------------------------------------------------------------------------------- /public/stylesheets/common.css: -------------------------------------------------------------------------------- 1 | * { 2 | -webkit-font-smoothing: antialiased; 3 | } 4 | ::selection { 5 | background: #FFF7C7; /* WebKit/Blink Browsers */ 6 | } 7 | ::-moz-selection { 8 | background: #FFF7C7; /* Gecko Browsers */ 9 | } 10 | 11 | /* 12 | * Globals 13 | */ 14 | body { 15 | padding: 0; 16 | color: #72767b; 17 | font-family: Montserrat, sans-serif; 18 | font-size: 16px; 19 | font-weight: 400; 20 | letter-spacing : 0.4; 21 | line-height: 28px; 22 | } 23 | a { 24 | color: #72767B; 25 | font-size: 14px; 26 | font-weight: 400; 27 | letter-spacing : 0.35; 28 | line-height: 28px; 29 | text-decoration: none; 30 | } 31 | p a { 32 | text-decoration: underline; 33 | } 34 | h1, h2, h3, h4, h5, h6 { 35 | font-family: Montserrat, sans-serif; 36 | } 37 | h1, h1 a { 38 | font-size: 26px; 39 | font-weight: bold; 40 | color: #2F2F2F; 41 | line-height: 32px; 42 | letter-spacing : 0.5; 43 | margin-bottom: 1rem; 44 | } 45 | h2, h2 a { 46 | font-size: 13px; 47 | font-weight: normal; 48 | color: #AFAFAF; 49 | line-height: 13px; 50 | letter-spacing : 0.3; 51 | text-transform: uppercase; 52 | margin-bottom: 1rem; 53 | } 54 | h3, h3 a { 55 | font-size: 20px; 56 | font-weight: normal; 57 | color: #2F2F2F; 58 | line-height: 30px; 59 | letter-spacing : 0.5; 60 | margin-bottom: 1rem; 61 | } 62 | p { 63 | margin-bottom: 2rem; 64 | } 65 | pre, ul { 66 | margin-bottom: 20px; 67 | } 68 | strong { 69 | font-weight: bold; 70 | } 71 | em { 72 | font-style: italic; 73 | } 74 | img { 75 | max-width: 100%; 76 | } -------------------------------------------------------------------------------- /public/stylesheets/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, menu, nav, section { 29 | display: block; 30 | } 31 | body { 32 | line-height: 1; 33 | } 34 | ol, ul { 35 | list-style: none; 36 | } 37 | blockquote, q { 38 | quotes: none; 39 | } 40 | blockquote:before, blockquote:after, 41 | q:before, q:after { 42 | content: ''; 43 | content: none; 44 | } 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } 49 | -------------------------------------------------------------------------------- /public/stylesheets/snipcart-style.css: -------------------------------------------------------------------------------- 1 | /* Snipcart pop-up styles */ 2 | .snip-layout { 3 | font-family: Montserrat, sans-serif; 4 | } 5 | .snip-layout .snip-header { 6 | background-color: #F7F7F7; 7 | } 8 | .snip-layout .snip-header__title { 9 | color: #4FD37E; 10 | } 11 | .snip-layout .snip-header__total { 12 | background-color: transparent; 13 | color: #2F2F2F; 14 | } 15 | .snip-layout .snip-ico.snip-ico--close { 16 | color: #000000; 17 | } 18 | .snip-layout .snip-loader--bar { 19 | background-color: #F7F7F7; 20 | } 21 | .snip-layout .snip-loader--bar::before { 22 | background-color: #4FD37E; 23 | } 24 | .snip-layout .snip-btn--highlight { 25 | background-color: #4FD37E; 26 | color: #FFFFFF; 27 | } 28 | .snip-layout .snip-btn--highlight:hover { 29 | background-color: #4FD37E; 30 | } 31 | .snip-layout .snip-flash .snip-flash__item { 32 | color: #FFFFFF; 33 | border-bottom: none; 34 | } 35 | .snip-layout .custom-snipcart-footer-text { 36 | text-align: center; 37 | margin: 10px; 38 | } 39 | .snip-layout .snip-footer { 40 | background-color: #F7F7F7; 41 | } -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | /* General */ 2 | .container, header, footer { 3 | max-width: 980px; 4 | margin: auto; 5 | padding: 0 20px; 6 | } 7 | .button { 8 | display: inline-block; 9 | padding: 20px 60px; 10 | font-size: 16px; 11 | line-height: 16px; 12 | font-weight: normal; 13 | letter-spacing: 0.4; 14 | color: #ffffff; 15 | background: #4FD37E; 16 | text-transform: uppercase; 17 | border-radius: 4px; 18 | } 19 | 20 | /* Header */ 21 | header { 22 | display: flex; 23 | justify-content: space-between; 24 | align-items: center; 25 | padding: 40px 20px; 26 | } 27 | .logo { 28 | max-height: 40px; 29 | max-width: 200px; 30 | } 31 | .logo-text { 32 | display: block; 33 | font-size: 20px; 34 | font-weight: bold; 35 | color: #2F2F2F; 36 | line-height: 20px; 37 | letter-spacing : 0.5; 38 | } 39 | .utility-nav ul { 40 | list-style: none; 41 | margin: 0; 42 | } 43 | .utility-nav ul li { 44 | display: inline-block; 45 | vertical-align: middle; 46 | } 47 | .utility-nav ul, 48 | .utility-nav a { 49 | font-size: 16px; 50 | font-weight: regular; 51 | color: #AFAFAF; 52 | line-height: 16px; 53 | letter-spacing : 0.4; 54 | } 55 | .snipcart-checkout { 56 | display: inline-flex; 57 | align-items: center; 58 | position: relative; 59 | } 60 | .shopping-cart { 61 | width: 20px; 62 | height: 20px; 63 | margin-right: 20px; 64 | margin-left: 5px; 65 | background: #FFFFFF center center no-repeat; 66 | background-size: 100%; 67 | } 68 | .cart-count { 69 | display: none; 70 | position: absolute; 71 | left: 28px; 72 | color: #4FD37E; 73 | } 74 | 75 | 76 | /* Main Navigation */ 77 | .main-nav { 78 | position: relative; 79 | width: 100%; 80 | height: 60px; 81 | margin-bottom: 40px; 82 | text-align: center; 83 | background: #F7F7F7; 84 | } 85 | .main-nav ul { 86 | list-style: none; 87 | margin: 0; 88 | } 89 | .main-nav ul li { 90 | display: inline-block; 91 | margin: 0 10px; 92 | } 93 | .main-nav ul, 94 | .main-nav a { 95 | font-size: 16px; 96 | font-weight: regular; 97 | color: #2F2F2F; 98 | line-height: 60px; 99 | letter-spacing : 0.4; 100 | } 101 | .main-nav a:hover { 102 | color: #000000; 103 | } 104 | .added-to-cart { 105 | display: none; 106 | position: absolute; 107 | width: 100%; 108 | height: 100%; 109 | background: #4FD37E; 110 | text-align: center; 111 | } 112 | .added-to-cart p { 113 | margin: 0; 114 | padding: 0; 115 | font-size: 16px; 116 | line-height: 60px; 117 | letter-spacing : 0.4; 118 | color: #FFFFFF; 119 | } 120 | 121 | /* Product Listing */ 122 | .product-list { 123 | display: flex; 124 | flex-wrap: wrap; 125 | justify-content: center; 126 | } 127 | .product-list-item { 128 | width: 300px; 129 | margin-right: 20px; 130 | margin-bottom: 20px; 131 | text-align: center; 132 | } 133 | .product-list-item:nth-child(3n) { 134 | margin-right: 0; 135 | } 136 | .product-list-image { 137 | margin-bottom: 20px; 138 | } 139 | .product-list-title { 140 | line-height: 20px; 141 | margin-bottom: 20px; 142 | } 143 | .product-list-price { 144 | font-size: 20px; 145 | font-weight: bold; 146 | color: #2F2F2F; 147 | line-height: 20px; 148 | letter-spacing : 0.5; 149 | } 150 | 151 | 152 | /* Product Details */ 153 | .product-details { 154 | display: flex; 155 | justify-content: space-between; 156 | padding-bottom: 80px; 157 | } 158 | .product-image { 159 | flex: 1; 160 | margin-right: 20px; 161 | } 162 | .product-info { 163 | flex: 1; 164 | } 165 | .product-info h1 { 166 | margin-bottom: 10px; 167 | } 168 | .product-price { 169 | font-size: 22px; 170 | font-weight: normal; 171 | color: #2F2F2F; 172 | line-height: 28px; 173 | letter-spacing : 0.5; 174 | margin-bottom: 30px; 175 | } 176 | .product-description { 177 | margin-bottom: 40px; 178 | text-align: left; 179 | font-family: Lato, sans-serif; 180 | font-size: 17px; 181 | letter-spacing: 0.2; 182 | color: #2F2F2F; 183 | } 184 | .recommended { 185 | padding-top: 20px; 186 | border-top: 3px solid #F7F7F7; 187 | } 188 | .recommended-wrapper { 189 | display: flex; 190 | flex-wrap: wrap; 191 | justify-content: center; 192 | } 193 | .recommended-product { 194 | margin-right: 20px; 195 | margin-bottom: 20px; 196 | text-align: center; 197 | } 198 | .recommended-product:nth-child(3n) { 199 | margin-right: 0; 200 | } 201 | .recommended-image { 202 | margin-bottom: 10px; 203 | } 204 | .recommended-title { 205 | margin-bottom: 20px; 206 | font-size: 16px; 207 | font-weight: regular; 208 | color: #2F2F2F; 209 | line-height: 16px; 210 | letter-spacing : 0.4; 211 | text-align: center; 212 | } 213 | .recommended-price { 214 | margin-bottom: 20px; 215 | font-size: 18px; 216 | font-weight: bold; 217 | color: #2F2F2F; 218 | line-height: 18px; 219 | letter-spacing : 0.5; 220 | text-align: center; 221 | } 222 | 223 | 224 | /* Footer */ 225 | footer { 226 | display: flex; 227 | justify-content: space-between; 228 | align-items: center; 229 | margin-top: 40px; 230 | padding: 40px 20px; 231 | border-top: 3px solid #F7F7F7; 232 | } 233 | .footer-nav ul { 234 | list-style: none; 235 | margin: 0; 236 | } 237 | .footer-nav ul li { 238 | display: inline-block; 239 | margin: 0 20px 0 0; 240 | } 241 | footer p, 242 | footer a { 243 | margin: 0; 244 | font-size: 13px; 245 | font-weight: normal; 246 | color: #AFAFAF; 247 | line-height: 13px; 248 | letter-spacing : 0.3; 249 | text-transform: uppercase; 250 | } 251 | footer a { 252 | text-decoration: none; 253 | } 254 | 255 | /* Error handler & 404 pages */ 256 | .error-container { 257 | max-width: 600px; 258 | margin: auto; 259 | margin-top: 230px; 260 | margin-bottom: 449px; 261 | } 262 | .error-container h3 { 263 | text-align: center; 264 | font-size: 60px; 265 | } 266 | .error-container h2, 267 | .error-container h6 { 268 | font-size: 20px; 269 | text-align: center; 270 | } 271 | .back-btn { 272 | text-align: center; 273 | } 274 | .error-container button { 275 | padding: 20px 30px; 276 | margin-top: 20px; 277 | border-radius: 20px; 278 | font-size: 20px; 279 | } 280 | .error-container nav ul { 281 | list-style: circle; 282 | } 283 | .error-container nav ul li { 284 | margin-bottom: 20px; 285 | } 286 | 287 | /* Media Queries */ 288 | @media (max-width: 400px) { 289 | .main-nav ul, .main-nav ul a { 290 | font-size: 12px; 291 | } 292 | } 293 | @media (max-width: 500px) { 294 | header { 295 | display: block; 296 | text-align: center; 297 | } 298 | .logo, 299 | .logo-text { 300 | margin-bottom: 20px; 301 | } 302 | } 303 | @media (max-width: 659px) { 304 | .product-list-item, 305 | .product-list-item:nth-child(2n), 306 | .product-list-item:nth-child(3n), 307 | .recommended-product, 308 | .recommended-product:nth-child(2n), 309 | .recommended-product:nth-child(3n) { 310 | margin-right: 20px; 311 | margin-left: 20px; 312 | } 313 | } 314 | @media (max-width: 639px) { 315 | .product-list-item, 316 | .product-list-item:nth-child(2n), 317 | .product-list-item:nth-child(3n), 318 | .recommended-product, 319 | .recommended-product:nth-child(2n), 320 | .recommended-product:nth-child(3n) { 321 | margin-right: 0px; 322 | margin-left: 0px; 323 | } 324 | } 325 | @media (max-width: 750px) { 326 | .product-details, 327 | .recommended-wrapper { 328 | display: block; 329 | text-align: center; 330 | } 331 | .product-image { 332 | margin-right: 0; 333 | } 334 | .recommended-image { 335 | max-width: 300px; 336 | width: 100%; 337 | } 338 | footer { 339 | display: block; 340 | text-align: center; 341 | } 342 | .footer-nav ul { 343 | display: block; 344 | margin-bottom: 20px; 345 | } 346 | .footer-nav ul li { 347 | display: block; 348 | margin: 0 0 10px; 349 | } 350 | } 351 | @media (min-width: 660px) and (max-width: 979px) { 352 | .product-list-item:nth-child(3n), 353 | .recommended-product:nth-child(3n) { 354 | margin-right: 20px; 355 | } 356 | .product-list-item:nth-child(2n), 357 | .recommended-product:nth-child(2n) { 358 | margin-right: 0; 359 | } 360 | .error-container { 361 | padding: 23px 58px; 362 | } 363 | } -------------------------------------------------------------------------------- /utils/async-handler.js: -------------------------------------------------------------------------------- 1 | const asyncHandler = (callback) => { 2 | return async (req, res, next) => { 3 | try { 4 | return await callback(req, res, next); 5 | } catch(err) { 6 | console.error(err); 7 | res.render("./error_handlers/error"); 8 | } 9 | } 10 | } 11 | 12 | module.exports = asyncHandler; -------------------------------------------------------------------------------- /views/error_handlers/404.pug: -------------------------------------------------------------------------------- 1 | extends ../layout.pug 2 | 3 | block body 4 | 5 | div.error-container 6 | h3 404 7 | h2 Sorry! 8 | h6 The page you are looking for was not found. 9 | div.back-btn 10 | a(href='/') 11 | button Go to the homepage -------------------------------------------------------------------------------- /views/error_handlers/error.pug: -------------------------------------------------------------------------------- 1 | extends ../layout.pug 2 | 3 | block body 4 | 5 | div.error-container 6 | h4 Something went wrong. 7 | nav 8 | ul 9 | li Please check your Prismic endpoint configuration in the config/prismic-config.js file. It might be incorrect. 10 | li Please check that your Custom Type API ID is correctly defined in the queries. 11 | li Check the console for errors. -------------------------------------------------------------------------------- /views/layout.pug: -------------------------------------------------------------------------------- 1 | doctype html(lang='en') 2 | 3 | head 4 | title Sample eCommerse Site 5 | link(rel="stylesheet", href="/stylesheets/reset.css") 6 | link(rel="stylesheet", href="/stylesheets/common.css") 7 | link(rel="stylesheet", href="/stylesheets/style.css") 8 | link(href='https://fonts.googleapis.com/css?family=Montserrat:400,700', rel='stylesheet') 9 | link(href='https://fonts.googleapis.com/css?family=Lato:400,700', rel='stylesheet') 10 | meta(name="viewport", content="width=device-width, initial-scale=1") 11 | script(src="//code.jquery.com/jquery-2.1.1.min.js") 12 | script#snipcart(src='https://cdn.snipcart.com/scripts/2.0/snipcart.js', data-api-key=ctx.snipcartKey, data-autopop="false") 13 | link(rel='stylesheet', href='https://cdn.snipcart.com/themes/2.0/base/snipcart.min.css', type='text/css') 14 | link(rel="stylesheet", href="/stylesheets/snipcart-style.css") 15 | script(src="/javascript/functions.js") 16 | 17 | // Required for Previews and Experiments 18 | script 19 | = ctx?"window.prismic = { endpoint: '" + ctx.endpoint + "' };":"" 20 | script(src="//static.cdn.prismic.io/prismic.min.js") 21 | 22 | 23 | body 24 | 25 | include ./partials/header.pug 26 | 27 | block body 28 | 29 | include ./partials/footer.pug 30 | 31 | script#cart-content-text(type='text/template'). 32 |
35 | -------------------------------------------------------------------------------- /views/listing.pug: -------------------------------------------------------------------------------- 1 | extends ./layout.pug 2 | 3 | block body 4 | 5 | div.product-list.container 6 | for product in products 7 | div.product-list-item 8 | a(href=ctx.linkResolver(product)) 9 | - var imageURL = product.data.image.Listing.url 10 | - var price = product.data.price 11 | 12 | img.product-list-image(src=imageURL) 13 | h3.product-list-title 14 | != PrismicDOM.RichText.asText(product.data.title) 15 | p.product-list-price 16 | != price ? "$" + price : '' -------------------------------------------------------------------------------- /views/partials/add-to-cart-button.pug: -------------------------------------------------------------------------------- 1 | - var itemID = productContent.uid 2 | - var itemName = productContent.data.title != "" ? PrismicDOM.RichText.asText(productContent.data.title) : "Unknown" 3 | - var itemImageURL = productContent.data.image.Snipcart.url 4 | - var itemWeight = productContent.data.snipcartWeight 5 | - var itemDescription = productContent.data.snipcartDescription 6 | - var itemMaxQuantity = productContent.data.snipcartMaxQuantity 7 | - var itemURL = pageUrl 8 | 9 | a.button.add-to-cart.snipcart-add-item(href="#" data-item-id=itemID, data-item-name=itemName, data-item-price=price, data-item-image=itemImageURL, data-item-weight=itemWeight, data-item-url=itemURL, data-item-description=itemDescription, data-item-max-quantity=itemMaxQuantity) Add To Cart -------------------------------------------------------------------------------- /views/partials/footer.pug: -------------------------------------------------------------------------------- 1 | footer 2 | div.footer-nav 3 | ul 4 | li 5 | a(href="#") About Us 6 | li 7 | a(href="#") Customer Service 8 | li 9 | a(href="#") Privacy Policy 10 | 11 | div.copywrite 12 | - var currentYear = new Date().getFullYear(); 13 | p !{"© " + currentYear + " UNKNOW"} -------------------------------------------------------------------------------- /views/partials/header.pug: -------------------------------------------------------------------------------- 1 | header 2 | - var logo = layoutContent ? layoutContent.data.logo.url : null 3 | a(href="/") 4 | if logo 5 | img.logo(src=logo) 6 | else 7 | span.logo-text SiteLogo 8 | 9 | div.utility-nav 10 | ul 11 | li 12 | a(href="#") Help 13 | |  |  14 | li 15 | a(href="#") Contact Us 16 | |  |  17 | li 18 | a(href="#" class="snipcart-checkout") 19 | div.shopping-cart 20 | div.snipcart-summary.cart-count 21 | span.snipcart-total-items.cart-count-number 22 | 23 | nav.main-nav 24 | div.added-to-cart 25 | if productContent 26 | p 27 | != productContent.data.title != "" ? PrismicDOM.RichText.asText(productContent.data.title) : "This product" 28 | | has been added to your cart! 29 | - var mainNav = layoutContent ? layoutContent.data.mainNav : [] 30 | ul 31 | li 32 | a(href="/") Everything 33 | each mainLink in mainNav 34 | - var mainURL = PrismicDOM.Link.url(mainLink.link, ctx.linkResolver) 35 | li 36 | a(href=mainURL) 37 | != mainLink.label -------------------------------------------------------------------------------- /views/product.pug: -------------------------------------------------------------------------------- 1 | extends ./layout.pug 2 | 3 | block body 4 | div.container.product-details 5 | - var imageURL = productContent.data.image.url 6 | - var price = productContent.data.price 7 | 8 | div.product-image 9 | img(src=imageURL) 10 | div.product-info 11 | != PrismicDOM.RichText.asHtml(productContent.data.title) 12 | p.product-price 13 | != price ? "$" + price : '' 14 | div.product-description 15 | != PrismicDOM.RichText.asHtml(productContent.data.description) 16 | 17 | include ./partials/add-to-cart-button.pug 18 | 19 | if relatedProducts.results_size > 0 20 | div.container.recommended 21 | h2 Recommended 22 | div.recommended-wrapper 23 | for relatedProduct in relatedProducts.results 24 | - var relatedImageURL = relatedProduct.data.image.Listing.url 25 | - var relatedPrice = relatedProduct.data.price 26 | 27 | div.recommended-product 28 | a(href=ctx.linkResolver(relatedProduct)) 29 | img.recommended-image(src=relatedImageURL) 30 | p.recommended-title 31 | != PrismicDOM.RichText.asText(relatedProduct.data.title) 32 | p.recommended-price 33 | != relatedPrice ? "$" + relatedPrice : '' --------------------------------------------------------------------------------